概要
需求背景:
开发人员在Windows下用Halcon 23开发机器视觉的算法,成熟后,将算法导出,集成到Linux+QT的工程。
整体架构流程
-
Windows下Visual Studio 2022集成Qt 5.12.10版本:
参考这篇文章的一到三部分:Visual Studio 2022配置QT+OpenGL开发环境 -
Visual Studio 2022 下集成Halcon 23
因为本地已经安装了Halcon23, 所以用的是设置环境变量的方法,参考:Visual Studio 配置 Halcon C++ 运行环境 -
导出Halcon C++文件
参考这篇文章第四部分:Halcon与Qt联合编程方法二(C++版本)
或者第二部分 halcon 导出C++程序与visualstdio2019配置环境,在控制台显示一张图片
主要代码
- MainWindow.cpp
#include "MainWindow.h"
#include "qfiledialog.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//绑定窗口
Hlong WindID = (Hlong)ui.graphicsView->winId();//将视图窗口iD转换类型
//将halcon窗口绑定在graphicsView上,并以后用hv_WindowHandle来显示
OpenWindow(0, 0, ui.graphicsView->width(), ui.graphicsView->height(), WindID, "visible", "", &hv_WindowHandle);
//connect the button listener event
//connect(ui.ReadImage, SIGNAL(clicked()), this, SLOT(on_ReadImage_clicked()));
}
void MainWindow::on_ReadImage_clicked()
{
QString path = QFileDialog::getOpenFileName(this, "Slect Image", "", "(*.png *.jpg)");
ReadImage(&ho_rgbimg, HTuple(path.toStdString().c_str()));
Hlong WindID = (Hlong)ui.graphicsView->winId();//将视图窗口iD转换类型
GetImageSize(ho_rgbimg, &hv_Width, &hv_Height);//获取图片宽高
SetWindowAttr("background_color", "black");
SetPart(hv_WindowHandle, 0, 0, hv_Height, hv_Width);//自适应显示
ClearWindow(hv_WindowHandle);//清空窗口
DispObj(ho_rgbimg, hv_WindowHandle);
}
void MainWindow::on_Detect_clicked()
{
ClearWindow(hv_WindowHandle);//清空窗口
}
MainWindow::~MainWindow()
{}
- MainWindow.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_MainWindow.h"
#include "HalconCpp.h"
#include "Halcon.h"
#include "HDevThread.h"
using namespace HalconCpp;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_ReadImage_clicked();
void on_Detect_clicked();
private:
Ui::MainWindowClass ui;
protected:
//Local iconic variables
Hlong WindowHandle;
HObject ho_rgbimg;
HTuple hv_WindowHandle,hv_Width,hv_Height;
};
技术细节
- 利用graphicsView显示图片:
- 应用graphicsView.show()方法,参考Qt 在GraphicsView中 打开一幅图片
{
QString fileName = QFileDialog::getOpenFileName(
this, "open image file",
".",
"Image files (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;All files (*.*)");
if(fileName != "")
{
if(image->load(fileName))
{
QGraphicsScene *scene = new QGraphicsScene;
scene->addPixmap(QPixmap::fromImage(*image));
ui->graphicsView->setScene(scene);
ui->graphicsView->resize(image->width() + 10, image->height() + 10);
ui->graphicsView->show();
}
}
}
- 利用OpenWindow方法,见上文MainWindow.cpp
小结
Qt 安装的是5.12.10版本,不能在Qt中利用visual studio 2022的编译器来编译桌面应用程序,所以选择用visual studio 2022来开发。
下一步,将Halcon C++代码导入到linux + Qt, 需要将Halcon的相关库文件拷贝到Linux Qt的相关母驴