经过很多天的配置,终于能在工程中调用海康威视的网络摄像头了,为了后人能快速上手,我整理内容如下:
一、根据电脑的型号下载海康威视的SDK包
网址:http://www.hikvision.com/cn/download_61.html。
我的笔记本时linux64位的,所以下载的 ————设备网络SDK_Linux64
二、 用下面的方法之一配置SDK
如果HCNetSDKCom目录以及libhcnetsdk.so、libhpr.so、libHCCore文件和可执行文件在同一级目录下,则使用同级目录下的库文件;
如果不在同一级目录下,则需要将以上文件的目录加载到动态库搜索路径中,设置的方式有以下几种:
1. 将网络SDK各动态库路径加入到LD_LIBRARY_PATH环境变量
1.在终端输入:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX:/XXX/HCNetSDKCom 只在当前终端起作用
2. 修改~/.bashrc或~/.bash_profile,最后一行添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX:/XXX/HCNetSDKCom,保存之后,使用source .bashrc执行该文件 ,当前用户生效
3. 修改/etc/profile,添加内容如第2条,同样保存之后使用source执行该文件 所有用户生效
2.在/etc/ld.so.conf文件结尾添加网络sdk库的路径,如/XXX和/XXX/HCNetSDKCom/,保存之后,然后执行ldconfig。
三. 在Ubuntu16.04 的qt中新建一个工程
1. 在工程的 ×.pro文件中添加以下内容:
复制代码
2. 在main.cpp函数中添加以下内容:
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
67INCLUDEPATH += /usr/local/include /usr/local/include/opencv /usr/local/include/opencv2 LIBS += /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_ml.so.2.4.9 /usr/local/lib/libopencv_calib3d.so.2.4 /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_calib3d.so.2.4.9 /usr/local/lib/libopencv_nonfree.so.2.4 /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_nonfree.so.2.4.9 /usr/local/lib/libopencv_contrib.so.2.4 /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_contrib.so.2.4.9 /usr/local/lib/libopencv_objdetect.so.2.4 /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_objdetect.so.2.4.9 /usr/local/lib/libopencv_core.so.2.4 /usr/local/lib/libopencv_ocl.so /usr/local/lib/libopencv_core.so.2.4.9 /usr/local/lib/libopencv_ocl.so.2.4 /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_ocl.so.2.4.9 /usr/local/lib/libopencv_features2d.so.2.4 /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_features2d.so.2.4.9 /usr/local/lib/libopencv_photo.so.2.4 /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_photo.so.2.4.9 /usr/local/lib/libopencv_flann.so.2.4 /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_flann.so.2.4.9 /usr/local/lib/libopencv_stitching.so.2.4 /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_stitching.so.2.4.9 /usr/local/lib/libopencv_gpu.so.2.4 /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_gpu.so.2.4.9 /usr/local/lib/libopencv_superres.so.2.4 /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_superres.so.2.4.9 /usr/local/lib/libopencv_highgui.so.2.4 /usr/local/lib/libopencv_highgui.so.2.4.9 /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_video.so.2.4 /usr/local/lib/libopencv_imgproc.so.2.4 /usr/local/lib/libopencv_video.so.2.4.9 /usr/local/lib/libopencv_imgproc.so.2.4.9 /usr/local/lib/libopencv_videostab.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_videostab.so.2.4 /usr/local/lib/libopencv_legacy.so.2.4 /usr/local/lib/libopencv_videostab.so.2.4.9 /usr/local/lib/libopencv_legacy.so.2.4.9 /usr/local/lib/libopencv_ml.so INCLUDEPATH += /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/incCn LIBS += /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libhcnetsdk.so /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libHCCore.so /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libhpr.so /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libPlayCtrl.so /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libSuperRender.so /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libAudioRender.so
复制代码
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
241
242
243
244
245
246
247
248#include "opencv2/opencv.hpp" #include <QDir> #include <fstream> #include <unistd.h> //#include "auto_entercs.h" #include "HCNetSDK.h" #include "PlayM4.h" #include "LinuxPlayM4.h" #define HPR_ERROR -1 #define HPR_OK 0 #define USECOLOR 0 static cv::Mat dst; HWND h = NULL; LONG nPort=-1; LONG lUserID; pthread_mutex_t mutex; std::list<cv::Mat> g_frameList; FILE *g_pFile = NULL; void CALLBACK PsDataCallBack(LONG lRealHandle, DWORD dwDataType,BYTE *pPacketBuffer,DWORD nPacketSize, void* pUser) { if (dwDataType == NET_DVR_SYSHEAD) { //写入头数据 g_pFile = fopen("/home/lds/source/ps.dat", "wb"); if (g_pFile == NULL) { printf("CreateFileHead failn"); return; } //写入头数据 fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile); printf("write head len=%dn", nPacketSize); } else { if(g_pFile != NULL) { fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile); printf("write data len=%dn", nPacketSize); } } } //void CALLBACK DecCBFun(LONG nPort, char *pBuf, LONG nSize, FRAME_INFO *pFrameInfo, LONG nReserved1, LONG nReserved2) void CALLBACK DecCBFun(LONG nPort, char *pBuf, LONG nSize, FRAME_INFO *pFrameInfo, void* nReserved1, LONG nReserved2) { long lFrameType = pFrameInfo->nType; if (lFrameType == T_YV12) { //cv::Mat dst(pFrameInfo->nHeight, pFrameInfo->nWidth, // CV_8UC3); // 8UC3表示8bit uchar无符号类型,3通道值 dst.create(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3); cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (uchar *)pBuf); cv::cvtColor(src, dst, CV_YUV2BGR_YV12); pthread_mutex_lock(&mutex); g_frameList.push_back(dst); pthread_mutex_unlock(&mutex); } usleep(1000); //cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (uchar *)pBuf); //cv::cvtColor(src, dst, CV_YUV2BGR_YV12); //cv::imshow("bgr", dst); //pthread_mutex_lock(&mutex); //g_frameList.push_back(dst); //pthread_mutex_unlock(&mutex); //vw << dst; //cv::waitKey(10); } void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize,void* dwUser) { /* if (dwDataType == 1) { PlayM4_GetPort(&nPort); PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME); PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024); PlayM4_SetDecCallBackEx(nPort, DecCBFun, NULL, NULL); PlayM4_Play(nPort, h); } else { BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize); }*/ DWORD dRet; switch (dwDataType) { case NET_DVR_SYSHEAD: //系统头 if (!PlayM4_GetPort(&nPort)) //获取播放库未使用的通道号 { break; } if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME)) { dRet = PlayM4_GetLastError(nPort); break; } 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_SetDecCallBackEx(nPort, DecCBFun, NULL, NULL)) { dRet = PlayM4_GetLastError(nPort); break; } //打开视频解码 if (!PlayM4_Play(nPort, h)) { dRet = PlayM4_GetLastError(nPort); break; } //打开音频解码, 需要码流是复合流 if (!PlayM4_PlaySound(nPort)) { dRet = PlayM4_GetLastError(nPort); break; } } break; //usleep(500); case NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0 && nPort != -1) { BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize); while (!inData) { sleep(100); inData = PlayM4_InputData(nPort, pBuffer, dwBufSize); std::cerr << "PlayM4_InputData failed n" << std::endl; } } break; } } void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser) { char tempbuf[256] = {0}; std::cout << "EXCEPTION_RECONNECT = " << EXCEPTION_RECONNECT << std::endl; switch(dwType) { case EXCEPTION_RECONNECT: //预览时重连 printf("pyd----------reconnect--------%dn", time(NULL)); break; default: break; } } void *RunIPCameraInfo(void *) { char IP[] = "192.168.**.***"; //海康威视网络摄像头的ip char UName[] = "****"; //海康威视网络摄像头的用户名 char PSW[] = "*****"; //海康威视网络摄像头的密码 NET_DVR_Init(); NET_DVR_SetConnectTime(2000, 1); NET_DVR_SetReconnect(1000, true); NET_DVR_SetLogToFile(3, "./sdkLog"); NET_DVR_DEVICEINFO_V30 struDeviceInfo = {0}; NET_DVR_SetRecvTimeOut(5000); lUserID = NET_DVR_Login_V30(IP, 8000, UName, PSW, &struDeviceInfo); NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL); long lRealPlayHandle; NET_DVR_CLIENTINFO ClientInfo = {0}; ClientInfo.lChannel = 1; ClientInfo.lLinkMode = 0; ClientInfo.hPlayWnd = 0; ClientInfo.sMultiCastIP = NULL; //lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, PsDataCallBack, NULL, 0); lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, g_RealDataCallBack_V30, NULL, 0); //NET_DVR_SaveRealData(lRealPlayHandle, "/home/lds/source/yuntai.mp4"); if (lRealPlayHandle < 0) { printf("pyd1---NET_DVR_RealPlay_V30 errorn"); } sleep(-1); NET_DVR_Cleanup(); } int main(int argc, char *argv[]) { pthread_t getframe; pthread_mutex_init(&mutex, NULL); int ret; ret = pthread_create(&getframe, NULL, RunIPCameraInfo, NULL); if(ret!=0) { printf("Create pthread error!n"); } cv::Mat image; while(1) { pthread_mutex_lock(&mutex); if(g_frameList.size()) { std::list<cv::Mat>::iterator it; it = g_frameList.end(); it--; image = (*(it)); if (!image.empty()) { imshow("frame from camera",image); cv::waitKey(1); } g_frameList.pop_front(); } g_frameList.clear(); // 丢掉旧的帧 pthread_mutex_unlock(&mutex); } return 0; }
最后
以上就是背后大神最近收集整理的关于在Ubuntu下使用opencv调用海康威视的网络摄像头的全部内容,更多相关在Ubuntu下使用opencv调用海康威视内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复