Halcon11与VS2010联合开发

刚开始学习Halcon,需要使用Halcon与C++联合开发软件,查了网上的资料都是Halcon10的,我用的是Halcon11和VS2010的开发环境,实践了一下发现有一些问题,于是把自己的配置的过程写出来共享一下。

首先新建一个Halcon工程,这里用个读入图片的简单例子。

新建一个Halcon 程序,输入以下代码:

read_image (Image, ‘C:/Users/lenovo/Desktop/test.jpg‘)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_clear_window ()
dev_display (Image)

其实就是打开一个窗口并显示桌面上的一幅画

然后将Halcon程序导出为C++程序

在halcon中点击菜单栏的文件->导出。

导出之后就能在桌面上看到一个Halcon.cpp文件,这个文件的内容如下:

先声明并给出了函数dev_open_window_fit_image 的定义:

void dev_open_window_fit_image (HObject ho_Image, HTuple hv_Row, HTuple hv_Column,
    HTuple hv_WidthLimit, HTuple hv_HeightLimit, HTuple *hv_WindowHandle);

然后是函数Action的定义,Action里的代码对应着刚才Halcon中的代码,简单地说,就是把Halcon语言翻译成C++了。

// Main procedure
void action()
{
  // Local iconic variables
  HObject  ho_Image;
  // Local control variables
  HTuple  hv_WindowHandle;
  ReadImage(&ho_Image, "C:/Users/lenovo/Desktop/test.jpg");
  dev_open_window_fit_image(ho_Image, 0, 0, -1, -1, &hv_WindowHandle);
  if (HDevWindowStack::IsOpen())
    ClearWindow(HDevWindowStack::GetActive());
  if (HDevWindowStack::IsOpen())
    DispObj(ho_Image, HDevWindowStack::GetActive());
}

配置VS2010

为了一劳永逸的配置好VS2010,让我们在以后每次新建工程的时候都不用重新添加这些乱七八糟的配置项,需要采用以下的技巧。
首先新建一个基于对话框的MFC程序,然后点击菜单栏的视图->属性管理器,在左侧的属性管理器中,默认会有32位的Debug和Release属性。对64位的系统(现在电脑一般都是64位系统),需要点击菜单栏的生成->配置管理器,把平台选项改为x64,这样生成的文件就可以在64位系统下运行了。

配置VS2010

为了一劳永逸的配置好VS2010,让我们在以后每次新建工程的时候都不用重新添加这些乱七八糟的配置项,需要采用以下的技巧。
首先新建一个基于对话框的MFC程序,然后点击菜单栏的视图->属性管理器,在左侧的属性管理器中,默认会有32位的Debug和Release属性。对64位的系统(现在电脑一般都是64位系统),需要点击菜单栏的生成->配置管理器,把平台选项改为x64,这样生成的文件就可以在64位系统下运行了。
 
 
改完之后,属性管理器还不会立马变化,关闭项目再重新开启就能看到新增的x64属性了。

下面以64位的Debug属性为例,介绍一下halcon 11的配置。

在User属性上点击右键,选择属性,进入属性页面。

向通用属性下的VC++目录中的包含目录中添加如下目录,据说halcon11需要包含halconcpp这个文件夹就够了,halcon10则是cpp。我用的是halcon11,打开安装目录之后发现两个文件夹都有,于是就把俩目录都添加进去了。

下一步是VC++目录中的库目录。

目录中的环境变量HALCONROOT是安装Halcon时自动写入到系统环境变量中的。

继续,在C/C++目录中,为附加包含目录添加下面两项(当然也可以添加$(HALCONROOT)\include\cpp这一项,并无影响)

最有一项,配置链接器。在常规项的附加库目录中添加$(HALCONROOT)\lib\$(HALCONARCH),同样,HALCONARCH是环境变量。

为输入的附加依赖项添加halconcpp.lib。

至此,配置完毕。

注意,采用这种方式配置,以后新建的工程都会继承这些配置,无需重新配置,非常方便。

MFC程序

点击菜单栏中的视图->资源视图,并在资源视图中打开对话框。

为了实现显示图片的功能,在对话框中添加一个按钮,并双击按钮进入事件响应函数,空空如也,待我们填写。

void CHalconVCDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
}

