1. 程式人生 > >opencv呼叫海康威視攝像頭

opencv呼叫海康威視攝像頭

 這裡使用的是海康威視的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類,並顯示出來。