概述
本代码实现海康工业相机拍照并保存功能(MV_CC_SaveImageToFile)。
参考:MVS/MVS/Development/Documentations/海康工业相机SDK使用手册.chm
- C接口定义
- 图像处理
- MV_CC_SaveImageToFile
- 图像处理
/*
2020/2/19 Vivi
2020/3/05 Update
*/
//#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()
{
unsigned int nTestFrameSize = 0;
int nRet = -1;
//枚举子网内指定的传输协议对应的所有设备
unsigned int nTLayerType = MV_GIGE_DEVICE | MV_USB_DEVICE;
MV_CC_DEVICE_INFO_LIST m_stDevList = { 0 }; // 初始化 m_stDevList
nRet = MV_CC_EnumDevices(nTLayerType, &m_stDevList); // m_stDevList 为相机设备数量
while (1)
{
if (nTestFrameSize > 19)
break;
for (int nDeviceIndex = 0; nDeviceIndex < m_stDevList.nDeviceNum; nDeviceIndex++) // 按第 0、1 个相机走流程
{
nRet = -1;
void* m_handle = NULL;
//选择查找到的在线设备,创建设备句柄
MV_CC_DEVICE_INFO m_stDevInfo = { 0 }; // 初始化一台设备(m_stDevInfo)
memcpy(&m_stDevInfo, m_stDevList.pDeviceInfo[nDeviceIndex], sizeof(MV_CC_DEVICE_INFO)); // 复制设备地址
cout << "设备地址: " << m_stDevList.pDeviceInfo[nDeviceIndex] << endl;
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);
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);
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);
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);
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);
if (MV_OK != nRet)
{
printf("error: Balance white auto fail [%x]n", nRet);
return;
}
//...其他处理
//开始采集图像
nRet = MV_CC_StartGrabbing(m_handle);
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("failed in get PayloadSize [%x]n", nRet);
return;
}
int nBufSize = stIntvalue.nCurValue; //一帧数据大小
unsigned char* pFrameBuf = NULL;
pFrameBuf = (unsigned char*)malloc(nBufSize);
MV_FRAME_OUT_INFO_EX stInfo;
memset(&stInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));
nRet = MV_CC_GetOneFrameTimeout(m_handle, pFrameBuf, nBufSize, &stInfo, 1000);
if (MV_OK != nRet)
{
Sleep(10);
}
else
{
//图片数据输入输出参数
MV_SAVE_IMG_TO_FILE_PARAM stParam;
stParam.enImageType = MV_Image_Png; //需要保存的图像类型
stParam.enPixelType = stInfo.enPixelType; //相机对应的像素格式
stParam.nWidth = stInfo.nWidth; //相机图像宽
stParam.nHeight = stInfo.nHeight; //相机图像高
stParam.nDataLen = stInfo.nFrameLen; //原始图像数据长度
stParam.pData = pFrameBuf; //原始图像数据
stParam.nQuality = 1; //jpg图像质量范围为(50-99], png图像质量范围为[0-9]
stParam.iMethodValue = 0;
// 将数据格式化输出到字符串
char chImageName[256] = { 0 };
unsigned int nFrameNum = stInfo.nFrameNum;
//sprintf_s(chImageName, 256, "Image%d_w%d_h%d_fn%03d.png", nDeviceIndex, stParam.nWidth, stParam.nHeight, nFrameNum);
if (nDeviceIndex == 0)
sprintf_s(chImageName, 256, "image%02d_left.png", nTestFrameSize);
else
sprintf_s(chImageName, 256, "image%02d_right.png", nTestFrameSize);
//void *memcpy(void *str1, const void *str2, size_t n)
//从存储区 str2 复制 n 个字符到存储区 str1。
memcpy(stParam.pImagePath, chImageName, 256);
cout << stParam.pImagePath << "n";
//保存图像到文件,该接口支持BMP/JPEG/PNG/TIFF。
int nRet = MV_CC_SaveImageToFile(m_handle, &stParam);
if (MV_OK != nRet)
{
printf("Save photos failed! nRet [%x]n", nRet);
}
}
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;
}
//...其他处理
}
}
}
最后
以上就是感性巨人为你收集整理的海康工业相机拍照代码(2)的全部内容,希望文章能够帮你解决海康工业相机拍照代码(2)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复