首先在HalconVCDlg.h中添加头文件及命名空间,因为等会要在这个头文件里添加halcon函数的声明。然后在HalconVCDlg.cpp中也添加上述头文件及命名空间,因为要在这里调用halcon的函数。

#include "halconcpp.h"

using namespace HalconCpp;

打开刚刚导出的Halcon.cpp,为了能够在MFC中调用dev_open_window_fit_image 这个函数,需要把它的声明和定义都放进MFC程序中。声明拷贝到HalconVCDlg.h中,注意要放在对话框类声明外面,定义拷贝到HalconVCDlg.cpp中。

下面进行最重要的一部,把Action中的代码拷贝到OnBnClickedButton1() 中,这样点击按钮就会执行在halcon中实现的显示图片功能了。

Action函数中定义了两个变量
HObject ho_Image;
HTuple hv_WindowHandle; 
为了在Button1的响应函数中使用这两个变量,之前博文中的作法是将其定义为HalconVCDlg.h中对话框类的成员变量,事实上,直接定义在void CHalconVCDlg::OnBnClickedButton1() 函数中或者是HalconVCDlg.cpp文件中也是没有问题的,但是定义在HalconVCDlg.h中作为HalconVCDlg的类外变量却不行。
了解到这一点,我们就可以直接把Action函数中所有东西一起拷贝进OnBnClickedButton1()了。
  // Local iconic variables
  HObject  ho_Image;
  // Local control variables
  HTuple  hv_WindowHandle;
  ReadImage(&ho_Image, "C:/Users/lenovo/Desktop/test.jpg");
  dev_open_window_fit_image(ho_Image, 0, 0, -1, -1, &hv_WindowHandle);
  if (HDevWindowStack::IsOpen())
    ClearWindow(HDevWindowStack::GetActive());
  if (HDevWindowStack::IsOpen())
    DispObj(ho_Image, HDevWindowStack::GetActive());

运行结果

每点击一次Button1就会弹出一个窗口显示我们的图片(没错,这是一张我桌面的截图)

全部程序代码

MFC程序中HalconVCDlg.h

// HalconVCDlg.h : 头文件
#pragma once

//与halcon有关的头文件
#include "halconcpp.h"
using namespace HalconCpp;

