在Ubuntu下使用opencv调用海康威视的网络摄像头

转载  http://blog.csdn.net/ding977921830/article/details/75272384

在Ubuntu下使用opencv调用海康威视的网络摄像头

经过很多天的配置,终于能在工程中调用海康威视的网络摄像头了,为了后人能快速上手,我整理内容如下:


在本文中我的电脑是使用的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 plain  copy
  1. INCLUDEPATH += /usr/local/include \  
  2. /usr/local/include/opencv \  
  3. /usr/local/include/opencv2  
  4.   
  5. LIBS += /usr/local/lib/libopencv_calib3d.so\  
  6.         /usr/local/lib/libopencv_ml.so.2.4.9\  
  7.         /usr/local/lib/libopencv_calib3d.so.2.4 \  
  8.         /usr/local/lib/libopencv_nonfree.so\  
  9.         /usr/local/lib/libopencv_calib3d.so.2.4.9  \  
  10.         /usr/local/lib/libopencv_nonfree.so.2.4\  
  11.         /usr/local/lib/libopencv_contrib.so    \  
  12.         /usr/local/lib/libopencv_nonfree.so.2.4.9\  
  13.         /usr/local/lib/libopencv_contrib.so.2.4    \  
  14.         /usr/local/lib/libopencv_objdetect.so\  
  15.         /usr/local/lib/libopencv_contrib.so.2.4.9 \  
  16.         /usr/local/lib/libopencv_objdetect.so.2.4\  
  17.         /usr/local/lib/libopencv_core.so\  
  18.         /usr/local/lib/libopencv_objdetect.so.2.4.9\  
  19.         /usr/local/lib/libopencv_core.so.2.4 \  
  20.         /usr/local/lib/libopencv_ocl.so\  
  21.         /usr/local/lib/libopencv_core.so.2.4.9 \  
  22.         /usr/local/lib/libopencv_ocl.so.2.4\  
  23.         /usr/local/lib/libopencv_features2d.so \  
  24.         /usr/local/lib/libopencv_ocl.so.2.4.9\  
  25.         /usr/local/lib/libopencv_features2d.so.2.4  \  
  26.         /usr/local/lib/libopencv_photo.so\  
  27.         /usr/local/lib/libopencv_features2d.so.2.4.9 \  
  28.         /usr/local/lib/libopencv_photo.so.2.4\  
  29.         /usr/local/lib/libopencv_flann.so  \  
  30.         /usr/local/lib/libopencv_photo.so.2.4.9\  
  31.         /usr/local/lib/libopencv_flann.so.2.4   \  
  32.         /usr/local/lib/libopencv_stitching.so\  
  33.         /usr/local/lib/libopencv_flann.so.2.4.9  \  
  34.         /usr/local/lib/libopencv_stitching.so.2.4\  
  35.         /usr/local/lib/libopencv_gpu.so     \  
  36.         /usr/local/lib/libopencv_stitching.so.2.4.9\  
  37.         /usr/local/lib/libopencv_gpu.so.2.4   \  
  38.         /usr/local/lib/libopencv_superres.so\  
  39.         /usr/local/lib/libopencv_gpu.so.2.4.9 \  
  40.         /usr/local/lib/libopencv_superres.so.2.4\  
  41.         /usr/local/lib/libopencv_highgui.so   \  
  42.         /usr/local/lib/libopencv_superres.so.2.4.9\  
  43.         /usr/local/lib/libopencv_highgui.so.2.4   \  
  44.         /usr/local/lib/libopencv_highgui.so.2.4.9 \  
  45.         /usr/local/lib/libopencv_video.so\  
  46.         /usr/local/lib/libopencv_imgproc.so  \  
  47.         /usr/local/lib/libopencv_video.so.2.4\  
  48.         /usr/local/lib/libopencv_imgproc.so.2.4 \  
  49.         /usr/local/lib/libopencv_video.so.2.4.9\  
  50.         /usr/local/lib/libopencv_imgproc.so.2.4.9\  
  51.         /usr/local/lib/libopencv_videostab.so\  
  52.         /usr/local/lib/libopencv_legacy.so \  
  53.         /usr/local/lib/libopencv_videostab.so.2.4\  
  54.         /usr/local/lib/libopencv_legacy.so.2.4  \  
  55.         /usr/local/lib/libopencv_videostab.so.2.4.9\  
  56.         /usr/local/lib/libopencv_legacy.so.2.4.9  \  
  57.         /usr/local/lib/libopencv_ml.so  
  58.   
  59. INCLUDEPATH += /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/incCn  
  60.   
  61.   
  62. LIBS += /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libhcnetsdk.so\  
  63.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libHCCore.so\  
  64.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libhpr.so\  
  65.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libPlayCtrl.so\  
  66.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libSuperRender.so\  
  67.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libAudioRender.so  
2. 在main.cpp函数中添加以下内容:

