windows下python调用海康威视网络摄像头sdk

2023-05-16

本文参考以下博文加自己的实践,发现有些步骤是不必要的,例如不需要为opencv等第三方库指定路径
运行环境:
准备工作
1、海康SDK下载
2、下载安装vcpkg
3、安装Swig
4、下载OpenCV-swig接口文件
实现方案
1. 使用swig编译生成python和c++数据交换需要的.py和.cxx文件
HKIPcamera.i
HKIPcamera.h
HKIPcamera.cpp
2. 修改海康SDK下的plaympeg4.h文件
3、用VS2019编译生成动态链接库文件
将该库给别人使用
本文参考以下博文加自己的实践,发现有些步骤是不必要的,例如不需要为opencv等第三方库指定路径
https://blog.csdn.net/c20081052/article/details/95082377
https://www.ryannn.com/archives/hikvision/comment-page-2#comments
https://blog.csdn.net/GottaYiWanLiu/article/details/106187962

运行环境:
Win10系统,64位,Anaconda3

python 3.7.9(基于anaconda环境)

vcpkg(boost,opencv3)

Visual Studio 2019

硬件:DS-2CD3T56DWD-I5

相机SDK: 设备网络SDK_V6.1.4.42(for Windows x64)

准备工作
1、海康SDK下载
下载地址:https://www.hikvision.com/cn/download_61.html

选择自己对应的系统平台版本,我这边选的是设备网络SDK_Win64 :CH-HCNetSDKV6.1.4.42_build20200527_win64

该文件夹下主要是头文件和库文件。

2、下载安装vcpkg
vcpkg如何安装请参考别的博客。安装完以后,命令行cd至vcpkg根目录,然后命令行输入

./vcpkg install boost:x64-windows
./vcpkg install opencv3:x64-windows
1
2
即可安装boost和opencv3。

3、安装Swig
Swig是用来封装库的,下载链接:http://www.swig.org/download.html

我安装的版本是swigwin-4.0.2:http://prdownloads.sourceforge.net/swig/swigwin-4.0.2.zip

然后将安装目录添加至环境变量path

4、下载OpenCV-swig接口文件
下载地址:https://github.com/renatoGarcia/opencv-swig

我们主要会用到其目录下lib文件夹中的文件opencv文件夹和opencv.i接口文件


实现方案
1. 使用swig编译生成python和c++数据交换需要的.py和.cxx文件
新建一个文件夹,例如HicVision_python_SDK文件夹。将下载的opencv-swig\lib下的opencv.i和opencv文件夹放入新建的HicVision_python_SDK文件夹中。

复制以下三个文件,到新建的HicVision_python_SDK文件夹中。注意代码中的字符串不要出现中文即可避免编码问题。

HKIPcamera.i
/*  Example of wrapping a C function that takes a C double array as input using
 *  numpy typemaps for SWIG. */
%module HKIPcamera
%include <opencv/mat.i>
%cv_mat__instantiate_defaults
%header %{
    /*  Includes the header in the wrapper code */
    #include "HKIPcamera.h"
%}
 
%include "HKIPcamera.h"
1
2
3
4
5
6
7
8
9
10
11
HKIPcamera.h
#include <opencv2/opencv.hpp>
using namespace cv;
 
void init(char* ip, char* usr, char* password);
Mat getframe();
void release();
1
2
3
4
5
6
HKIPcamera.cpp
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv2\opencv.hpp>
#include <iostream>
#include <time.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <windows.h>
#include "HCNetSDK.h"
#include "plaympeg4.h"
 
#define USECOLOR 1
 
using namespace cv;
using namespace std;
 
//--------------------------------------------
int iPicNum = 0;//Set channel NO.
LONG nPort = -1;
HWND hWnd = NULL;
CRITICAL_SECTION g_cs_frameList;
list<Mat> g_frameList;
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
HANDLE hThread;
LONG lRealPlayHandle = -1;
 
