本代码实现海康工业相机拍照并保存功能(MV_CC_SaveImageEx2)。
参考:MVS/MVS/Development/Documentations/海康工业相机SDK使用手册.chm
- C接口定义
- 图像处理
- MV_CC_SaveImageEx2
- 图像处理
/* 2020/2/14 Vivi
*/
//#define _CRT_SECURE_NO_DEPRECATE
#include "MvCameraControl.h"
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
//#param warning(disable:4996)
void main()
{
int nRet = -1;
void* m_handle = NULL;
//枚举子网内指定的传输协议对应的所有设备
unsigned int nTLayerType = MV_GIGE_DEVICE | MV_USB_DEVICE;
MV_CC_DEVICE_INFO_LIST m_stDevList = { 0 };
nRet = MV_CC_EnumDevices(nTLayerType, &m_stDevList);
if (MV_OK != nRet)
{
printf("error: EnumDevices fail [%x]\n", nRet);
return;
}
int i = 0;
if (m_stDevList.nDeviceNum == 0)
{
printf("no camera found!\n");
return;
}
//选择查找到的第一台在线设备,创建设备句柄
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 (MV_OK != nRet)
{
printf("error: CreateHandle fail [%x]\n", nRet);
return;
}
//连接设备
//nRet = MV_CC_OpenDevice(m_handle, nAccessMode, nSwitchoverKey);
/*
nAccessMode = MV_ACCESS_Exclusive,设备访问模式,默认独占模式 MV_ACCESS_Exclusive:独占权限,其他APP只允许读CCP寄存器。
nSwitchoverKey = 0 切换权限时的密钥,默认为无,访问模式支持权限切换(2/4/6模式)时有效。
*/
nRet = MV_CC_OpenDevice(m_handle);
if (MV_OK != nRet)
{
printf("error: OpenDevice fail [%x]\n", nRet);
return;
}
//...其他处理
// 设置连续模式
unsigned int enMode = MV_TRIGGER_MODE_OFF; //关闭触发源
nRet = MV_CC_SetEnumValue(m_handle, "TriggerMode", enMode);
cout<<"Trigger mode off\n";
if (MV_OK != nRet)
{
printf("error: Trigger mode off fail [%x]\n", nRet);
return;
}
/* 设置自动曝光
0 : Off
1 : Once
2 :Continuous */
nRet = MV_CC_SetEnumValue(m_handle,"ExposureAuto", 2);
cout << "Exposure auto\n";
if (MV_OK != nRet)
{
printf("error: Exposure auto fail [%x]\n", nRet);
return;
}
/* 设置自动增益
0 : Off
1 : Once
2 :Continuous */
nRet = MV_CC_SetEnumValue(m_handle, "GainAuto", 2);
cout << "Gain auto\n";
if (MV_OK != nRet)
{
printf("error: Gain auto fail [%x]\n", nRet);
return;
}
/* 设置自动白平衡
0 : Off
2 : Once
1 :Continuous */
nRet = MV_CC_SetEnumValue(m_handle, "BalanceWhiteAuto", 1);
cout << "Balance white auto\n";
if (MV_OK != nRet)
{
printf("error: Balance white auto fail [%x]\n", nRet);
return;
}
//开始采集图像
nRet = MV_CC_StartGrabbing(m_handle);
cout << "Start grabbing...\n";
if (MV_OK != nRet)
{
printf("error: StartGrabbing fail [%x]\n", nRet);
return;
}
//获取一帧数据的大小
MVCC_INTVALUE stIntvalue = { 0 };
nRet = MV_CC_GetIntValue(m_handle, "PayloadSize", &stIntvalue);
if (nRet != MV_OK)
{
printf("Get PayloadSize failed! nRet [%x]\n", nRet);
return;
}
int nBufSize = stIntvalue.nCurValue; //一帧数据大小
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 > 99)
{
break;
}
nRet = MV_CC_GetOneFrameTimeout(m_handle, pFrameBuf, nBufSize, &stInfo, 1000);
if (MV_OK != nRet)
{
Sleep(10);
}
else
{
//图片数据输入输出参数
MV_SAVE_IMAGE_PARAM_EX stParam;
//源数据
stParam.pData = pFrameBuf; //原始图像数据
stParam.nDataLen = stInfo.nFrameLen; //原始图像数据长度
stParam.enPixelType = stInfo.enPixelType; //原始图像数据的像素格式
stParam.nWidth = stInfo.nWidth; //图像宽
stParam.nHeight = stInfo.nHeight; //图像高
stParam.nJpgQuality = 90; //JPEG图片编码质量
// ch:jpg图像质量范围为(50-99], png图像质量范围为[0-9]
//目标数据
stParam.enImageType = MV_Image_Jpeg; //需要保存的图像类型,转换成JPEG格式
//stParam.enImageType = MV_Image_Png; //需要保存的图像类型,转换成PNG格式
stParam.nBufferSize = nBufSize; //存储节点的大小
unsigned char* pImage = (unsigned char*)malloc(nBufSize);
stParam.pImageBuffer = pImage; //输出数据缓冲区,存放转换之后的图片数据
nRet = MV_CC_SaveImageEx2(m_handle, &stParam);
if (MV_OK != nRet)
{
break;
}
//将转换之后图片数据保存成文件
FILE* fp = fopen("test3.png", "wb"); // "wb" 只写打开或新建一个二进制文件;只允许写数据。
fwrite(pImage, 1, stParam.nImageLen, fp);
fclose(fp);
free(pImage);
//...其他图像数据处理
nTestFrameSize++;
}
}
free(pFrameBuf);
//...其他处理
//停止采集图像
nRet = MV_CC_StopGrabbing(m_handle);
if (MV_OK != nRet)
{
printf("error: StopGrabbing fail [%x]\n", nRet);
return;
}
//关闭设备,释放资源
nRet = MV_CC_CloseDevice(m_handle);
if (MV_OK != nRet)
{
printf("error: CloseDevice fail [%x]\n", nRet);
return;
}
//销毁句柄,释放资源
nRet = MV_CC_DestroyHandle(m_handle);
if (MV_OK != nRet)
{
printf("error: DestroyHandle fail [%x]\n", nRet);
return;
}
//system("pause");
}