(一)MFC&Halcon混合编程之文件对话框打开图像。

在大致掌握了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);

猜你喜欢

转载自blog.csdn.net/m0_37863832/article/details/80645298