void yv12toYUV(char *outYuv, char *inYv12, int width, int height, int widthStep)
{
    int col, row;
    unsigned int Y, U, V;
    int tmp;
    int idx;
    for (row = 0; row < height; row++)
    {
        idx = row * widthStep;
        int rowptr = row * width;
 
        for (col = 0; col < width; col++)
        {
            tmp = (row / 2)*(width / 2) + (col / 2);
    
            Y = (unsigned int)inYv12[row*width + col];
            U = (unsigned int)inYv12[width*height + width * height / 4 + tmp];
            V = (unsigned int)inYv12[width*height + tmp];
 
            outYuv[idx + col * 3] = Y;
            outYuv[idx + col * 3 + 1] = U;
            outYuv[idx + col * 3 + 2] = V;
        }
    }
}
 
//解码回调 视频为YUV数据(YV12),音频为PCM数据
void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2)
{
    long lFrameType = pFrameInfo->nType;
 
    if (lFrameType == T_YV12)
    {
#if USECOLOR
        //int start = clock();
        static IplImage* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);//得到图像的Y分量  
        yv12toYUV(pImgYCrCb->imageData, pBuf, pFrameInfo->nWidth, pFrameInfo->nHeight, pImgYCrCb->widthStep);//得到全部RGB图像
        static IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);
        cvCvtColor(pImgYCrCb, pImg, CV_YCrCb2RGB);
        //int end = clock();
#else
        static IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 1);
        memcpy(pImg->imageData, pBuf, pFrameInfo->nWidth*pFrameInfo->nHeight);
#endif
 
        EnterCriticalSection(&g_cs_frameList);
        //g_frameList.push_back(pImg);
        g_frameList.push_back(cv::cvarrToMat(pImg));
        LeaveCriticalSection(&g_cs_frameList);
}
 
 
///实时流回调
void CALLBACK fRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser)
{
    DWORD dRet;
    switch (dwDataType)
    {
    case NET_DVR_SYSHEAD:    //系统头
        if (!PlayM4_GetPort(&nPort)) //获取播放库未使用的通道号
        {
            break;
        }
        if (dwBufSize > 0)
        {
            if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024))
            {
                dRet = PlayM4_GetLastError(nPort);
                break;
            }
            //设置解码回调函数 只解码不显示
            if (!PlayM4_SetDecCallBack(nPort, DecCBFun))
            {
                dRet = PlayM4_GetLastError(nPort);
                break;
            }
            //打开视频解码
            if (!PlayM4_Play(nPort, hWnd))
            {
                dRet = PlayM4_GetLastError(nPort);
                break;
            }
        }
        break;
 
    case NET_DVR_STREAMDATA:   //码流数据
        if (dwBufSize > 0 && nPort != -1)
        {
            BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);
            while (!inData)
            {
                Sleep(10);
                inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);
                OutputDebugString(L"PlayM4_InputData failed \n");
            }
        }
        break;
    }
}
 
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
    char tempbuf[256] = { 0 };
    switch (dwType)
    {
    case EXCEPTION_RECONNECT:    //预览时重连
        printf("----------reconnect--------%d\n", time(NULL));
        break;
    default:
        break;
    }
}
 
bool OpenCamera(char* ip, char* usr, char* password)
{
    lUserID = NET_DVR_Login_V30(ip, 8000, usr, password, &struDeviceInfo);
    if (lUserID == 0)
    {
        cout << "Log in success!" << endl;
        return TRUE;
    }
    else
    {
        printf("Login error, %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return FALSE;
    }
}
DWORD WINAPI ReadCamera(LPVOID IpParameter)
{
    //---------------------------------------
    //设置异常消息回调函数
    NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL);
 
    //cvNamedWindow("Mywindow", 0);
    //cvNamedWindow("IPCamera", 0);
 
    //HWND  h = (HWND)cvGetWindowHandle("Mywindow");
    //h = cvNamedWindow("IPCamera");
    //---------------------------------------
    //启动预览并设置回调数据流 
    NET_DVR_CLIENTINFO ClientInfo;
    ClientInfo.lChannel = 1;        //Channel number 设备通道号
    ClientInfo.hPlayWnd = NULL;     //窗口为空,设备SDK不解码只取流
    ClientInfo.lLinkMode = 1;       //Main Stream
    ClientInfo.sMultiCastIP = NULL;
 
    LONG lRealPlayHandle;
    lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, fRealDataCallBack, NULL, TRUE);
    if (lRealPlayHandle < 0)
    {
        printf("NET_DVR_RealPlay_V30 failed! Error number: %d\n", NET_DVR_GetLastError());
        return -1;
    }
    else
        cout << "Call NET_DVR_RealPlay_V30 successful!" << endl;
    Sleep(-1);
    if (!NET_DVR_StopRealPlay(lRealPlayHandle))
    {
        printf("NET_DVR_StopRealPlay error! Error number: %d\n", NET_DVR_GetLastError());
        return 0;
    }
    NET_DVR_Logout(lUserID);
    NET_DVR_Cleanup();
    return 0;
}
 
 
void init(char* ip, char* usr, char* password) {
    //HANDLE hThread;
    //LPDWORD threadID;
    //---------------------------------------
    // 初始化
    NET_DVR_Init();
    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);
    OpenCamera(ip, usr, password);
    InitializeCriticalSection(&g_cs_frameList);
    hThread = ::CreateThread(NULL, 0, ReadCamera, NULL, 0, 0);
}
 