// CHalconVCDlg 对话框
class CHalconVCDlg : public CDialogEx
{
// 构造
public:
	CHalconVCDlg(CWnd* pParent = NULL);	// 标准构造函数
	//Halcon中用到的变量,为何要定义为类中的变量
	//HObject  ho_Image;
	//HTuple  hv_WindowHandle;
// 对话框数据
	enum { IDD = IDD_HALCONVC_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持

// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
};
void dev_open_window_fit_image (HObject ho_Image, HTuple hv_Row, HTuple hv_Column,
    HTuple hv_WidthLimit, HTuple hv_HeightLimit, HTuple *hv_WindowHandle);
MFC程序中HalconVCDlg.cpp
// HalconVCDlg.cpp : 实现文件
#include "stdafx.h"
#include "HalconVC.h"
#include "HalconVCDlg.h"
#include "afxdialogex.h"
//与halcon有关的头文件
#include "halconcpp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

using namespace HalconCpp;
中间省略一堆系统生成的函数,下面是我们主要的改动
 
// Procedures
// Chapter: Develop
// Short Description: Open a new graphics window that preserves the aspect ratio of the given image.
void dev_open_window_fit_image (HObject ho_Image, HTuple hv_Row, HTuple hv_Column,
    HTuple hv_WidthLimit, HTuple hv_HeightLimit, HTuple *hv_WindowHandle)
{

  // Local control variables
  HTuple  hv_MinWidth, hv_MaxWidth, hv_MinHeight;
  HTuple  hv_MaxHeight, hv_ResizeFactor, hv_ImageWidth, hv_ImageHeight;
  HTuple  hv_TempWidth, hv_TempHeight, hv_WindowWidth, hv_WindowHeight;

  //This procedure opens a new graphics window and adjusts the size
  //such that it fits into the limits specified by WidthLimit
  //and HeightLimit, but also maintains the correct image aspect ratio.
  //
  //If it is impossible to match the minimum and maximum extent requirements
  //at the same time (f.e. if the image is very long but narrow),
  //the maximum value gets a higher priority,
  //
  //Parse input tuple WidthLimit
  if (0 != (HTuple((hv_WidthLimit.TupleLength())==0).TupleOr(hv_WidthLimit<0)))
  {
    hv_MinWidth = 500;
    hv_MaxWidth = 800;
  }
  else if (0 != ((hv_WidthLimit.TupleLength())==1))
  {
    hv_MinWidth = 0;
    hv_MaxWidth = hv_WidthLimit;
  }
  else
  {
    hv_MinWidth = ((const HTuple&)hv_WidthLimit)[0];
    hv_MaxWidth = ((const HTuple&)hv_WidthLimit)[1];
  }
  //Parse input tuple HeightLimit
  if (0 != (HTuple((hv_HeightLimit.TupleLength())==0).TupleOr(hv_HeightLimit<0)))
  {
    hv_MinHeight = 400;
    hv_MaxHeight = 600;
  }
  else if (0 != ((hv_HeightLimit.TupleLength())==1))
  {
    hv_MinHeight = 0;
    hv_MaxHeight = hv_HeightLimit;
  }
  else
  {
    hv_MinHeight = ((const HTuple&)hv_HeightLimit)[0];
    hv_MaxHeight = ((const HTuple&)hv_HeightLimit)[1];
  }
  //
  //Test, if window size has to be changed.
  hv_ResizeFactor = 1;
  GetImageSize(ho_Image, &hv_ImageWidth, &hv_ImageHeight);
  //First, expand window to the minimum extents (if necessary).
  if (0 != (HTuple(hv_MinWidth>hv_ImageWidth).TupleOr(hv_MinHeight>hv_ImageHeight)))
  {
    hv_ResizeFactor = (((hv_MinWidth.TupleReal())/hv_ImageWidth).TupleConcat((hv_MinHeight.TupleReal())/hv_ImageHeight)).TupleMax();
  }
  hv_TempWidth = hv_ImageWidth*hv_ResizeFactor;
  hv_TempHeight = hv_ImageHeight*hv_ResizeFactor;
  //Then, shrink window to maximum extents (if necessary).
  if (0 != (HTuple(hv_MaxWidth<hv_TempWidth).TupleOr(hv_MaxHeight<hv_TempHeight)))
  {
    hv_ResizeFactor = hv_ResizeFactor*((((hv_MaxWidth.TupleReal())/hv_TempWidth).TupleConcat((hv_MaxHeight.TupleReal())/hv_TempHeight)).TupleMin());
  }
  hv_WindowWidth = hv_ImageWidth*hv_ResizeFactor;
  hv_WindowHeight = hv_ImageHeight*hv_ResizeFactor;
  //Resize window
  SetWindowAttr("background_color","black");
  OpenWindow(hv_Row,hv_Column,hv_WindowWidth,hv_WindowHeight,0,"","",&(*hv_WindowHandle));
  HDevWindowStack::Push((*hv_WindowHandle));
  if (HDevWindowStack::IsOpen())
    SetPart(HDevWindowStack::GetActive(),0, 0, hv_ImageHeight-1, hv_ImageWidth-1);
  return;
}

void CHalconVCDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	HObject  ho_Image;
	HTuple  hv_WindowHandle;
	ReadImage(&ho_Image, "C:/Users/lenovo/Desktop/test.jpg");
   dev_open_window_fit_image(ho_Image, 0, 0, -1, -1, &hv_WindowHandle);
	//open_window(0,0,600,600,0,"","",&hv_WindowHandle);
  if (HDevWindowStack::IsOpen())
    ClearWindow(HDevWindowStack::GetActive());
  if (HDevWindowStack::IsOpen())
    DispObj(ho_Image, HDevWindowStack::GetActive());
}
时间: 2024-10-13 07:58:33

Halcon11与VS2010联合开发的相关文章

win7 环境安装Python + IDE(vs2010)开发

1.下载python安装文件 python-2.7.10.msi 网址:https://www.python.org/downloads/release/python-2710/ ,根据自己环境,选择合适的版本, 因为需要与项目对接,选择2.7版本32位安装文件,虽然现在已经出现3.0版本. 可以选择默认安装路径,一路确定安装即可,如我的默认安装路径:C:\Python27 2. 配置环境变量 (1)配置环境变量,将刚才安装的位置,在计算机高级环境变量中的path变量的值后面添加如下内容 :C:

搭建vs2010 boost开发环境

