基于Qt 5.12.4平台的Halcon视觉流程框架编译与测试顺利无阻
qt联合halcon视觉流程框架 正常编译 测试正常 qt5.12.4直接上手搞QtHalcon的环境配置可能会遇到不少坑这里分享下我的踩坑记录。先说下环境Qt5.12.4VS2017Halcon用的是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平台。qt联合halcon视觉流程框架 正常编译 测试正常 qt5.12.4测试代码里建议先做个简单的图像加载#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左右完全可以接受。