1. 程式人生 > >qt+opencv開發海康威視網路攝像機採集處理程式

qt+opencv開發海康威視網路攝像機採集處理程式

正在開發的專案用到海康威視網路攝像機,現在總結一下該攝像機使用過程中遇到的一些問題。

首先是海康威視網路攝像機的IP設定,使用官網上提供的“裝置網路搜尋”軟體將攝像機的IP地址前三位設定成與主機相同,同時把“使用DHCP”勾掉不使用。


二次開發的話,主要參考了官方文件和這個帖子http://blog.csdn.net/wanghuiqi2008/article/details/31410509,採用實時流解碼方式獲取碼流資料轉換成OpenCV中的影象資料,然後再利用Qt中的訊息傳遞機制將影象傳送出去進行處理。

因為相機實時流解碼方式採用了回撥函式,為了在回撥函式中傳送qt訊息,定義了一個相機類的全域性變數指標,在相機類初始化時將相機this指標傳給該變數,然後在回撥函式中通過該變數呼叫相機類中函式傳送影象資料。

程式碼(參考上面提到的帖子):

  1. #ifndef CAMERAHK_H
  2. #define CAMERAHK_H
  3. #include <QObject>
  4. #include <opencv2/opencv.hpp>  
  5. #include "opencv/cv.h"  
  6. #include "opencv/highgui.h"  
  7. class CameraHk : public QObject  
  8. {  
  9.     Q_OBJECT  
  10. public:  
  11.     CameraHk(QObject *parent);  
  12.     ~CameraHk();  
  13.     void emitImage(IplImage*);  
  14. signals:  
  15.     void outframe(IplImage*);  
  16. private:  
  17.     void login();//註冊
  18.     void capture();//開始採集
  19.     void config();//設定引數
  20.     void stop_play();  
  21. private:  
  22.     long lUserID;   
  23.     long lRealPlayHandle;   
  24. };  
  25. #endif // CAMERAHK_H
  26. #include "camerahk.h"
  27. #include <cstdio>  
  28. #include <cstring>  
  29. #include <iostream>  
  30. #include "Windows.h"  
  31. #include "HCNetSDK.h"  
  32. #include "plaympeg4.h"
  33. #include "SelectCamera.h"
  34. #include <time.h>  
  35. #define USECOLOR 1  
  36. usingnamespace std;  
  37. CameraHk* HWND_CAMERAHK=0;//用於回撥函式中使用,不安全
  38. //--------------------------------------------  
  39. int iPicNum=0;//Set channel NO.  
  40. LONG nPort=-1;    
  41. HWND hWnd=NULL;   
  42. NET_DVR_DEVICEINFO_V30 struDeviceInfo;    
  43. void yv12toYUV(char *outYuv, char *inYv12, int width, int height,int widthStep)    
  44. {    
  45.    int col,row;    
  46.    unsigned int Y,U,V;    
  47.    int tmp;    
  48.    int idx;    
  49.   //printf("widthStep=%d.\n",widthStep);  
  50.    for (row=0; row<height; row++)    
  51.    {    
  52.       idx=row * widthStep;    
  53.       int rowptr=row*width;    
  54.       for (col=0; col<width; col++)    
  55.       {    
  56.          tmp = (row/2)*(width/2)+(col/2);    
  57.          Y=(unsigned int) inYv12[row*width+col];    
  58.          U=(unsigned int) inYv12[width*height+width*height/4+tmp];    
  59.          V=(unsigned int) inYv12[width*height+tmp];    
  60.          if((idx+col*3+2)> (1200 * widthStep))    
  61.          {    
  62.           //printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2);  
  63.          }     
  64.          outYuv[idx+col*3]   = Y;    
  65.          outYuv[idx+col*3+1] = U;    
  66.          outYuv[idx+col*3+2] = V;    
  67.       }    
  68.    }    
  69. }      
  70. //解碼回撥 視訊為YUV資料(YV12),音訊為PCM資料  
  71. void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)    
  72. {    
  73.     long lFrameType = pFrameInfo->nType;     
  74.     if(lFrameType ==T_YV12)    
  75.     {    
  76. #if USECOLOR  
  77.         //int start = clock();  
  78.         IplImage* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 3);//得到影象的Y分量    
  79.         yv12toYUV(pImgYCrCb->imageData, pBuf, pFrameInfo->nWidth,pFrameInfo->nHeight,pImgYCrCb->widthStep);//得到全部RGB影象  
  80.         IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 3);      
  81.         cvCvtColor(pImgYCrCb,pImg,CV_YCrCb2RGB);      
  82.         //int end = clock();
  83. #else  
  84.         IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 1);      
  85.         memcpy(pImg->imageData,pBuf,pFrameInfo->nWidth*pFrameInfo->nHeight);     
  86. #endif  
  87.         //printf("%d\n",end-start);  
  88.         //cvShowImage("IPCamera",pImg);  
  89.         //cvWaitKey(-1); 
  90.         HWND_CAMERAHK->emitImage(pImg);  
  91. #if USECOLOR  
  92.         cvReleaseImage(&pImgYCrCb);    
  93.         cvReleaseImage(&pImg);    
  94. #else  
  95.     cvReleaseImage(&pImg);    
  96. #endif  
  97.     }  
  98. }    
  99. ///實時流回調  
  100. void CALLBACK fRealDataCallBack(LONG lRealHandle,DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize,void *pUser)    
  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.         {    
  112.             if (!PlayM4_OpenStream(nPort,pBuffer,dwBufSize,1024*1024))    
  113.             {    
  114.                 dRet=PlayM4_GetLastError(nPort);    
  115.                 

    相關推薦

    qt+opencv開發網路攝像機採集處理程式

    正在開發的專案用到海康威視網路攝像機,現在總結一下該攝像機使用過程中遇到的一些問題。 首先是海康威視網路攝像機的IP設定,使用官網上提供的“裝置網路搜尋”軟體將攝像機的IP地址前三位設定成與主機相同,同時把“使用DHCP”勾掉不使用。

    網路攝像機 SDK二次開發(JAVA)(1-開發環境搭建)

    硬體環境 相關的硬體環境準備:攝像機型號:DS-2CD2T25FD-I3,按照說明書搭建好硬體環境 SDK下載 開發工具:IDEA20173.3 , JDK: 9 官網SDK地址:http://www.hikvision.com/cn/download_61.html

    關於網路攝像機二次開發問題

    最近一個星期一直在研究海康威視的網路攝像機二次開發問題,糾結了很久。今天終於走通了一部分,記下來希望能夠幫助到更多人。現在是用的  VS2013 + opencv 進行測試。首先推薦兩篇對我幫助很大的博文:               http://blog.csdn.net

    網路攝像機連線、使用方法

    親測有效,希望可以幫助大家。 1、網路相機型號:DS-2CD5047EFWD 2、下載SADP軟體: 首先,登陸海康威視官網www.hikvision.com  然後依次選擇服務與支援 → 下載 → Hikvision Tools(含SADP、錄影容量計算等工具) 

    Ubuntu16.04和Windows10下直接用網線連線網路攝像頭

    一. ubuntu 1.獲取網路攝像頭IP地址 例如 192.168.2.64 2.設定Ubuntu網路連線 電腦聯網狀態下終端輸入 nmcli dev show 記下IPV4地址,IPV4閘道器,IPV4.DNS地址 桌面右上角網路-》乙太網-》增加-》乙太網-》新建

    配置網路攝像頭動態庫方法

    如果HCNetSDKCom目錄以及libhcnetsdk.so、libhpr.so、libHCCore檔案和可執行檔案在同一級目錄下,則使用同級目錄下的庫檔案; 如果不在同一級目錄下,則需要將以上檔案的目錄載入到動態庫搜尋路徑中,設定的方式有以下幾種: 一. 將網路SDK各動態庫路徑加入到L

    opencv呼叫攝像頭

     這裡使用的是海康威視的MV-CA020-20GC攝像頭,軟體使用的是VS2017與opencv3.1.1 (已經配置完成)。 調取攝像頭畫面需要先按照海康威視的說明書進行設定,設定完成後,安裝海康威視的客戶端MVS。 客戶端安裝完成後需要在VS中進行配置,具體配置方法C

    用ffmpeg+nginx+網路攝像頭rtsp在手機端和電腦端實現直播

    原料:海康威視攝像頭,nginx伺服器,ffmpeg。首先海康威視攝像頭,它的rtsp資料流的地址為:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream說明:userna

    Ubuntu下使用Python-opencv獲取RTSP碼流教程

    已更新(前面的方法雖然可行但不能解決根本問題,對不住大家了,讓大家浪費了時間!實際有更簡單的方案,請直接檢視分割線以下的內容) /* 下面這部分內容被作廢了 筆者在釋出這篇部落格之前為了拿到海康威視的碼流費了九牛二虎之力,當然也可能是筆者太菜,但是既然折騰出來

    opencv讀取攝像頭

    海康威視的網路攝像頭使用: 開發工具:vs2013 C++ 海康SDK 下載海康威視SDK:網址:http://www.hikvision.com/cn/download_61.html • 1:對照自己的開發平臺可以下載裝置網路SDK_Wi

    攝像機的實時讀取篇一(OpenCV開發環境配置)

    參考博主lonelyrains的文章,利用海康SDK+OpenCV,實現了海康攝像機影象實時讀取。篇一介紹環境配置及相關注意事項。 OpenCV開發環境配置 1.下載opencv-2.4.11(其他版本配置過程相似),下載完成後,雙擊檔案會提示解壓到某個地方,解壓完成複製到要配置的目錄下

    IP攝像頭基於OPENCV的二次開發

    最近玩了一下海康的IPcamera,與普通的WEBcamera輸出RGB影象不同,其解碼後輸出的影象格式為YV12,這使得我們不能用熟悉的兩行程式碼 VideoCapture cap(0); cap << frame; 就獲得可以用opencv直接處理的源

    OpenCV直接或通過NVR開啟IP攝像頭

    1.直接開啟IP攝像頭 ①攝像頭接網線懟到電腦上,我用的是POE供電的攝像頭,單獨接電腦還要用個電源給它供電; ②下載Hikvision Tools,修改攝像頭IP地址(192.168.1.101)和密碼(asd123456),修改密碼用微信公眾號“海康威視客戶服務”掃碼; ③Video

    攝像機的實時讀取篇二(SDK開發環境配置)

    參考博主lonelyrains的文章,利用海康SDK+OpenCV,實現了海康攝像機影象實時讀取。篇二介紹海康SDK開發環境配置及相關注意事項。 海康SDK開發環境配置 海康SDK開發環境配置具體步驟類似篇一(http://blog.csdn.net/u011674213/artic

    java B/S 開發 流程

    最近專案用到了一個呼叫海康威視攝像頭實現外網網頁預覽的需求,由於第一次接觸這類需求,不免有些焦頭爛額,現終於將需求實現,故,作一筆記用於記憶,並希望幫到要用的人。廢話不多說,直接開始: 注:本文中所有的使用的程式碼和工具以及安裝包的下載地址如下:       傳送門:

    FasterRCNN:提升網路的分類精度

        我們發現,對於圖中的全域性上下文網路分支,訓練時如果採用隨機初始化,效能提升非常有限。如果用預訓練的引數初始化,在ImageNet DET驗證集上可以得到超過3個點的效能提升。對於ResNets,RoIPooling後面的conv5有9層卷積。而Faster R-CNN finetune時一般初始學

    視訊ocx控制元件開發總結

    因工作需要,需要開發一個海康威視的視訊ocx控制元件,嵌入到intouch,組態王一類的組態軟體中使用。 之前從沒做過ocx控制元件的開發,連MFC的開發也沒做過,折騰了幾天,終於基本完成。記錄一下這個過程。 第一部分 ocx控制元件的建立 首先在網上查找了一下資料,按

    攝像頭+OpenCV+VS2017 影象處理小結(一)

    本系列部落格記載博主用海康威視網路攝像頭以及OpenCV庫和VS2017開發環境搭建  視訊處理工程  的過程,主要是海康威視攝像頭與電腦的有線與無線連線,視訊流資料的獲取以及格式轉換,開發環境以及三方庫的的配置, 多執行緒處理轉碼後的影象幀的相關步驟,並且給出了一個簡單的實

    攝像頭+OpenCV+VS2017 影象處理小結(二)

    第二篇 先介紹海康威視SDK的配置; 接著介紹並提取OpenCV庫的標頭檔案以及庫檔案供工程使用,期間還演示瞭如何配置屬性表; 最後將海康威視的SDK進行封裝,封裝成HK_camera類,並在主函式中生成並呼叫這個類的例項

    web端開發經驗 (二)

      上篇部落格介紹了海康威視sdk以及web端的開發,成功預覽。還沒有成功的朋友可以去看一下上一篇文章   關於海康威視sdk與海康威視web的史上最精細的教程 (一) 但都是單個攝像頭,心裡總有個疑問,倆個攝像頭同時預覽該怎麼實現呢,經過和前端同時半天的探索,