qt联合halcon视觉流程框架 正常编译 测试正常 qt5.12.4

直接上手搞Qt+Halcon的环境配置可能会遇到不少坑,这里分享下我的踩坑记录。先说下环境:Qt5.12.4+VS2017,Halcon用的是20.11版本。整个过程最头疼的就是动态库加载和内存管理的问题。

首先在.pro文件里配置Halcon的路径,这里有个小细节要注意版本号:

win32 {
    HALCON_ROOT = C:/Halcon20.11
    INCLUDEPATH += $${HALCON_ROOT}/include 
    LIBS += -L$${HALCON_ROOT}/lib/x64-win64 
    LIBS += -lhalconcpp -lhalcon 
}

这里容易栽跟头的地方是x64和x86架构的选择。如果Qt是用MSVC编译的,一定要确认Halcon的lib目录是否对应。我遇到过明明配置正确却报LNK2019的情况,最后发现是项目属性里没改到x64平台。

测试代码里建议先做个简单的图像加载:

#include "HalconCpp.h"
using namespace HalconCpp;

void testHalcon() {
    HImage img;
    HTuple width, height;
    img.ReadImage("test.png");
    img.GetImageSize(&width, &height);
    qDebug() << "图像尺寸:" << width.I() << "x" << height.I();
}

运行前记得把halcon.dll、halconcpp.dll等十几个动态库扔到exe目录。有个取巧的方法:直接把Halcon安装目录下的bin/x64-win64整个文件夹加入系统Path,这样调试的时候不用来回拷贝dll。

碰到内存泄漏问题可以试试Halcon的垃圾回收机制:

HImage* img = new HImage();
img->ReadImage("test.jpg");
// 处理图像...
HHandleBase::ClearHandle(*img); // 手动释放

实测发现用栈对象比堆对象更安全,特别是涉及到HObject的子类时。跨线程操作要注意Halcon的上下文管理,建议每个线程单独创建HInstance对象。

最后说下界面线程和算法线程的交互。用Qt的信号槽传递Halcon对象时,记得先Serialize/Unserialize:

// 发送端
QByteArray buffer;
HImage img = grabImage();
img.Serialize(&buffer);
emit imageReady(buffer);

// 接收端
HImage receivedImg;
receivedImg.Deserialize(buffer);

这样处理比直接传HImage指针安全得多,实测在跨线程传输2000x2000的大图时,序列化耗时大概15ms左右,完全可以接受。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