海康威視IP攝像頭基於OPENCV的二次開發
阿新 • • 發佈:2019-02-07
最近玩了一下海康的IPcamera,與普通的WEBcamera輸出RGB影象不同,其解碼後輸出的影象格式為YV12,這使得我們不能用熟悉的兩行程式碼
就獲得可以用opencv直接處理的源影象了,這一度造成了不少麻煩。
所以貼出部分程式碼,希望對正在使用或者也想玩下海康攝像頭的朋友一點參考。
能力有限,若有誤,勿噴!
轉YV12到YCrCb的函式實現有很多,程式碼不知誰寫的,我是從雪水的這篇部落格(超連結)看到的,親測可以實現。
-
void yv12toYUV(char *outYuv, char *inYv12,
- {
- int col,row;
- unsigned int Y,U,V;
- int tmp;
- int idx;
- for (row=0; row<height; row++)
- {
- idx=row * widthStep;
- int rowptr=row*width;
- for (col=0; col<width; col++)
- {
-
tmp = (row/2)*(width/2)+(col/2);
- Y=(unsigned int) inYv12[row*width+col];
- U=(unsigned int) inYv12[width*height+width*height/4+tmp];
- V=(unsigned int) inYv12[width*height+tmp];
- if((idx+col*3+2)> (1200 * widthStep))
- {
-
//printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2);
- }
- outYuv[idx+col*3] = Y;
- outYuv[idx+col*3+1] = U;
- outYuv[idx+col*3+2] = V;
- }
- }
- }
本文推薦用cvtColor()函式,opencv2.4.8以上版本自定義了巨集CV_YUV2BGR_YV12,可以實現這一轉換;
以下是主函式:以下是實時流回調函式fRealDataCallBack:以下是解碼回撥函式,在解碼回撥之前需宣告一個List容器,用以存放幀資料,該List最好定義為全域性變數,便於線上程裡opencv處理。此處利用解碼回撥函式做視訊格式轉換操作,並將RGB影象存入frameQueue。利用多執行緒程式設計,在另一個執行緒裡用opencv處理影象或其他操作,我這裡是進行跟蹤的,其中,實時幀數realframe_count是用來控制取幀間隔時間的,因為opencv影象處理執行緒會執行相應複雜演算法或者別的操作,時間消耗較大,不可能逐一處理每一幀。執行緒通過一個按鈕開啟,響應函式如下,由於貼的使部分程式碼,請自動忽略無關內容!以下為取幀執行緒函式:到這一步就可以了,另外,在函式中是不需要waitkey來控制幀率的,海康的SDK好像是自動回撥的!