Qt+大恒相机+OpenCV+MinGW界面开发

Qt+大恒相机+OpenCV+MinGW界面开发

    • 遇到的坑有哪些?
    • 大恒相机接口的问题(C与C++选谁,傻傻分不清)
    • OpenCV版本与MinGW编译平台适应性问题(编译通过,但是一运行就异常退出)
    • 关于打包
    • Qt调用新编辑的UI界面却显示原来的UI
    • 总结

博主最近在用Qt从事一项视觉检测界面开发的工作,该项目要求提供一个可供调用的子窗口。该子窗口具有如下任务:能够实时显示四台相机采集到的画面,能够根据主控程序的命令进行图像处理并显示结果,并且能够放大被选中的相机采集到的画面。由于博主是C系语言白痴,所以工作过程中踩到了无数的坑,在此特地记录,以供后续学习。

遇到的坑有哪些?

四大问题1.大恒相机接口问题;2.OpenCV与MinGW编译平台适应性问题;3.关于打包;4.关于更新了UI界面之后,工程调用的时候却没有更新

大恒相机接口的问题(C与C++选谁,傻傻分不清)

博主一直以为C系语言是跨平台的,所以只要代码是C系语言写的就能走遍天下都不怕。但这次被现实打了脸。哪有那么好的事情,让你走遍天下都不怕呢!
大恒相机的接口有两种,一种是C语言接口,一种是C++接口。一般做视觉检测,需要自己根据相机提供的接口重新开发,以满足自己的需要。而大恒相机的C接口与C++接口具有不同的特征:C接口是没有经过封装的,也是大恒比较成熟的接口,编程手册内容丰富,用户可以方便地找到自己需要的接口;而C++的接口是经过封装的,编程手册写得比较简练,想要找到特定的功能比较困难,但是上手比较容易。博主就是吃了上手容易的亏亏亏……。虽然C++有些接口不好找,没关系!可以问大恒的技术人员哥哥;虽然有时候因为硬件导致相机工作不稳定,没关系!大恒的技术人员哥哥也可以帮你测试并确定适合你的参数!但是!当编译平台必须转移到MinGW的时候!大恒的技术人员哥哥就真的要劝你用C语言开发了!因为大恒的C++接口只支持MSVC编译平台。
知道这个消息之后,博主哭了。
如果有萌新不知道该选谁的话,听学姐的,选C接口,选C接口,选C接口。

OpenCV版本与MinGW编译平台适应性问题(编译通过,但是一运行就异常退出)

把相机的接口换成C语言接口之后,就可以在Qt的MinGW编译平台下进行编译测试了。但是博主的代码用到了OpenCV,一般情况下我们直接在OpenCV官网上下载安装的OpenCV是不能在MinGW 平台下工作的,很多朋友推荐用MinGW+Cmake+OpenCV源码重新编译,然后在MinGW平台上使用。但是,听博主的靠谱学弟说,这个过程很麻烦。所以我们选择了在网上直接下载别人编译好的OpenCV库。

设好路径,重新构建,万事俱备,只欠东风,点击执行,异常停止……博主又哭了。

熟悉MinGW编译的伙伴可能会说,那是因为你路径没有设置好吧!
我进行的设置有以下几部分:
在.pro文件里设置OpenCV的路径(LIBS 添加的是dll的路径),并在电脑的环境变量中添加OpenCV的路径。Qt+大恒相机+OpenCV+MinGW界面开发_第1张图片

在这里插入图片描述
但是Qt的MinGW编译器就是找不到这个路径,就是会连main函数都进不去。

后来我鬼使神差地点开了Qt的项目构建设置,点开了项目构建设置下的构建环境,发现构建环境下有一个path变量,于是我在这个path里添加了我的OpenCV动态库

Qt+大恒相机+OpenCV+MinGW界面开发_第2张图片
设置之后,怀着试试的心情,重新构建,点击执行,运行成功……博主还是哭了

关于打包

打包这个事情,会打包的人几分钟就能搞定,不会打包的人(比如博主我)会被这样卡住。

在这里插入图片描述
因为从来没有人告诉我怎么着算是打包,所以博主就认为只要生成个dll文件能够被调用就可以了。
事实也的确是这样,生成dll文件给用户调用(如果你开发的是可执行文件,则是交付给用户exe文件)。
但是,你怎么能够保证自己生成的这个dll文件别人能够调用呢?你写算法的时候用到的库怎么办呢?把你用到的库都找出来放到一起,使别人调用你生成的dll时能够找到你的dll用到的库,就打包成功了。
所以打包就是:生成你的dll文件,并且找到你用到的所有dll文件,放到一起能够被别人调用。

如何找到你用到的dll文件?
这里有两个工具可以供大家使用:第一个是Qt自带的打包工具: windeployqt
使用方法:1.在开始目录找到对应的工具打开(对应的工具表示:和你的工程所用的编译器相同的编译器)
2. cd 到你的exe或者dll所在的目录
3. 然后输入: windeployqt xxx.exe或者 windeployqt xxx.dll
Qt+大恒相机+OpenCV+MinGW界面开发_第3张图片

第二个工具是VS自带的寻找依赖库的工具:我一般都是打开这个开发人员命令提示符。
使用方式与Qt的工具类似
1.找到这个工具(打开开发人员命令符)
2.cd 到你的exe或者dll所在的位置
3. 输入 dumpbin /dependents xxx.exe 或者dumpbin /dependents xxx.dll(为了对小白友好,多贴一张图)
Qt+大恒相机+OpenCV+MinGW界面开发_第4张图片
Qt+大恒相机+OpenCV+MinGW界面开发_第5张图片

Qt调用新编辑的UI界面却显示原来的UI

我刚遇到这个问题的时候,简直不敢相信自己的眼睛。查询的结果大致就是,调用的ui_xxx.h是老版本,所以才会出现这个情况,只要把ui_xxx.h删除然后重新生成就可以了。但是我试了之后,发现虽然生成了新的ui_xxx.h文件,但是调用时显示的仍然时老的UI界面。而我的工程与普通的工程不同的一点是:我调用的UI是一个子窗口,这个子窗口是打包在一个名为“Vision.dll”中的。也就是说,我的UI没有更新,完全是因为“Vision.dll”没有更新导致的。然后我将新的ui_xxx.h放到子窗口文件夹中,重新生成了“Vision.dll”,然后被主工程调用之后,新的UI就显示出来了。

总结一下就是:保证当前工程调用的UI界面是最新的ui_xxx.h就可以了。也就是你要弄清楚,主工程是从哪个途径直接调用你的UI的,然后做出相应的修改就可以了。

总结

有时候,经验真的很重要。如果没有经验,一定要学会及时求助,因为没有经验真的一个小坑就会耗费好长的时间,但是这个坑对于有经验的人来说真的可能只是几分钟的事。博主就是那种入了坑要扑腾好久的人!
如果对上述内容有疑问,欢迎留言讨论一起进步。
好了好了不写了,我再去哭一会儿。

你可能感兴趣的:(OpenCV,Qt,工业相机,Qt,MinGW,OpenCV,大恒相机)