关于MFC调用USB连接的摄像头拍照保存在本地文件的问题
我用的大恒图像公司的水星系列摄像头,他们自带的软件里有sample文件,是一个MFC工程项目,打开mfc界面可以看到他们已经有了诸多功能,其中包括打开设备、关闭设备、开始采集和停止采集四个button按钮,这些功能都已经实现,打开设备是连接摄像头,开始采集实在那个static里显示实时的图像,但是并没有拍照保存的功能,我想让摄像头持续拍照并保存在我指定的本地文件夹里,或者在他的工程目录下也行,不知道怎么编写代码,求助诸路大神。我用的vs2013加opencv2.4.9,他的代码放在下面:
void CGxAutoFuncCtrlDlg::OnBnClickedBtnOpenDevice() //打开设备,连接摄像头
{
// TODO: Add your control notification handler code here
GX_STATUS emStatus = GX_STATUS_SUCCESS;
uint32_t nDevNum = 0;
GX_OPEN_PARAM stOpenParam;
// 初始化设备打开参数
stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE;
stOpenParam.openMode = GX_OPEN_INDEX;
stOpenParam.pszContent = "1";
// 枚举设备
emStatus = GXUpdateDeviceList(&nDevNum, 1000);
GX_VERIFY(emStatus);
// 判断当前连接设备个数
if (nDevNum <= 0)
{
MessageBox("未发现设备!");
return;
}
// 如果设备已经打开则关闭,保证相机在初始化出错情况能再次打开
if (m_hDevice != NULL)
{
emStatus = GXCloseDevice(m_hDevice);
GX_VERIFY(emStatus);
m_hDevice = NULL;
}
// 打开设备
emStatus = GXOpenDevice(&stOpenParam, &m_hDevice);
GX_VERIFY(emStatus);
m_bDevOpened = TRUE;
// 设置相机的默认参数:采集模式:连续采集,数据格式:8-bit
emStatus = InitDevice();
GX_VERIFY(emStatus);
// 获取设备的宽、高等属性信息
emStatus = GetDeviceParam();
GX_VERIFY(emStatus);
// 获取相机参数,初始化界面控件
InitUI();
// 更新界面控件
UpDateUI();
}
//---------------------------------------------------------------------------------
/**
\brief 点击"开始采集"按钮消息响应函数
\return 无
*/
//----------------------------------------------------------------------------------
void CGxAutoFuncCtrlDlg::OnBnClickedBtnStartSnap() //开始采集,显示实时图像
{
// TODO: Add your control notification handler code here
GX_STATUS emStatus = GX_STATUS_ERROR;
// 初始化BMP头信息、分配Buffer为图像采集做准备
if(!PrepareForShowImg())
{
MessageBox("为图像显示准备资源失败!");
return;
}
//注册回调
emStatus = GXRegisterCaptureCallback(m_hDevice, this, OnFrameCallbackFun);
if (emStatus != GX_STATUS_SUCCESS)
{
UnPrepareForShowImg();
ShowErrorString(emStatus);
return;
}
//发开始采集命令
emStatus = GXSendCommand(m_hDevice, GX_COMMAND_ACQUISITION_START);
if (emStatus != GX_STATUS_SUCCESS)
{
UnPrepareForShowImg();
ShowErrorString(emStatus);
return;
}
m_bIsSnap = TRUE;
SetTimer(0,1000,NULL);
// 更新界面UI
UpDateUI();
}
//---------------------------------------------------------------------------------
/**
\brief 采集回调函数:进行图像获取和显示操作
\param pFrame 回调参数
\return 无
*/
//----------------------------------------------------------------------------------
void __stdcall CGxAutoFuncCtrlDlg::OnFrameCallbackFun(GX_FRAME_CALLBACK_PARAM *pFrame)
{
CGxAutoFuncCtrlDlg *pDlg = (CGxAutoFuncCtrlDlg*)(pFrame->pUserParam);
VxUint32 nImageHeight = (VxUint32)pDlg->m_nImageHeight;
VxUint32 nImageWidth = (VxUint32)pDlg->m_nImageWidth;
if (pFrame->status == 0)
{
memcpy(pDlg->m_pRawBuffer, pFrame->pImgBuf, pFrame->nImgSize);
if (pDlg->m_bIsColorFilter)
{
// 彩色图像需要将Raw8图像经过RGB转换后显示
DxRaw8toRGB24(pDlg->m_pRawBuffer, pDlg->m_pImgBuffer, nImageWidth , nImageHeight, RAW2RGB_NEIGHBOUR,
DX_PIXEL_COLOR_FILTER(pDlg->m_nPixelColorFilter), TRUE);
}
else
{
// 黑白相机需要翻转数据后显示
for(VxUint32 i = 0; i < nImageHeight; i++)
{
memcpy(pDlg->m_pImgBuffer + i * nImageWidth, pDlg->m_pRawBuffer + (nImageHeight - i - 1) * nImageWidth, (size_t)nImageWidth);
}
}
// 显示图像
pDlg->DrawImg(pDlg->m_pImgBuffer);
}
}
//---------------------------------------------------------------------------------
/**
\brief 点击"停止采集"按钮消息响应函数
\return 无
*/
//----------------------------------------------------------------------------------
void CGxAutoFuncCtrlDlg::OnBnClickedBtnStopSnap()
{
// TODO: Add your control notification handler code here
GX_STATUS emStatus = GX_STATUS_SUCCESS;
//发送停止采集命令
emStatus = GXSendCommand(m_hDevice, GX_COMMAND_ACQUISITION_STOP);
GX_VERIFY(emStatus);
//注销回调
emStatus = GXUnregisterCaptureCallback(m_hDevice);
GX_VERIFY(emStatus);
m_bIsSnap = FALSE;
// 释放为采集图像开辟的图像Buffer
UnPrepareForShowImg();
// 停止Timer
KillTimer(0);
// 更新界面UI
UpDateUI();
}
//---------------------------------------------------------------------------------
/**
\brief 点击"关闭设备"按钮消息响应函数
\return 无
*/
//----------------------------------------------------------------------------------
void CGxAutoFuncCtrlDlg::OnBnClickedBtnCloseDevice()
{
// TODO: Add your control notification handler code here
GX_STATUS emStatus = GX_STATUS_SUCCESS;
// 未停采时则停止采集
if (m_bIsSnap)
{
//发送停止采集命令
emStatus = GXSendCommand(m_hDevice, GX_COMMAND_ACQUISITION_STOP);
if (emStatus != GX_STATUS_SUCCESS)
{
// 错误处理
}
//注销回调
emStatus = GXUnregisterCaptureCallback(m_hDevice);
if (emStatus != GX_STATUS_SUCCESS)
{
// 错误处理
}
m_bIsSnap = FALSE;
// 释放为采集图像开辟的图像Buffer
UnPrepareForShowImg();
// 停止Timer
KillTimer(0);
}
emStatus = GXCloseDevice(m_hDevice);
if (emStatus != GX_STATUS_SUCCESS)
{
// 错误处理
}
m_bDevOpened = FALSE;
m_hDevice = NULL;
// 更新界面UI
UpDateUI();
}