Halcon 学习笔记九:MFC+halcon联合
一、halcon导出cpp文件
首先在halcon中,读取图片,获得图片宽高,打开窗口,显示图片(如果不调用,在c++中无法显示)
read_image (Image, 'C:/Users/xuheding/Desktop/图片/5.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (Image)
然后导出
可以看到a.cpp文件,就是我们刚才导出的文件
action里面就是我们主要的内容
二、新建工程
打开VS2019,选择创建新项目,MFC应用程序,应用程序类型,选择基于对话框
1.然后修改窗体的名字,选择窗体,右击,属性,找到描述文字,修改为“图像采集显示”
2.托一个picture control,用来显示图片
3.托一个Button,描述文字修改为采集显示
三、配置
注意64位和32位的区别,不然是没法配置成功的。
1.首先配置头文件 .h
点击项目-》属性-》c/c++ -》常规 -》附加包含目录
将这两个目录进行添加
2. 配置链接器库目录 lib文件
点击链接器->常规->附加库目录
这一步仅仅是添加了库的目录,现在把想要用的lib文件添加进去
在链接器->输入->附加依赖项中 添加要使用的库文件
3.配置动态链接库 dll
进入C:\Program Files\MVTec\HALCON-18.11-Progress\bin\x64-win64
把所有的dll拷贝到当前工程的目录下,当然我们不是所有的都用到,只用到部分dll。
还有一种方法是把C:\Program Files\MVTec\HALCON-18.11-Progress\bin\x64-win64加入到环境变量中去
四、测试是否配置成功
在dlg结尾的文件中,添加头文件和命名空间
然后可以测试下能不能用了
添加全局变量
HObject ho_Image;
HTuple hv_Width, hv_Height, hv_WindowHandle;
在按钮点击事件下添加
(注意ReadImage的路径下不能有中文)
void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
ReadImage(&ho_Image, //'C:/Users/xuheding/Desktop/image/5.png'
"C:/Users/xuheding/Desktop/image/5.png");
}
点击 生成->重新生成解决方案,若通过即可
五、添加程序
然后把剩下的拷贝过去
在单击显示按钮下面
void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
ReadImage(&ho_Image, "C:/Users/xuheding/Desktop/image/5.png");
GetImageSize(ho_Image, &hv_Width, &hv_Height);
SetWindowAttr("background_color", "black");
OpenWindow(0, 0, hv_Width / 2, hv_Height / 2, 0, "visible", "", &hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image, HDevWindowStack::GetActive());
}
会发现图像显示在想要的窗口外边
因此要添加窗口的句柄上去
点击Picture Control的属性,更换ID
添加句柄
//创建PictureControl的句柄
HWND hwndl;
hwndl = GetDlgItem(IDC_PIC)->m_hWnd;
LONG lWWindowID = (LONG)hwndl;
//将句柄0替换成想要的窗体的句柄
OpenWindow(0, 0, hv_Width / 2, hv_Height / 2, lWWindowID, "visible", "", &hv_WindowHandle);
//OpenWindow(0, 0, hv_Width / 2, hv_Height / 2, 0, "visible", "", &hv_WindowHandle);
由于图像比较大,而窗口比较小,图像没法显示全
那就只能通过限制打开的窗口大小,为图片控件的大小,那样显示的图片就会占据整个控件
void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
ReadImage(&ho_Image, "C:/Users/xuheding/Desktop/image/5.png");
GetImageSize(ho_Image, &hv_Width, &hv_Height);
SetWindowAttr("background_color", "black");
//创建PictureControl的句柄
HWND hwndl;
hwndl = GetDlgItem(IDC_PIC)->m_hWnd;
LONG lWWindowID = (LONG)hwndl;
//获取PictureControl窗口大小
CRect rect;
GetDlgItem(IDC_PIC)->GetWindowRect(&rect);
m_w[0] = rect.Width();//m_w为HTuple类型,只装一个值,所以取索引0
m_h[0] = rect.Height();
//将句柄0替换成想要的窗体的句柄
OpenWindow(0, 0, m_w, m_h, lWWindowID, "visible", "", &hv_WindowHandle);
//OpenWindow(0, 0, hv_Width/2, hv_Height/2, 0, "visible", "", &hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image, HDevWindowStack::GetActive());
}
如果今后的例子中出现了图像只显示了部分