#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);
}
}
海康拍照demo
最新推荐文章于 2024-04-09 00:00:00 发布