生活随笔
收集整理的這篇文章主要介紹了
ubuntu 通过 海康sdk调用摄像头抓图片
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://blog.csdn.net/ding977921830/article/details/75272384
在本文中我的電腦是使用的Ubuntu16.04 64位,使用工具是QT5.7.1,opencv2.4.9.
一、根據電腦的型號下載海康威視的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文件中添加以下內容:
[plain]?view plaincopy
INCLUDEPATH?+=?/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??
2. 在main.cpp函數中添加以下內容:
[cpp]?view plaincopy
#include?"opencv2/opencv.hpp"????#include?<QDir>??#include?<fstream>??#include?<unistd.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?fail\n");?????????????return;?????????}????????????????????fwrite(pPacketBuffer,?sizeof(unsigned?char),?nPacketSize,?g_pFile);?????????printf("write?head?len=%d\n",?nPacketSize);?????}?????else?????{?????????if(g_pFile?!=?NULL)?????????{?????????????fwrite(pPacketBuffer,?sizeof(unsigned?char),?nPacketSize,?g_pFile);?????????????printf("write?data?len=%d\n",?nPacketSize);?????????}?????}????}??????void?CALLBACK?DecCBFun(LONG?nPort,?char?*pBuf,?LONG?nSize,?FRAME_INFO?*pFrameInfo,?void*?nReserved1,?LONG?nReserved2)??{?????long?lFrameType?=?pFrameInfo->nType;?????????if?(lFrameType?==?T_YV12)???????{?????????????????????????????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);??????????????????????????????????????????????}????void?CALLBACK?g_RealDataCallBack_V30(LONG?lRealHandle,?DWORD?dwDataType,?BYTE?*pBuffer,?DWORD?dwBufSize,void*?dwUser)??{??????????????????????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_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;????????????????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--------%d\n",?time(NULL));?????????break;?????default:?????????break;?????}??}????void?*RunIPCameraInfo(void?*)??{?????char?IP[]?????????=?"192.168.**.***";????????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,?g_RealDataCallBack_V30,?NULL,?0);??????????if?(lRealPlayHandle?<?0)?????{?????????printf("pyd1---NET_DVR_RealPlay_V30?error\n");?????}?????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 通过 海康sdk调用摄像头抓图片的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。