[cpp]  view plain  copy
  1. #include "opencv2/opencv.hpp"  
  2.   
  3. #include <QDir>  
  4. #include <fstream>  
  5. #include <unistd.h>  
  6. //#include "auto_entercs.h"  
  7.   
  8. #include "HCNetSDK.h"  
  9. #include "PlayM4.h"  
  10. #include "LinuxPlayM4.h"  
  11.   
  12. #define HPR_ERROR       -1  
  13. #define HPR_OK               0  
  14. #define USECOLOR          0  
  15.   
  16. static cv::Mat dst;  
  17. HWND h = NULL;  
  18. LONG nPort=-1;  
  19. LONG lUserID;  
  20.   
  21. pthread_mutex_t mutex;  
  22. std::list<cv::Mat> g_frameList;  
  23.   
  24.   
  25. FILE *g_pFile = NULL;  
  26.   
  27. void CALLBACK PsDataCallBack(LONG lRealHandle, DWORD dwDataType,BYTE *pPacketBuffer,DWORD nPacketSize, void* pUser)  
  28. {  
  29.   
  30.    if (dwDataType  == NET_DVR_SYSHEAD)  
  31.    {  
  32.        //写入头数据  
  33.        g_pFile = fopen("/home/lds/source/ps.dat""wb");  
  34.   
  35.        if (g_pFile == NULL)  
  36.        {  
  37.            printf("CreateFileHead fail\n");  
  38.            return;  
  39.        }  
  40.   
  41.        //写入头数据  
  42.        fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile);  
  43.        printf("write head len=%d\n", nPacketSize);  
  44.    }  
  45.    else  
  46.    {  
  47.        if(g_pFile != NULL)  
  48.        {  
  49.            fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile);  
  50.            printf("write data len=%d\n", nPacketSize);  
  51.        }  
  52.    }  
  53.   
  54. }  
  55.   
  56. //void CALLBACK DecCBFun(LONG nPort, char *pBuf, LONG nSize, FRAME_INFO *pFrameInfo, LONG nReserved1, LONG nReserved2)  
  57. void CALLBACK DecCBFun(LONG nPort, char *pBuf, LONG nSize, FRAME_INFO *pFrameInfo, void* nReserved1, LONG nReserved2)  
  58. {  
  59.    long lFrameType = pFrameInfo->nType;  
  60.   
  61.      if (lFrameType == T_YV12)  
  62.      {  
  63.       //cv::Mat dst(pFrameInfo->nHeight, pFrameInfo->nWidth,  
  64.       //            CV_8UC3);  // 8UC3表示8bit uchar无符号类型,3通道值  
  65.            dst.create(pFrameInfo->nHeight, pFrameInfo->nWidth,  
  66.                  CV_8UC3);  
  67.   
  68.            cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (uchar *)pBuf);  
  69.            cv::cvtColor(src, dst, CV_YUV2BGR_YV12);  
  70.            pthread_mutex_lock(&mutex);  
  71.            g_frameList.push_back(dst);  
  72.            pthread_mutex_unlock(&mutex);  
  73.      }  
  74.     usleep(1000);  
  75.   
  76.    //cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (uchar *)pBuf);  
  77.    //cv::cvtColor(src, dst, CV_YUV2BGR_YV12);  
  78.    //cv::imshow("bgr", dst);  
  79.    //pthread_mutex_lock(&mutex);  
  80.    //g_frameList.push_back(dst);  
  81.    //pthread_mutex_unlock(&mutex);  
  82.    //vw << dst;  
  83.    //cv::waitKey(10);  
  84.   
  85. }  
  86.   
  87. void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize,void* dwUser)  
  88. {  
  89.    /* 
  90.    if (dwDataType == 1) 
  91.    { 
  92.        PlayM4_GetPort(&nPort); 
  93.        PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME); 
  94.        PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024); 
  95.        PlayM4_SetDecCallBackEx(nPort, DecCBFun, NULL, NULL); 
  96.        PlayM4_Play(nPort, h); 
  97.    } 
  98.    else 
  99.    { 
  100.        BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize); 
  101.    }*/  
  102.    DWORD dRet;  
  103.    switch (dwDataType)  
  104.    {  
  105.      case NET_DVR_SYSHEAD:           //系统头  
  106.        if (!PlayM4_GetPort(&nPort))  //获取播放库未使用的通道号  
  107.        {  
  108.          break;  
  109.        }  
  110.        if (dwBufSize > 0) {  
  111.          if (!PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME)) {  
  112.            dRet = PlayM4_GetLastError(nPort);  
  113.            break;  
  114.          }  
  115.          if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024)) {  
  116.            dRet = PlayM4_GetLastError(nPort);  
  117.            break;  
  118.          }  
  119.          //设置解码回调函数 只解码不显示  
  120.         //  if (!PlayM4_SetDecCallBack(nPort, DecCBFun)) {  
  121.         //     dRet = PlayM4_GetLastError(nPort);  
  122.         //     break;  
  123.         //  }  
  124.   
  125.          //设置解码回调函数 解码且显示  
  126.          if (!PlayM4_SetDecCallBackEx(nPort, DecCBFun, NULL, NULL))  
  127.          {  
  128.            dRet = PlayM4_GetLastError(nPort);  
  129.            break;  
  130.          }  
  131.   
  132.          //打开视频解码  
  133.          if (!PlayM4_Play(nPort, h))  
  134.          {  
  135.            dRet = PlayM4_GetLastError(nPort);  
  136.            break;  
  137.          }  
  138.   
  139.          //打开音频解码, 需要码流是复合流  
  140.          if (!PlayM4_PlaySound(nPort)) {  
  141.            dRet = PlayM4_GetLastError(nPort);  
  142.            break;  
  143.          }  
  144.        }  
  145.        break;  
  146.        //usleep(500);  
  147.      case NET_DVR_STREAMDATA:  //码流数据  
  148.        if (dwBufSize > 0 && nPort != -1) {  
  149.          BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);  
  150.          while (!inData) {  
  151.            sleep(100);  
  152.            inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);  
  153.            std::cerr << "PlayM4_InputData failed \n" << std::endl;  
  154.          }  
  155.        }  
  156.        break;  
  157.    }  
  158. }  
  159.   
  160. void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)  
  161. {  
  162.    char tempbuf[256] = {0};  
  163.    std::cout << "EXCEPTION_RECONNECT = " << EXCEPTION_RECONNECT << std::endl;  
  164.    switch(dwType)  
  165.    {  
  166.    case EXCEPTION_RECONNECT:    //预览时重连  
  167.        printf("pyd----------reconnect--------%d\n", time(NULL));  
  168.        break;  
  169.    default:  
  170.        break;  
  171.    }  
  172. }  
  173.   
  174. void *RunIPCameraInfo(void *)  
  175. {  
  176.    char IP[]         = "192.168.**.***";   //海康威视网络摄像头的ip  
  177.    char UName[] = "****";                 //海康威视网络摄像头的用户名  
  178.    char PSW[]      = "*****";           //海康威视网络摄像头的密码  
  179.    NET_DVR_Init();  
  180.    NET_DVR_SetConnectTime(2000, 1);  
  181.    NET_DVR_SetReconnect(1000, true);  
  182.    NET_DVR_SetLogToFile(3, "./sdkLog");  
  183.    NET_DVR_DEVICEINFO_V30 struDeviceInfo = {0};  
  184.    NET_DVR_SetRecvTimeOut(5000);  
  185.    lUserID = NET_DVR_Login_V30(IP, 8000, UName, PSW, &struDeviceInfo);  
  186.   
  187.    NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL);  
  188.   
  189.    long lRealPlayHandle;  
  190.    NET_DVR_CLIENTINFO ClientInfo = {0};  
  191.   
  192.    ClientInfo.lChannel       = 1;  
  193.    ClientInfo.lLinkMode     = 0;  
  194.    ClientInfo.hPlayWnd     = 0;  
  195.    ClientInfo.sMultiCastIP = NULL;  
  196.   
  197.   
  198.    //lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, PsDataCallBack, NULL, 0);  
  199.    lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, g_RealDataCallBack_V30, NULL, 0);  
  200.    //NET_DVR_SaveRealData(lRealPlayHandle, "/home/lds/source/yuntai.mp4");  
  201.    if (lRealPlayHandle < 0)  
  202.    {  
  203.        printf("pyd1---NET_DVR_RealPlay_V30 error\n");  
  204.    }  
  205.    sleep(-1);  
  206.   
  207.    NET_DVR_Cleanup();  
  208. }  
  209.   
  210. int main(int argc, char *argv[])  
  211. {  
  212.   
  213.    pthread_t getframe;  
  214.   
  215.    pthread_mutex_init(&mutex, NULL);  
  216.    int ret;  
  217.   
  218.    ret = pthread_create(&getframe, NULL, RunIPCameraInfo, NULL);  
  219.   
  220.   
  221.    if(ret!=0)  
  222.    {  
  223.        printf("Create pthread error!\n");  
  224.    }  
  225.   
  226.    cv::Mat image;  
  227.    while(1)  
  228.    {  
  229.        pthread_mutex_lock(&mutex);  
  230.        if(g_frameList.size())  
  231.        {  
  232.            std::list<cv::Mat>::iterator it;  
  233.            it = g_frameList.end();  
  234.            it--;  
  235.            image = (*(it));  
  236.            if (!image.empty())  
  237.            {  
  238.                imshow("frame from camera",image);  
  239.                cv::waitKey(1);  
  240.            }  
  241.            g_frameList.pop_front();  
  242.        }  
  243.        g_frameList.clear(); // 丢掉旧的帧  
  244.        pthread_mutex_unlock(&mutex);  
  245.    }  
  246.   
  247.    return 0;  
  248. }  


        这个代码还是不错的,通过简单的包装即可满足ROS接口的调用,以后再上传!
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值