一.编译boost库 第一步:下载boost库,下载地址http://sourceforge.net/projects/boost/files/boost/1.55.0/ 第二部:解压boost库,例如解压到F:\Third-party libs\boost\boost_1_55_0 第三部:开始->程序->MicrosoftVisual Studio 2010->Visual Studio Tools->Visual Studio 命令提示(2010),打开一个控制台 第四部:c

【OpenCV入门教程之一】 OpenCV 2.4.8 +VS2010的开发环境配置

目录(?)[-] 因为读研期间的研究方向是图像处理所以浅墨这段时间闭门研究了很多OpenCV和图像处理相关的知识与内容眼看自己积累到一定的程度了于是决定开始开设这个OpenCV系列专栏总结自己所学也分享知识给大家 还是先放出待会儿的测试用图 下载和安装OpenCV SDK sources里面是源代码想查看完整的源代码需要用cmake来解包如何解包大家百度一下就可以或者下次浅墨来专门讲一讲这里就先不多说了 配置环境变量 工程包含include目录的配置 工程库lib目录的配置 链接库的配置 在Wi

在VS2010环境开发Teamcenter ITK

前言 这个是几个月前学习ITK开发时,领导要求整理的学习笔记.最近同事要做ITK开发,就发给他了.感觉这篇文章对别人还是有帮助的,决定分享出来. ITK的开发分两种:batch program和handler ,其实就是exe和dll.因为teamcenter底层是用c实现的,ITK也开放了相关接口,ITK开发本质上就是纯粹的C开发.有C/C++开发基础的上手应该很快. 系统环境:Windows 7 X64 开发环境:VS2008 + VS2010 ultimate Teamcenter Ver

ASP.NET4 与 VS2010 Web 开发页面服务改进

转:http://blog.163.com/kele_lipeng/blog/static/81345278201132754729336/ 作者:朱先忠 本文将接着上一篇 ASP.NET4与VS2010Web开发核心服务改进 继续讨论核心ASP.NET服务方面的改进. 四.永久重定向页面 一种常见的Web应用程序做法是,随着时间的推移经常移动网页和其他内容,从而导致搜索引擎失效链接的积累.在ASP.NET中,开发商通常采用的处理旧网址请求的方案是,使用 Response.Redirect方法把

Win7 VS2010下开发的CS软件,安装到XP下无法运行或者桌面快捷方式无法显示图标的问题解决方法

1.最近做了一个项目是在win7 下使用VS2010开发的WinForm软件,在本机运行正常,之后打包安装之后,发现桌面快捷方式无法显示,找了很久,网上资料查了又查,最有在一位朋友的博文提醒下终于搞定了,我发现我的ico图标是150*170px的,一位网友说在XP或者win7下窗口图标或者快捷方式图标大小不能超过128*128px,受此启发,我将图片修改为100*100px,然后使用,结果却是可以显示了,总结,xp或win7下窗口图标或者快捷方式图标大小最好不能超过128*128px,否则导致图

Linux+Windows+ARM联合开发

配置环境一: 第一步:安装虚拟机 1)安装虚拟机+Linux12.04 2)安装FTP软件 第二步:配置超级终端(串口) 1)开发板软件(友善之臂自带)安装 2)下载超级终端:http://www.newasp.net/soft/16364.html 注:网上下载的跟winXP一样的超级终端不太好用,老是断,经验证,这个破解版本较好. 3)设置串口.波特率进行连接. 第三步:修改ARM开发板IP地址为静态地址 1)到目录下: cd /etc/init.d/ 2)打开ifconfig-eth0文件

VS2010+WDK开发环境搭建最简易方法

这是目前编译驱动程序,开发驱动程序最方便.最亲切.最自然的方法. 1.制作一个文本文件,(名称如:wdkproperty.props) 2.放入你的project目录内, 3.在property manager中加入这个wdkproperty.props,项目即可直接编译成功,.sys文件出来了. 4.自动区分debug,release版本,注意生成目录路径. 5.注意:我的WDK安装在D:\DDK7600 wdkproperty.props 1 <?xml version="1.0&qu

【MATLAB】matlabR2010a与vs2010联合编译设置

在matlab中编译C++程序,首先要配置编译器>> mex -setupPlease choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers [y]/n? y Select a compiler: [1] Lcc-win32 C 2.4.1 in D:\MATLAB\R2010a\sys\lcc [2] Microsof