海康拍照demo

#include "MvCameraControl.h"
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define MAX_BUF_SIZE    (3072*2048*3)

Mat imgL;
int timeL = 10000;
void callBackL(int, void*);
int nRet_L = -1;
void* m_handle = NULL;
void close_mv();
void main()
{
	//枚举子网内指定的传输协议对应的所有设备
	unsigned int nTLayerType = MV_GIGE_DEVICE;
	MV_CC_DEVICE_INFO_LIST m_stDevList = { 0 };
	nRet_L = MV_CC_EnumDevices(nTLayerType, &m_stDevList);//枚举设备
	if (nRet_L != 0)
	{
		printf("error: EnumDevices fail [%x]\n", nRet_L);
	}

	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_L = MV_CC_CreateHandle(&m_handle, &m_stDevInfo);//创造句柄

	if (nRet_L != 0)
	{
		printf("error: CreateHandle fail [%x]\n", nRet_L);
	}
		//连接设备
	unsigned int nAccessMode = MV_ACCESS_Exclusive;
	unsigned short nSwitchoverKey = 0;
	nRet_L = MV_CC_OpenDevice(m_handle, nAccessMode, nSwitchoverKey);//打开设备
	if (nRet_L != 0)
	{
		printf("error: OpenDevice fail [%x]\n", nRet_L);
	}
	//...其他处理 

	//开始采集图像
	nRet_L = MV_CC_StartGrabbing(m_handle);
		if (nRet_L != 0)
	{
		printf("error: StartGrabbing fail [%x]\n", nRet_L);
	}
	//获取一帧数据的大小
	MVCC_INTVALUE stIntvalue = { 0 };
		nRet_L = MV_CC_GetIntValue(m_handle, "PayloadSize", &stIntvalue);
	namedWindow("L-map",0);
	createTrackbar("曝光时间", "L-map", &timeL, 500000, callBackL, 0);
	//nRet = MV_CC_SetExposureTime(m_handle, 300000);
	
	if (nRet_L != 0)
	{
		printf("Get PayloadSize failed! nRet [%x]\n", nRet_L);
	}
		//int nBufSize = stIntvalue.nCurValue; //一帧数据大小
	int nBufSize = MAX_BUF_SIZE;//图像大小
	unsigned int  nTestFrameSize = 0;
	unsigned char* pFrameBuf = NULL;
	pFrameBuf = (unsigned char*)malloc(nBufSize);//动态分配,地址指向pFrameBuf

	MV_FRAME_OUT_INFO_EX stInfo;
	memset(&stInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));//如果用malloc分配的内存,一般只能使用memset来初始化了
		//上层应用程序需要根据帧率,控制好调用该接口的频率
	//此次代码仅供参考,实际应用建议另建线程进行图像帧采集和处理
	int image_number = 0;
	while (1)
	{
		nRet_L = MV_CC_GetImageForBGR(m_handle, pFrameBuf, nBufSize, &stInfo, 1000);
		if (nRet_L != 0)
		{
			cout << "error:Get ImageForRGB:" << setbase(16) << nRet_L << endl;
			break;
		}
		else
		{
			//...图像数据处理
			//cout << "imagetype:" << setbase(16) << stInfo.enPixelType << endl;
			int width = stInfo.nWidth;
			int height = stInfo.nHeight;
			Mat pImg(height, width, CV_8UC3, pFrameBuf);
			cvtColor(pImg, imgL, COLOR_BGR2GRAY);
			if (waitKey(10) == 32)
			{
				++image_number;
				imwrite("D:/picture/L/" + to_string(image_number) + ".bmp", imgL);
				cout << "已保存 " << to_string(image_number) << endl;
			}
			namedWindow("L-map", 0);
			imshow("L-map", imgL);
		}
	}
	close_mv();
}
void callBackL(int, void*)
{
	nRet_L = MV_CC_SetExposureTime(m_handle, timeL);
	
}
void close_mv()
{

	//停止采集图像 
	nRet_L = MV_CC_StopGrabbing(m_handle);
	if (nRet_L != 0)
	{
		printf("error: StopGrabbing fail [%x]\n", nRet_L);
	}
	//关闭设备,释放资源
	nRet_L = MV_CC_CloseDevice(m_handle);
	if (nRet_L != 0)
	{
		printf("error: CloseDevice fail [%x]\n", nRet_L);
	}
	//销毁句柄,释放资源
	nRet_L = MV_CC_DestroyHandle(m_handle);
	if (nRet_L != 0)
	{
		printf("error: DestroyHandle fail [%x]\n", nRet_L);
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值