在大致掌握了MFC编程的基础上,接下来混合MFC进行编程,所以在这里小石讲所学的东西,总结下来,好记性不如烂笔头,也希望这些文章能够帮助更多的想学习机器视觉的朋友。
直接上图: (请忽视打开相机和关闭相机)
一、界面
第一步,按照上图所示,拉出两个图片空间,和两个按钮分别为读取图片和图像识别。
二、添加消息处理函数
第二部,双击读取图片按钮,添加消息处理函数
/*********************************************************************
*函数名称:CQr_codeDlg::OnBnClickedButton2()
*输 入:无
*输 出:无
*描 述:当点击读取文件按钮的时候,会触发此函数,创建文件对话框
*作 者:石润发
*********************************************************************/
void CQr_codeDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//1. 设置过滤器
HObject ho_Image;
HTuple hv_Width, hv_Height, hv_WindowHandle,hv_FilePath;
CString path ;
char* pcsun="图片文件(*.bmp)|*.bmp||";
//2.构造文件对话框对象
CFileDialog readfileDlg(TRUE,NULL,NULL,0,pcsun,this);
if(IDOK ==readfileDlg.DoModal()) //当点击确定按钮时候,会记录文件路径
{
path = readfileDlg.GetPathName();
}
else
{
return;
}
hv_FilePath[0] =(char *)path.GetBuffer(); //涉及到数据转换、
//char* ch = (char*) LPCTSTR(path);
ReadImage(&ho_Image,hv_FilePath); //读取文件
CRect m_rect; //创建矩阵
GetDlgItem(IDC_STATIC)->GetWindowRect(&m_rect); //讲图片空间的大小保存
HWND hwnd1= GetDlgItem(IDC_STATIC)->m_hWnd;
LONG LWindowID = (long)hwnd1;
OpenWindow(0,0,m_rect.Width(),m_rect.Height(),LWindowID,"visible","",&hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image, HDevWindowStack::GetActive());
}
第三部、对图像识别添加消息处理函数
/*********************************************************************
*函数名称:CQr_codeDlg::OnBnClickedButton3()
*输 入:无
*输 出:无
*描 述:当点图像识别按钮的时候,会触发此函数,进行图像识别(简单阈值处理)
*作 者:石润发
*********************************************************************/
void CQr_codeDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
Decompose3(ho_Image, &ho_R, &ho_G, &ho_B);
Threshold(ho_R, &ho_Regions, 122, 255);
CRect m_rect;
GetDlgItem(IDC_STATIC)->GetWindowRect(&m_rect);
HWND hwnd1= GetDlgItem(IDC_STATIC2)->m_hWnd;
LONG LWindowID = (long)hwnd1;
OpenWindow(0,0,m_rect.Width(),m_rect.Height(),LWindowID,"visible","",&hv_WindowHandle2);
HDevWindowStack::Push(hv_WindowHandle2);
if (HDevWindowStack::IsOpen())
DispObj(ho_Regions, HDevWindowStack::GetActive());
}
三、问题处理
问题一:通过readfileDlg.GetPathName()获得的文件路径是CString类型,而Halcon中的read_image需要的类型为HTuple,而这两种数据结构之间似乎不能进行类型转换。
解决办法:查阅资料后可以知道,可以有三种方法对数据进行转换 1。hv_FilePath[0] =(char )path.GetBuffer(); 2。//char ch = (char*) LPCTSTR(path); 3。char* Filename = path.GetBuffer(path.GetLength()+1);