opencv呼叫海康威視攝像頭
阿新 • • 發佈:2018-12-20
這裡使用的是海康威視的MV-CA020-20GC攝像頭,軟體使用的是VS2017與opencv3.1.1 (已經配置完成)。
調取攝像頭畫面需要先按照海康威視的說明書進行設定,設定完成後,安裝海康威視的客戶端MVS。
客戶端安裝完成後需要在VS中進行配置,具體配置方法CSDN裡有很多,這裡就不詳細說明了。
配置完成後執行以下程式碼就可以呼叫攝像頭的畫面:
#include "MvCameraControl.h" #include <iostream> #include <opencv2/opencv.hpp> using namespace std; #define MAX_BUF_SIZE (1920*1200*3) void main() { int nRet = -1; void* m_handle = NULL; //列舉子網內指定的傳輸協議對應的所有裝置 unsigned int nTLayerType = MV_GIGE_DEVICE; MV_CC_DEVICE_INFO_LIST m_stDevList = { 0 }; nRet = MV_CC_EnumDevices(nTLayerType, &m_stDevList); if (nRet != 0) { printf("error: EnumDevices fail [%x]\n", nRet); } if (m_stDevList.nDeviceNum == 0) { printf("no camera found!\n"); } //選擇查詢到的第一臺線上裝置,建立裝置控制代碼 int nDeviceIndex = 0; MV_CC_DEVICE_INFO m_stDevInfo = { 0 }; memcpy(&m_stDevInfo, m_stDevList.pDeviceInfo[nDeviceIndex], sizeof(MV_CC_DEVICE_INFO)); nRet = MV_CC_CreateHandle(&m_handle, &m_stDevInfo); if (nRet != 0) { printf("error: CreateHandle fail [%x]\n", nRet); } //連線裝置 unsigned int nAccessMode = MV_ACCESS_Exclusive; unsigned short nSwitchoverKey = 0; nRet = MV_CC_OpenDevice(m_handle, nAccessMode, nSwitchoverKey); if (nRet != 0) { printf("error: OpenDevice fail [%x]\n", nRet); } //...其他處理 //開始採集影象 nRet = MV_CC_StartGrabbing(m_handle); if (nRet != 0) { printf("error: StartGrabbing fail [%x]\n", nRet); } //獲取一幀資料的大小 MVCC_INTVALUE stIntvalue = { 0 }; nRet = MV_CC_GetIntValue(m_handle, "PayloadSize", &stIntvalue); if (nRet != 0) { printf("Get PayloadSize failed! nRet [%x]\n", nRet); } //int nBufSize = stIntvalue.nCurValue; //一幀資料大小 int nBufSize = MAX_BUF_SIZE; unsigned int nTestFrameSize = 0; unsigned char* pFrameBuf = NULL; pFrameBuf = (unsigned char*)malloc(nBufSize); MV_FRAME_OUT_INFO_EX stInfo; memset(&stInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX)); //上層應用程式需要根據幀率,控制好呼叫該介面的頻率 //此次程式碼僅供參考,實際應用建議另建執行緒進行影象幀採集和處理 while (1) { if (nTestFrameSize > 50) { break; } nRet = MV_CC_GetImageForBGR(m_handle, pFrameBuf, nBufSize, &stInfo, 1000); if (nRet != 0) { cout << "error:GetImageForRGB:" << setbase(16) << nRet << endl; break; } else { //...影象資料處理 cout << "imagetype:" << setbase(16) << stInfo.enPixelType << endl; int width = stInfo.nWidth; int height = stInfo.nHeight; if (stInfo.enPixelType == PixelType_Gvsp_BGR8_Packed) { cv::Mat pImg(height, width, CV_8UC3, pFrameBuf); cv::imshow("1", pImg); cv::waitKey(10); } nTestFrameSize++; } } //...其他處理 //停止採集影象 nRet = MV_CC_StopGrabbing(m_handle); if (nRet != 0) { printf("error: StopGrabbing fail [%x]\n", nRet); } //關閉裝置,釋放資源 nRet = MV_CC_CloseDevice(m_handle); if (nRet != 0) { printf("error: CloseDevice fail [%x]\n", nRet); } //銷燬控制代碼,釋放資源 nRet = MV_CC_DestroyHandle(m_handle); if (nRet != 0) { printf("error: DestroyHandle fail [%x]\n", nRet); } system("pause"); }
以上程式碼,通過海康所提供的damo進行修改得到的,通過while迴圈呼叫GetImageForBGR得到每一幀的影象,最後轉換成opencv的Mat類,並顯示出來。