Mat getframe() {
    Mat frame1;
    EnterCriticalSection(&g_cs_frameList);
    while (!g_frameList.size()) {
        LeaveCriticalSection(&g_cs_frameList);
        EnterCriticalSection(&g_cs_frameList);
    }
    list<Mat>::iterator it;
    it = g_frameList.end();
    it--;
    Mat dbgframe = (*(it));
    (*g_frameList.begin()).copyTo(frame1);
    frame1 = dbgframe;
    g_frameList.pop_front();
    //imshow("camera", frame1);
    //waitKey(1);
 
    g_frameList.clear();   // 丢掉旧的帧
    LeaveCriticalSection(&g_cs_frameList);
    return(frame1);
}
 
void release() {
    ::CloseHandle(hThread);
    NET_DVR_StopRealPlay(lRealPlayHandle);
    //关闭预览
    NET_DVR_Logout(lUserID);
    //注销用户
    NET_DVR_Cleanup();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240


这样HicVision_python_SDK文件夹下就拥有上图红框的所有文件了。然后使用cmd或者powershell,cd到这个路径,执行

swig -ID:\vcpkg\installed\x64-windows\include -python -c++ HKIPcamera.i
1
注意将其中的D:\vcpkg修改为自己的vcpkg安装目录。

执行之后将在该目录生成HKIPcamera.py和HKIPcamera_wrap.cxx。


2. 修改海康SDK下的plaympeg4.h文件
这里直接参考https://blog.csdn.net/c20081052/article/details/95082377所描述即可:


3、用VS2019编译生成动态链接库文件
首先创建空C++项目,并且项目命名为HKIPcamera


然后将之前文件夹下的三个文件放入项目中:

修改上面的编译选项为Release和x64

右键项目属性,切换选项卡为Release和x64,修改配置类型为动态库(.dll)

项目下添加3rdparty文件夹,在里面添加海康威视sdk的头文件和库文件:


取消安全周期检查:


VC++目录->包含目录中添加如下头文件路径(修改python目录到你自己的):
注意使用了vcpkg之后,就不需要添加使用vcpkg安装的opencv等库的头文件和.lib了。

3rdparty\include
D:\ProgramData\Anaconda3\envs\dust37\Lib\site-packages\numpy\core\include
D:\ProgramData\Anaconda3\envs\dust37\include
1
2
3


VC++目录->库目录中添加如下库的路径:(修改python目录到你自己的)

D:\ProgramData\Anaconda3\envs\dust37\libs
3rdparty\lib
3rdparty\lib\HCNetSDKCom
1
2
3


预处理器->预处理器定义中内容如下:

WIN32
NDEBUG
_CONSULE
_CRT_SECURE_NO_WARNINGS
1
2
3
4


链接器->输入->附加依赖项中添加:
HCNetSDK.lib
GdiPlus.lib
HCAlarm.lib
HCCore.lib
HCGeneralCfgMgr.lib
HCPreview.lib
PlayCtrl.lib

注意使用了vcpkg之后,就不需要添加使用vcpkg安装的opencv等库的头文件和.lib了。
完成以上步骤后,右键工程项目名选择生成,之后会在工程x64文件夹下的Release文件夹下生成.dll和.lib文件如下(红色)


复制一份 HKIPcamera.dll 文件并重命名为 _HKIPcamera.pyd到该目录下,并将海康SDK中的3rdparty\lib下的库文件都复制到该目录),以及将上文中用swig生成的HKIPcamera.py 也复制过来(如上图蓝色)
最后编写了个test.py也放在上图目录下,其内容如下(主要用来检测是否编译成功了):

