初始化相机类文件
#pragma once
#include "MvCameraControl.h"
class CMvCamera
{
public:
CMvCamera();
~CMvCamera();
int InitCamera();
int SaveCurrentImage(CString filePath);
void CloseCamera();
int SetEnumValue(IN const char* strKey, IN unsigned int nValue);
int CommandExecute(IN const char* strKey);
public:
int nRet;
void* m_hDevHandle;
};
#include "pch.h"
#include "CMvCamera.h"
CMvCamera::CMvCamera()
{
}
CMvCamera::~CMvCamera()
{
CloseCamera();
if (m_hDevHandle != NULL)
{
MV_CC_DestroyHandle(m_hDevHandle);
m_hDevHandle = NULL;
}
}
int CMvCamera::InitCamera()
{
nRet = MV_OK;
m_hDevHandle = NULL;
nRet = MV_CC_Initialize();
if (MV_OK != nRet)
{
AfxMessageBox(_T("初始化失败"));
return 0;
}
MV_CC_DEVICE_INFO_LIST stDeviceList;
memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));
nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);
if (MV_OK != nRet)
{
AfxMessageBox(_T("枚举设备失败"));
return 0;
}
if (stDeviceList.nDeviceNum > 0)
{
for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++)
{
MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];
if (NULL == pDeviceInfo)
{
break;
}
}
}
else
{
AfxMessageBox(_T("没有找到设备"));
return 0;
}
unsigned int nIndex = 0;
nRet = MV_CC_CreateHandle(&m_hDevHandle, stDeviceList.pDeviceInfo[nIndex]);
if (MV_OK != nRet)
{
AfxMessageBox(_T("创建句柄失败"));
return 0;
}
nRet = MV_CC_OpenDevice(m_hDevHandle);
if (MV_OK != nRet)
{
AfxMessageBox(_T("打开设备失败"));
return 0;
}
if (stDeviceList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE)
{
int nPacketSize = MV_CC_GetOptimalPacketSize(m_hDevHandle);
if (nPacketSize > 0)
{
nRet = MV_CC_SetIntValue(m_hDevHandle, "GevSCPSPacketSize", nPacketSize);
if (nRet != MV_OK)
{
AfxMessageBox(_T("Warning: Set Packet Size fail"));
return 0;
}
}
else
{
AfxMessageBox(_T("Warning: Get Packet Size fail"));
return 0;
}
}
nRet = MV_CC_SetEnumValue(m_hDevHandle, "TriggerMode", 1);
if (MV_OK != nRet)
{
AfxMessageBox(_T("Set Trigger Mode fail!"));
return 0;
}
nRet = MV_CC_SetEnumValue(m_hDevHandle, "TriggerSource", MV_TRIGGER_SOURCE_SOFTWARE);
if (MV_OK != nRet)
{
AfxMessageBox(_T("Set Trigger Source fail!"));
return 0;
}
nRet = MV_CC_StartGrabbing(m_hDevHandle);
if (MV_OK != nRet)
{
AfxMessageBox(_T("Start Grabbing fail!"));
return 0;
}
return 1;
}
int CMvCamera::SaveCurrentImage(CString filePath)
{
MV_FRAME_OUT stOutFrame = { 0 };
nRet = MV_CC_GetImageBuffer(m_hDevHandle, &stOutFrame, 1000);
if (nRet != MV_OK) {
AfxMessageBox(_T("获取图像失败!"));
return -1;
}
unsigned int nBufferSize = stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight * 4 + 2048;
unsigned char* pImageBuf = new unsigned char[nBufferSize];
MV_SAVE_IMAGE_PARAM_EX stSaveParam = { 0 };
stSaveParam.pData = stOutFrame.pBufAddr;
stSaveParam.nDataLen = stOutFrame.stFrameInfo.nFrameLen;
stSaveParam.enPixelType = stOutFrame.stFrameInfo.enPixelType;
stSaveParam.nWidth = stOutFrame.stFrameInfo.nWidth;
stSaveParam.nHeight = stOutFrame.stFrameInfo.nHeight;
stSaveParam.pImageBuffer = pImageBuf;
stSaveParam.nBufferSize = nBufferSize;
stSaveParam.enImageType = MV_Image_Jpeg;
stSaveParam.nJpgQuality = 95;
stSaveParam.iMethodValue = 2;
nRet = MV_CC_SaveImageEx2(m_hDevHandle, &stSaveParam);
if (MV_OK != nRet) {
delete[] pImageBuf;
MV_CC_FreeImageBuffer(m_hDevHandle, &stOutFrame);
CString strError;
strError.Format(_T("转换失败! 错误码: 0x%X"), nRet);
AfxMessageBox(strError);
return -2;
}
CFile file;
if (!file.Open(filePath, CFile::modeCreate | CFile::modeWrite)) {
delete[] pImageBuf;
MV_CC_FreeImageBuffer(m_hDevHandle, &stOutFrame);
AfxMessageBox(_T("创建文件失败!"));
return -3;
}
file.Write(pImageBuf, stSaveParam.nImageLen);
file.Close();
delete[] pImageBuf;
MV_CC_FreeImageBuffer(m_hDevHandle, &stOutFrame);
return 0;
}
void CMvCamera::CloseCamera()
{
nRet = MV_CC_StopGrabbing(m_hDevHandle);
if (MV_OK != nRet)
{
AfxMessageBox(_T("Stop Grabbing fail! \n"));
}
nRet = MV_CC_CloseDevice(m_hDevHandle);
if (MV_OK != nRet)
{
AfxMessageBox(_T("ClosDevice fail\n"));
}
nRet = MV_CC_DestroyHandle(m_hDevHandle);
if (MV_OK != nRet)
{
AfxMessageBox(_T("Destroy Handle fail!\n"));
}
m_hDevHandle = NULL;
}
int CMvCamera::SetEnumValue(IN const char * strKey, IN unsigned int nValue)
{
return MV_CC_SetEnumValue(m_hDevHandle, strKey, nValue);
}
int CMvCamera::CommandExecute(IN const char * strKey)
{
return MV_CC_SetCommandValue(m_hDevHandle, strKey);
}
点击按钮进行软触发拍照显示
void CHalconImgTestDlg::OnBnClickedGetimg()
{
int nRet = m_oMvCamera->CommandExecute("TriggerSoftware");
if (MV_OK != nRet)
{
AfxMessageBox(_T("执行软件触发失败"));
return;
}
MV_FRAME_OUT stOutFrame = { 0 };
nRet = MV_CC_GetImageBuffer(m_oMvCamera->m_hDevHandle, &stOutFrame, 1000);
if (nRet != MV_OK)
{
AfxMessageBox(_T("获取图像失败!"));
return;
}
HalconCpp::HObject hImage;
nRet = theApp.ConverMono8ToHalcon(&hImage, stOutFrame.stFrameInfo.nHeight,
stOutFrame.stFrameInfo.nWidth, stOutFrame.pBufAddr);
MV_CC_FreeImageBuffer(m_oMvCamera->m_hDevHandle, &stOutFrame);
if (nRet != MV_OK)
{
AfxMessageBox(_T("转换到Halcon图像失败!"));
return;
}
HTuple hv_WindowHandle;
HWND hWnd = GetDlgItem(IDC_IMG)->m_hWnd;
if (!HDevWindowStack::IsOpen())
{
OpenWindow(0, 0, stOutFrame.stFrameInfo.nWidth / 2, stOutFrame.stFrameInfo.nHeight / 2,
(Hlong)hWnd, "visible", "", &hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
}
if (HDevWindowStack::IsOpen())
{
DispObj(hImage, HDevWindowStack::GetActive());
}
}
