关于MFC调用USB连接的摄像头拍照保存在本地文件的问题

sinat_42272412 2018-05-25 11:50:42
我用的大恒图像公司的水星系列摄像头,他们自带的软件里有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();
}
...全文
1444 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_42272412 2018-05-26
  • 打赏
  • 举报
回复
引用 4 楼 scsjhkxx 的回复:
大恒水星系列我也试用过,他是有保存图片的接口呀,你可以问问他们公司技术?
你知道他们有个光电控制开关么?
scsjhkxx 2018-05-25
  • 打赏
  • 举报
回复
大恒水星系列我也试用过,他是有保存图片的接口呀,你可以问问他们公司技术?
chen_JADE 2018-05-25
  • 打赏
  • 举报
回复
拍照后,将图像保存到缓存中,然后使用writefile将缓存的图片写到本地。
red-fly 2018-05-25
  • 打赏
  • 举报
回复
如果SDK没有自动保存的接口,那就要自己来保存了。 在 OnFrameCallbackFun() 函数中, 在 pDlg->DrawImg(pDlg->m_pImgBuffer); 一行的后面,可以加入自己的保存代码,即把 pDlg->m_pImgBuffer 的内容保存到文件,至于位置,随便你去指定

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