📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处
1.文件-导出-C++语言,之后会嵌入VC
2.新建一个VS中的MFC应用程序
3.更换窗口名称
4.VS配置
目的:VC与halcon建立联系,如果不配置那就无法进行访问。halcon相当于一个动态的链接库。VC中的编译器、连接器能连接到halcon中的算子,调用库文件,映射到VC进行执行。分为四个步骤进行:1.配置头文件.h 2.引用文件lib 3.dll动态库 4.包括头文件,命名空间。
注意:平台不要选错了,halcon是几位的就选多少位数的平台。
头文件目录(include所在路径):C:\Program Files\MVTec\HALCON-12.0\include和C:\Program Files\MVTec\HALCON-12.0\include\halconcpp,添加到下图所示的位置。
引用文件lib C:\Program Files\MVTec\HALCON-12.0\bin\x64-win64路径添加到下图所示的位置:
.添加dll动态库,将bin里面的文件全部拷贝到以capture image命名的文件夹中。该文件夹打开有两种方式,一种是指直接打开双击打开这个文件夹,其次是在VC界面右击capture image,选择在文件资源管理器中打开文件夹。
在链接器–输入中添加依赖项 halconcpp.lib
包含头文件,哪里需要调用halcon,就要添加它的头文件,代码:#include “halconcpp.h”。
添加命名空间。代码:using namespace HalconCpp; 注意是带有英文输入法下分号的。之后再编译一下,检测是否存在问题。
配置完成后接下来开始编译。
添加变量声明
从Halcon中导入到VC,主要由两个变量,一个是HObject:Halcon中的图像、区域以及XRD变量;其次是HTuple,其他的控制变量都是HTuple。
插入以下代码到全局或是局部变量中。
// Local iconic variables
HObject ho_Image100;
// Local control variables
HTuple hv_Width, hv_Height, hv_WindowHandle;
如果不添加会报错:
添加之后,报错消失:
5.复制导出的代码并调试
void CcaptureimageDlg::OnBnClickedButton1()
{
ReadImage(&ho_Image2, "C:/Users/Administrator/Pictures/故宫照片/2.jpg");
GetImageSize(ho_Image2, &hv_Width, &hv_Height);
SetWindowAttr("background_color", "black");
OpenWindow(0, 0, hv_Width / 4, hv_Height / 4, 0, "", "", &hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image2, HDevWindowStack::GetActive());
// TODO: 在此添加控件通知处理程序代码
}
6.将显示嵌套进VC界面
不嵌套的话就会向上面那样出现在左上角。
修改ID号,命名方式不固定。目的是为了后面图像能找到picture窗口。
//定义一个窗口句柄的局部变量
HWND **hwnd1**;
CRect rect;
**hwnd1**=GetDlgItem(IDC_ABC)->m_hWnd;
//Hlong lWWindowID = (Hlong)m_hWnd;
LONG lWWindowID = (LONG)hwnd1;
OpenWindow(0, 0, hv_Width / 4, hv_Height / 4, **lWWindowID**, "", "", &hv_WindowHandle);
lWWindowID处原本默认为0,也就是图像显示的位置在界面的左上角。修改成lWWindowID后,图像就会显示在该定义的区域。根据上面的代码可知,lWWindowID
HWND是Handle to A Window的缩写,窗口句柄。
7.图像铺满picture控件
需要记得控件的尺寸,包括长和宽,halcon转换成VC后,在原先的代码中添加m_kuan, m_gao对其定义,如下列:
HTuple hv_Width, hv_Height, hv_WindowHandle, m_kuan, m_gao;
附:全部代码
// captureimageDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "captureimage.h"
#include "captureimageDlg.h"
#include "afxdialogex.h"
#include "halconcpp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
using namespace HalconCpp;
// Local iconic variables
HObject ho_Image2;
// Local control variables
HTuple hv_Width, hv_Height, hv_WindowHandle, m_kuan, m_gao;
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CcaptureimageDlg 对话框
CcaptureimageDlg::CcaptureimageDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_CAPTUREIMAGE_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CcaptureimageDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CcaptureimageDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CcaptureimageDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CcaptureimageDlg 消息处理程序
BOOL CcaptureimageDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CcaptureimageDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CcaptureimageDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CcaptureimageDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CcaptureimageDlg::OnBnClickedButton1()
{
ReadImage(&ho_Image2, "C:/Users/Administrator/Pictures/故宫照片/2.jpg");
GetImageSize(ho_Image2, &hv_Width, &hv_Height);
SetWindowAttr("background_color", "black");
//定义一个窗口句柄的局部变量
HWND hwnd1;
CRect rect;
GetDlgItem(IDC_ABC)->GetWindowRect(&rect);
//获取picture控件的宽和长
hwnd1=GetDlgItem(IDC_ABC)->m_hWnd;
//Hlong lWWindowID = (Hlong)m_hWnd;
LONG lWWindowID = (LONG)hwnd1;
m_kuan[0] = rect.Width();
m_gao[0] = rect.Height();
OpenWindow(0, 0, m_kuan, m_gao, lWWindowID, "", "", &hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image2, HDevWindowStack::GetActive());
// TODO: 在此添加控件通知处理程序代码
}