1.Halcon代码的导出
导出为C++语言,进行机器视觉应用
在halcon界面的菜单栏项上选择“文件”---“导出”,界面如下
导出之后,在上述导出文件的路径下,你就可以看到程序了,此时这个程序就和halcon没有关系了,就是独立的cpp文件了。
2. Halcon联合VS编程
2.1 QT工程建立
2.2 把halcon相关库文件,放到当前目录下
2.3 工程属性进行配置
项目--属性--C/C++--常规--附加包含目录--添加$(SolutionDir)halconvs\halconvs\Halcon\include目录
链接器--常规--附加库目录--添加$(SolutionDir)halconvs\Halcon\lib目录
链接器--输入--附加依赖项--添加halcon.lib halconcpp.lib hdevenginecpp.lib
至此,环境搭配好。
下面实现一个halconHalcon库,在Qt界面打开显示图片,可实现多次打开不同图片
Halcon读取文件,获得graphicsView或者QLabel控件句柄,绑定它们,再显示。
头文件如下:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_halconvs.h"
class HalconVs : public QMainWindow
{
Q_OBJECT
public:
HalconVs(QWidget *parent = Q_NULLPTR);
~HalconVs();
private slots:
void on_pushButton_clicked();
private:
void showPic(const QString &path);
private:
Ui::HalconVsClass ui;
};
源文件:
#include "halconvs.h"
#include <QFileDialog>
#ifndef __APPLE__
# include "HalconCpp.h"
# include "HDevThread.h"
# if defined(__linux__) && (defined(__i386__) || defined(__x86_64__)) \
&& !defined(NO_EXPORT_APP_MAIN)
# include <X11/Xlib.h>
# endif
#else
# ifndef HC_LARGE_IMAGES
# include <HALCONCpp/HalconCpp.h>
# include <HALCONCpp/HDevThread.h>
# else
# include <HALCONCppxl/HalconCpp.h>
# include <HALCONCppxl/HDevThread.h>
# endif
# include <stdio.h>
# include <HALCON/HpThread.h>
# include <CoreFoundation/CFRunLoop.h>
#endif
using namespace HalconCpp;
HalconVs::HalconVs(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
HalconVs::~HalconVs()
{
}
void HalconVs::on_pushButton_clicked()
{
QFileDialog *fileDlg = new QFileDialog(this);
fileDlg->setWindowTitle(tr("打开图片"));
QStringList qstrFilters;
qstrFilters << "Images (*.png *.bmp *.jpg)";
qstrFilters << "All files(*)";
fileDlg->setNameFilters(qstrFilters); //设置文件过滤器
fileDlg->setFileMode(QFileDialog::ExistingFile); //设置选择单文件,如果是多个文件就写成ExistingFiles
fileDlg->setAcceptMode(QFileDialog::AcceptOpen);
if (fileDlg->exec() == QDialog::Accepted)
{
QStringList strPathList = fileDlg->selectedFiles();
if (strPathList.count() > 0)
{
showPic(strPathList.at(0));
}
}
fileDlg->close();
delete fileDlg;
fileDlg = nullptr;
}
void HalconVs::showPic(const QString & path)
{
HObject ho_Image;
HTuple hv_Width, hv_Height, hv_WindowHandle1, hv_WindowHandle2;
std::string p1 = path.toStdString();
const char *p2 = p1.c_str();
try
{
//打开图片
ReadImage(&ho_Image, p2); //读取图片
GetImageSize(ho_Image, &hv_Width, &hv_Height); //获得图像宽高
std::cout << hv_Width.I() << std::endl;
std::cout << hv_Height.I() << std::endl;
//清除缓存
if (HDevWindowStack::IsOpen())
{
CloseWindow(HDevWindowStack::Pop()); //这段话很重要,否则无法连续打开图像显示,仅仅固定显示第一次打开的图
}
if (HDevWindowStack::IsOpen())
{
CloseWindow(HDevWindowStack::Pop()); //这段话很重要,否则无法连续打开图像显示,仅仅固定显示第一次打开的图
}
//显示在graphicsView控件
Hlong wndView = (Hlong)ui.graphicsView->winId(); //获得graphicsView控件句柄
OpenWindow(0, 0, ui.graphicsView->width(), ui.graphicsView->height(), wndView, "visible", "", &hv_WindowHandle1); //打开窗口
HDevWindowStack::Push(hv_WindowHandle1); //这段话很重要,否则无法连续打开图像显示
SetPart(hv_WindowHandle1, 0, 0, hv_Height, hv_Width); //自适应窗口
DispObj(ho_Image, hv_WindowHandle1); //graphicsView控件显示
//显示在QLabel控件
Hlong wndLabel = (Hlong)ui.label_pic->winId(); //获得Lable控件句柄
OpenWindow(0, 0, ui.label_pic->width(), ui.label_pic->height(), wndLabel, "visible", "", &hv_WindowHandle2); //打开窗口
HDevWindowStack::Push(hv_WindowHandle2); //这段话很重要,否则无法连续打开图像显示
SetPart(hv_WindowHandle2, 0, 0, hv_Height, hv_Width); //自适应窗口
DispObj(ho_Image, hv_WindowHandle2); //label显示
}
catch (...)
{
std::cout << "err" << std::endl;
}
}