海康IPCamera结合OpenCV图像处理的一般步骤
????做視覺的朋友肯定會接觸到各種相機(各種品牌),不管是工業相機、監控相機還是普通的USB Camera,都有一套常用的處理技巧,今天我們來看看IPCamera結合OpenCV圖像處理的一般套路。IPCamera最常見的就是網絡監控攝像頭,而國內??低曇呀浾剂舜蟛糠址蓊~,而且現在的監控攝像頭還添加了各種智能功能,更方便用戶使用。今天就以海康的網絡攝像頭來說明(具體型號沒查到,客戶給的,做了一層鐵殼封裝)。
????第一步:購買攝像頭。不管是自行購買還是客戶指定,一定要確保支持二次開發,有途徑能夠獲取相機的SDK,這樣才能對相機進行下一步操作。
? ? 第二步:使用SDK中的demo操作相機。這一步驟主要的目的是確保SDK沒問題,免得后續浪費時間,當然如果是??祵腎PCamera一般官網可以下載到SDK,應該沒問題。相機與SDK驗證分以下幾個步驟:
????①?保證接通電源,鏈接網絡,設置IP和攝像頭同一網段;
????一般IP地址為:192.168.1.64,我們將電腦IP地址設置成192.168.1.x,(x可以是除64以外的數字,比如2),然后打開瀏覽器,然后輸入192.168.1.64
????②?瀏覽器登錄驗證,輸入賬戶密碼,看是否能夠預覽相機畫面;
????③?使用SDK中的demo打開相機。以C++為例,這一步一般注意編譯環境問題,還有demo默認字符集是Unicode還是多字節,一般都是多字節字符集。運行時要將需要的HK dll 拷貝到exe同目錄,如果還有其他問題需要看下SDK說明中的注意事項或操作手冊。
????第三步:從簡易demo中提取我們想要的功能并單獨復現。個人建議自己新建一個MFC或Qt界面來復現demo中需要的功能,一是方便我們了解相機的一些操作函數使用,另一方面demo中一般多了一些我們不需要的功能且UI并不美觀,當然,如果你很著急,可以直接在上面改。復現時的一般步驟:
????①?注冊相機。需要設置IP,端口,用戶名,密碼,注意變量的類型,然后找到注冊函數,驗證是否能成功注冊,注冊失敗一般都會提示或者有對應的錯誤代碼。這里在調用注冊函數NET_DVR_Login_V30/V40之前,需要先調用NET_DVR_Init()函數來初始化SDK,否則其他函數都調用不了,這個需要看手冊(手冊中也有簡單的示例代碼和說明),最后和它配對使用的釋放SDK資源的函數在銷毀窗口時使用。
NET_DVR_Cleanup(); //NET_DVR_Init和NET_DVR_Cleanup需要配對使用????② 打開相機,預覽畫面。MFC中一般使用Picture Control顯示圖像,如下面代碼所示,使用NET_DVR_RealPlay_V30/V40函數,如果不設置回調函數,就直接給定Picture Control對應的窗口句柄,那么預覽圖像會顯示在界面中 ,但是你無法操作圖像。一般我們都需要指定回調函數,在回調函數中將圖像數據解碼后push到隊列中,供圖像處理時使用,此時hPlayWnd=NULL。
NET_DVR_CLIENTINFO ClientInfo;//ClientInfo.hPlayWnd?=?GetDlgItem(IDC_PIC)->m_hWnd;ClientInfo.hPlayWnd?=?NULL;ClientInfo.lChannel?=?iChanIndex?+?1;ClientInfo.lLinkMode?=?0;ClientInfo.sMultiCastIP?=?NULL;TRACE("Channel?number:%d\n",?ClientInfo.lChannel);m_lPlayHandle?=?NET_DVR_RealPlay_V30(m_struDeviceInfo.lLoginID,?&ClientInfo,?fRealDataCallBack,?NULL,?TRUE);if?(-1?==?m_lPlayHandle){DWORD?err?=?NET_DVR_GetLastError();CString?m_csErr;m_csErr.Format("播放出錯,錯誤代碼%d",?err);MessageBox(m_csErr);}轉到回調函數,可以設置是否邊解碼邊顯示預覽,這里不預覽(我們要顯示處理后的預覽圖),這里的圖像類型是T_YV12,使用一個解碼回調函數來處理,vFrames隊列中已是轉換后的Mat類型圖像。
//設置解碼回調函數 只解碼不顯示 if (!PlayM4_SetDecCallBack(nPort, DecCBFun)) {dRet = PlayM4_GetLastError(nPort);break; } void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2) {long lFrameType = pFrameInfo->nType;if (lFrameType == T_YV12){/*if (HK_Frame.empty()){HK_Frame.create(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3);}*/Mat YUVImage(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (unsigned char*)pBuf);Mat img;cvtColor(YUVImage,?img,?COLOR_YUV2BGR_YV12);vFrames.push(img.clone());} }????③ 從Mat隊列中取圖像處理。這時候就可以使用線程或Timer在隊列中逐個取圖進行分析處理,每處理完一幀后pop釋放當前幀;
HK_Frame = vFrames.front();//其他處理操作vFrames.pop();????第四步:關閉預覽,釋放SDK資源;關閉預覽,注銷,釋放SDK.
StopPlay();NET_DVR_Logout_V30(m_struDeviceInfo.lLoginID);NET_DVR_Cleanup();?//NET_DVR_Init和NET_DVR_Cleanup需要配對使用????效果如下:
????完整代碼將發布在知識星球中,更多學習資訊歡迎關注公眾號:OpenCV與AI深度學習。
總結
以上是生活随笔為你收集整理的海康IPCamera结合OpenCV图像处理的一般步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于android的ipcamera编程
- 下一篇: 搜索词纠错、相关搜索的原理与实现