import HKIPcamera
import time
import numpy as np
import matplotlib.pyplot as plt
import cv2
 
 
ip = str('10.167.93.111')  # 摄像头IP地址,要和本机IP在同一局域网
name = str('admin')       # 管理员用户名
pw = str('abcd1234')        # 管理员密码
HKIPcamera.init(ip, name, pw)
# HKIPcamera.getfram()
#for i in range(100):
while(True):
    t = time.time()
    fram = HKIPcamera.getframe()
    t2 = time.time()
    cv2.imshow('123', np.array(fram))
    cv2.waitKey(1)
    print(t2-t)
    time.sleep(0.1)
HKIPcamera.release()
time.sleep(5)
HKIPcamera.init(ip, name, pw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
在anaconda的prompt控制台下运行该test.py,会看到python调用SDK的实时画面,其延迟性同网页预览版差不多。但比rtsp流读取的效果好很多~

至此成功!

将该库给别人使用
经过测试,该库给别人使用的唯一条件是目标计算机使用的python版本需要与编译时的python版本完全一致,而不需要在指定目录下安装opencv等库。

因此放上我个人编译的版本。注意需要使用Python 3.7.9运行。运行时修改test.py中的8-10行为你自己的ip,name和pd

ip = str('10.167.93.111')  # 摄像头IP地址,要和本机IP在同一局域网
name = str('admin')       # 管理员用户名
pw = str('abcd1234')        # 管理员密码
1
2
3
然后使用

python test.py
1
即可运行。
————————————————
版权声明:本文为CSDN博主「张小小恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ylzf2008/article/details/109247587

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows下python调用海康威视网络摄像头sdk 的相关文章

  • 从 torch.autograd.gradcheck 导入 zero_gradients

    我想复制代码here https github com LTS4 DeepFool blob master Python deepfool py 并且我在 Google Colab 中运行时收到以下错误 ImportError 无法导入名称
  • GUI 测试工具 PyUseCase 与 Dogtail 相比如何?

    GUI测试工具如何Py用例 http pypi python org pypi PyUseCase重命名为故事文本 http pypi python org pypi StoryText 相比于Dogtail http en wikiped
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • Scrapy 文件管道不下载文件

    我的任务是构建一个可以下载所有内容的网络爬虫 pdfs 在给定站点中 Spider 在本地计算机和抓取集线器上运行 由于某种原因 当我运行它时 它只下载一些但不是全部的 pdf 通过查看输出中的项目可以看出这一点JSON 我已经设定MEDI
  • 将整数系列转换为交替(双元)二进制系列

    我不知道如何最好地表达这个问题 因为在这里谷歌搜索和搜索总是让我找到更复杂的东西 我很确定这是基本的东西 但对于我的生活来说 我找不到一个好的方法来做到这一点下列 给定一个整数序列 比如说 for x in range 0 36 我想将这些
  • Python 内置对象的 __enter__() 和 __exit__() 在哪里定义?

    我读到每次使用 with 时都会调用该对象的 enter 和 exit 方法 我知道对于用户定义的对象 您可以自己定义这些方法 但我不明白这对于 打开 等内置对象 函数甚至测试用例是如何工作的 这段代码按预期工作 我假设它使用 exit 关
  • 了解 Python 2.7 中的缩进错误

    在编写 python 代码时 我往往会遇到很多缩进错误 有时 当我删除并重写该行时 错误就会消失 有人可以为菜鸟提供 python 中 IndentationErrors 的高级解释吗 以下是我在玩 CheckIO 时收到的最近 inden
  • 如何从 python 脚本执行 7zip 命令

    我试图了解如何使用 os system 模块来执行 7zip 命令 现在我不想用 Popen 或 subprocess 让事情变得复杂 我已经安装了 7zip 并将 7zip exe 复制到我的用户文件夹中 我只想提取我的测试文件 inst
  • Python 在哪些系统上不使用 IEEE-754 双精度浮点数

    Python 对 IEEE 754 浮点运算进行了各种引用 但不保证1 https docs python org 3 tutorial floatingpoint html 2 https pythondev readthedocs io
  • TRACKER:错误TRK0005:无法找到:“CL.exe”。该系统找不到指定的文件

    我尝试在 Windows 8 上的 Node js 项目中执行以下命令 npm 安装 电子邮件受保护 cdn cgi l email protection 但我收到一个错误 我不知道如何处理 TRACKER 错误TRK0005 无法找到 C
  • 将 OpenBLAS 链接到 MinGW

    我正在尝试链接OpenBLAS https www openblas net 图书馆与明GW w64 https mingw w64 org Windows 上的编译器 这是我的代码 include
  • Eclipse/PyDev 中未使用导入警告,尽管已使用

    我正在我的文件中导入一个绘图包 如下所示 import matplotlib pyplot as plt 稍后我会在我的代码中成功使用此导入 fig plt figure figsize 16 10 然而 Eclipse 告诉我 未使用的导
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 如何在引发异常时将变量传递给异常并在异常时检索它?

    现在我只有一个空白的异常类 我想知道如何在引发变量时给它一个变量 然后在 try except 中处理它时检索该变量 class ExampleException Exception pass 为其构造函数提供一个参数 将其存储为属性 然后
  • 类返回语句不打印任何输出

    我正在学习课程 但遇到了问题return语句 它是语句吗 我希望如此 程序什么也没有打印出来 它只是结束而不做任何事情 class className def createName self name self name name def
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 如何将两列 pandas Dataframe 移动并堆叠为一列?

    我有一个下面提到的数据框 ETHNIC SEX USUBJID 0 HISPANIC OR LATINO F 16 1 HISPANIC OR LATINO M 8 2 HISPANIC OR LATINO Total 24 3 NOT H
  • 如何有效地比较 pandas DataFrame 中的行?

    我有一个 pandas 数据框 其中包含雷击记录以及时间戳和全球位置 格式如下 Index Date Time Lat Lon Good fix 0 1 20160101 00 00 00 9962692 7 1961 60 7604 1
  • Tkinter 将鼠标点击绑定到框架

    我一定错过了一些明显的东西 我的 Tkinter 程序中有两个框架 每个框架在网格布局中都有一堆标签 我想将鼠标点击绑定到其中一个而不是另一个 我目前使用 root bind

随机推荐

  • Git -- 子模块

    子模块 如果想直接上手操作 xff0c 可以只看 适用场景 定义 快速使用 小节 否则看这篇文章或者 原文 都可以 文章目录 子模块适用场景定义快速使用添加子模块同步本地到远程克隆带有子模块的仓库分支操作同步远程到本地 相关命令信息补充遇到
  • 神经网络的参数为什么需要它的值很小,且变化范围小

    Tips xff1a 只不过是本人的感觉 xff0c 未经过试验验证 xff0c 同样也没有任何依据 值小的话在计算上基本不会出现上溢出由于目前在深度学习中数据都是用多维表示 xff0c 比如词向量的维度就有128 256维或者更高 xff
  • java:N的N次方

    题目描述 现给你一个正整数N xff0c 请问N N的最左边的数字是什么 xff1f 输入格式 输入包含多组测试数据 每组输入一个正整数N xff08 N lt 61 1000000 xff09 输出 对于每组输入 xff0c 输出N N的
  • ACM:入口的选择------深度优先搜索

    入口的选择 Time Limit 1000MS Memory Limit 32768K Description Zeism玩的赛车游戏中 xff0c 有一种树形的赛道 树根表示赛道的终点 xff0c 任何一个叶子结点表示一个赛道的入口 xf
  • 在服务端没接显示器的情况下,nomachine远程连接客户端看到的是黑屏的问题

    这里遇到一个问题 xff0c 在服务端没接显示器的情况下 xff0c nomachine远程连接客户端看到的是黑屏 xff08 我这里服务器是ubuntu18 04 xff09 参考链接 xff1a https blog csdn net
  • ACM:n!的位数 :斯特林公式

    n 的位数 Time Limit 2000MS Memory Limit 65536K Description 针对每个非负整数n xff0c 计算其n 的位数 Input 输入数据中含有一些整数n xff08 0 n xff1c 10 7
  • java 自定义封装jdbc dao类

    手动封装jdbc和dao层 xff0c 体会其中的优点与不足 注 xff1a 本次采用的mysql数据库记得添加数据库的驱动包 Dbhelper类 xff1a 对jdbc进行封装 xff0c 采用单例模式 xff0c 不用每次都去连接数据库
  • Mybatis 二级缓存

    mybatis的缓存分为一级缓存和二级缓存 xff0c 缓存是用来缓存部分经常性访问的数据 xff0c 而不必每一次都跑到数据库获取或运算 xff0c 目标是提高系统的性能 一级缓存 对于每一个sqlSession 其中有一个HashMap
  • win10系统下CUDA示例项目编译出错MSB3721解决

    在win10系统下安装好cuda9 1后 xff0c 在VS2017中打开cuda corporation中的项目 xff0c 编译发现一直报错MSB3721 xff0c 无法导入windows h文件 xff0c 错误提示如下 xff1a
  • Wi-Fi放大器、中继、桥接和mesh组网的理解

    前言 针对路由器其实有很多的知识可以去学习 xff0c 包括路由器的路由功能 Wi Fi放大功能 中继 桥接和近几年才流行的mesh组网功能 xff0c 下面我将针对这几个功能说说我自己的通过相关资料的学习形成自己的一些理解 xff0c 强
  • MAC下虚拟机PD转换成win上可以用的vmware

    最近是需要mac机子转windows xff0c 然后之前在mac上面安装的虚拟机Ubuntu需要移到window上面使用 xff0c mac上面是使用Parallel Desktop安装的虚拟机 xff0c 在windows上面使用的是V
  • Openresty之实现http访问请求

    如果是第一次看这个文章 xff0c 可以先看下这篇openresty介绍性的文章 xff1a Openresty概述介绍 在openresty里面可能有访问其他服务的需求 xff0c 我们当时是需要定时去另外一个服务拉取一些配置信息 xff
  • 服务器系统缓存问题总结

    做后端的同学都知道缓存 xff0c 而且越是大的访问量的后端服务 xff0c 缓存的作用越是重要 最近看了些大佬的解说 xff0c 觉得说的很好 xff0c 在此将我理解的记录下来 xff0c 下面总结下后端缓存的一些知识点 顾名思义 xf
  • fwknop的安装和使用测试

    SPA名为单包授权 xff0c 是一种认证方法 xff0c 它是一种端口敲门的方法 xff0c 是之前早起端口敲门的升级版本 目的是为了隐藏服务端口 xff0c 防止DOS等其他网络攻击 xff0c 保证服务端的安全 SPA的具体定义这里不
  • win7连接共享“请检查名称的拼写.否则网络可能有问题”

    我他妈也是这个问题 xff0c 折腾了我好多天 xff0c 我的win7电脑突然就不能连接FTP的服务器 xff0c 然后我虚拟机的samba共享也连接不上 xff0c 终于找到解决办法 xff0c 别人的电脑没事 xff0c 就我的电脑有
  • Intel RealSense D435i + BundleFusion 实现实时三维建图

    内容概览 摘要操作环境RealSense D435i 介绍BundleFusion工程环境配置安装 RealSense SDKRealSense SDK 本地环境配置BundleFusion 工程属性表相机类型设置修改 GlobalAppS
  • CrazePony与计算机视觉

    大家好 我是CrazePony的视觉攻城狮 Ziv Lin 我擅长的部分是计算机视觉和嵌入式编程 非常荣幸地能够加入CrazePony团队 众所周知 一个飞行器想要做到悬停的话 xff0c 必须引入一个位置环进行反馈 xff0c 也就是说需
  • Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿

    来这里找解决方案的童鞋 xff0c 如果你的机器还没过保 果断去找官修 xff0c 忽略这篇文章 xff01 心急的童鞋直接看目录 xff0c 有传送门 xff01 但是仔细看文章可能有奇效 xff01 最近博客更新进度严重滞后 因为我遭遇
  • linux环境打包python工程为可执行程序

    本次又个需求 xff0c 在ubuntu上面开发的python代码程序需要打包成一个可执行程序然后交付给甲方 xff0c 因为不能直接给源码给甲方 xff0c 所以寻找方法将python开发的源码打包成一个可执行程序 xff0c 注意是打包
  • windows下python调用海康威视网络摄像头sdk

    本文参考以下博文加自己的实践 xff0c 发现有些步骤是不必要的 xff0c 例如不需要为opencv等第三方库指定路径 运行环境 xff1a 准备工作 1 海康SDK下载 2 下载安装vcpkg 3 安装Swig 4 下载OpenCV s