【Halcon基础】halcon联合vs实现图像显示

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【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: 在此添加控件通知处理程序代码
}

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌小超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值