目录
1、背景
在视觉项目开发过程中碰到了需要使用Halcon进行图像算法开发的需求,估计很多视觉工程师都用到过Halcon软件开发库,但是完成Halcon算法开发后就会遇到一个问题,就是图像的显示、读写、UI交互等问题,由于Halcon具有特殊的图像文件格式HObject和数据格式HTuple,所以说需要格式转换后才能实现相对应的操作,不过Halcon本身也有比较实用的显示、界面交互的功能,所以如何在C++或QT下使用这些功能成为了接下来需要去研究和实践的工作。
2、参考信息
Halcon针对不同的开发环境,给出了不同的开发例程,针对图形显示及界面操作这一块,Halcon只给出了C#的相关例程,其运行结果如下:
其中可以实现在窗口界面创建矩形、圆、椭圆等形状的Region,并根据鼠标来选择、拖动和设置尺寸,并实现设置颜色,获取坐标,region区内二值化、轮廓化等一系列后续操作。
3、目标
实现在QT环境下,将Halcon窗口贴在QT的控件上,并实现上述创建和操作region的基本动作。
4、步骤
4.1 Halcon库的配置
本人使用的是Halcon12.0的破解版,目前调用Halcon的函数不会出错,但是项目中有调用新版本的Halcon库有出错状况,目前未查证是不是版本的问题,Halcon配置主要在PRO文件中添加Include和Lib的引用路径。其中HALCONROOT是环境变量中Halcon的安装路径。
#includes
INCLUDEPATH += "$$(HALCONROOT)/include"
INCLUDEPATH += "$$(HALCONROOT)/include/halconcpp"
#libs
QMAKE_LIBDIR += "$$(HALCONROOT)/lib/$$(HALCONARCH)"
unix:LIBS += -lhalconcpp -lhalcon -lXext -lX11 -ldl -lpthread
win32:LIBS += "$$(HALCONROOT)/lib/$$(HALCONARCH)/halconcpp.lib" \
"$$(HALCONROOT)/lib/$$(HALCONARCH)/halcon.lib"
4.2 读取图像,并实现图像自适应窗体控件大小
这里我首先创建了一个QHalconWindow类,然后在qt的ui界面将widget提升为QHalconWindow类,这样就免去了Halcon窗口句柄和ui句柄的绑定,直接通过QHalconWindow类来调用就行。
qhalconwindow.h文件
#include <QObject>
#include <QWidget>
#include "HalconCpp.h"
class QHalconWindow : public QWidget
{
Q_OBJECT
public:
explicit QHalconWindow(QWidget *parent = 0,long Width=0,long Height=0);
virtual ~QHalconWindow(void);
HalconCpp::HTuple WindowID(void) {return WinID;} //f返回窗口句柄
protected:
void resizeEvent(QResizeEvent*); //窗口大小尺寸调整事件
private:
HalconCpp::HTuple WinID;
void OpenWindow(void);
}
Cpp文件主要是关于窗口基本操作的实现函数
#include "qhalconwindow.h"
using namespace HalconCpp;
QHalconWindow::QHalconWindow(QWidget *parent,long Width,long Height)
: QWidget(parent)
{
resize(Width,Height);
show();
OpenWindow();
}
QHalconWindow::~QHalconWindow(void)
{
CloseWindow(WindowID());
}
void QHalconWindow::OpenWindow(void)
{
SetWindowAttr("border_width",0);
SetCheck("~father");
HalconCpp::OpenWindow(0,0,100,100,(Hlong)winId(),"visible","",&WinID);
SetCheck("father");
}
//修改窗口尺寸
void QHalconWindow::resizeEvent(QResizeEvent *)
{
SetWindowExtents(WindowID(),0,0,width(),height());
}
参考Halcon中关于SetDrawingObjectCallback函数的描述,需要在c++下面调用时,调用C++格式