1. 程式人生 > >海康威視IP攝像頭基於OPENCV的二次開發

海康威視IP攝像頭基於OPENCV的二次開發

最近玩了一下海康的IPcamera,與普通的WEBcamera輸出RGB影象不同,其解碼後輸出的影象格式為YV12,這使得我們不能用熟悉的兩行程式碼

就獲得可以用opencv直接處理的源影象了,這一度造成了不少麻煩。

所以貼出部分程式碼,希望對正在使用或者也想玩下海康攝像頭的朋友一點參考。

能力有限,若有誤,勿噴!

轉YV12到YCrCb的函式實現有很多,程式碼不知誰寫的,我是從雪水的這篇部落格(超連結)看到的,親測可以實現。

  1. void yv12toYUV(char *outYuv, char *inYv12, 
    int width, int height,int widthStep)  
  2. {  
  3.    int col,row;  
  4.    unsigned int Y,U,V;  
  5.    int tmp;  
  6.    int idx;  
  7.    for (row=0; row<height; row++)  
  8.    {  
  9.       idx=row * widthStep;  
  10.       int rowptr=row*width;  
  11.       for (col=0; col<width; col++)  
  12.       {  
  13.          tmp = (row/2)*(width/2)+(col/2);  
  14.          Y=(unsigned int) inYv12[row*width+col];  
  15.          U=(unsigned int) inYv12[width*height+width*height/4+tmp];  
  16.          V=(unsigned int) inYv12[width*height+tmp];  
  17.          if((idx+col*3+2)> (1200 * widthStep))  
  18.          {  
  19.           //printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2);
  20.          }   
  21.          outYuv[idx+col*3]   = Y;  
  22.          outYuv[idx+col*3+1] = U;  
  23.          outYuv[idx+col*3+2] = V;  
  24.       }  
  25.    }  
  26. }  

本文推薦用cvtColor()函式,opencv2.4.8以上版本自定義了巨集CV_YUV2BGR_YV12,可以實現這一轉換;

以下是主函式:以下是實時流回調函式fRealDataCallBack:以下是解碼回撥函式,在解碼回撥之前需宣告一個List容器,用以存放幀資料,該List最好定義為全域性變數,便於線上程裡opencv處理。此處利用解碼回撥函式做視訊格式轉換操作,並將RGB影象存入frameQueue。利用多執行緒程式設計,在另一個執行緒裡用opencv處理影象或其他操作,我這裡是進行跟蹤的,其中,實時幀數realframe_count是用來控制取幀間隔時間的,因為opencv影象處理執行緒會執行相應複雜演算法或者別的操作,時間消耗較大,不可能逐一處理每一幀。執行緒通過一個按鈕開啟,響應函式如下,由於貼的使部分程式碼,請自動忽略無關內容!以下為取幀執行緒函式:到這一步就可以了,另外,在函式中是不需要waitkey來控制幀率的,海康的SDK好像是自動回撥的!