百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Qt中添加OpenCV库(qt引入opencv)

itomcoil 2025-01-29 16:13 54 浏览

配置在Qt中的OpenCV,看了很多“教程”,最终成功。记一下过程。

本机配置:

window7 32位系统;

qt-opensource-windows-x86-mingw492-5.5.1;

OpenCV2.4.10。

对于我来说配置过程比较难,因为目前我没用过Qt和Cmake,之前一直用VS编译C++,也没有用过MinGW,所以看教程中的各种命令或者执行文件都比较费时。这次各种尝试后成功。参考资料的连接在最后,其中帮助我最大的就是那一篇纯英文的,很详细。

前期准备

Qt5的opensource版使用的是MinGW,并且不同于Qt4,Qt5不能在QtCreater中更改库文件为vc。而OpenCV在2.4之后就仅仅提供VS版本的库文件,位置在%OpenCV%\build\x86 或 %OpenCV%\build\x64的“vc1x”文件夹中(%OpenCV%表示OpenCV的安装目录)。

上第一个图片为opencv2.4.10中build\x86\的内容;第二个图片为opencv2.3.1中build\x86\的内容。很明显oepencv2.3.1中有一个mingw的库文件夹而opencv2.4.10就仅仅支持vc库了。因为电脑同时有这两个版本的opencv库文件,所以第一次配置我直接使用的是2.3.1版本(不需要重新编译MinGW版本库文件嘛),但是经过下面的正确配置后,测试程序一直无法通过,现象在下面会细说。

基于以上原因,所以必须要在配置Qt前将OpenCV编译成一个MinGW的库文件版本。这也是为什么这么教程里要用一个CMake软件编译OpenCV。到这里,我可以列出在Qt5中配置OpenCV前需要准备的软件:

qt-opensource-windows-x86-mingw492-5.5.1;

cmake-3.6.0-rc3-win32-x86;

opencv2.4.10。

Qt5和cmake版本是我下载的最新版本,现在时间是2016-6-28。以下的内容不会详细讲述每一步配置步骤,在必要的地方我会附上相应的资料,这些资料已经解释地十分详细。这里我着重写的是我在配置中遇到的问题。

Qt5,CMake和OpenCV的安装

安装的教程数不胜数,这里不再赘述。注意windows中的环境变量的配置。

其中在Qt5的安装中注意安装MinGW。我这里的版本是4.9.2,如下图所示。

安装完成Qt5后,注意要将Qt5的路径加入环境变量中,在后面使用CMake编译OpenCV库时,CMake会调用MinGW组件程序,即在安装Qt中勾选的MinGW程序,并且还会调用Qt本身的编译程序qmake.exe,这两个文件的路径都要在环境变量中,具体为:

%Qt5%\Tools\mingw492_32\bin

%Qt5%\5.5\mingw492_32\bin

以上%Qt5%为我的Qt安装目录,例如我的是C:\Qt\Qt5.5.1,则将其代入以上路径后等价于:

C:\Qt\Qt5.5.1\Tools\mingw492_32\bin

C:\Qt\Qt5.5.1\5.5\mingw492_32\bin

OpenCV库的编译

将OpenCV库编译成MinGW版需要使用CMake软件,别的软件是否好用我没有用过。安装时要注意勾选将CMake的路径(Path)加到环境变量中,否则当后面使用控制台(cmd或者powershell)调用CMake编译安装命令时会出现 无效命令的提示。

注意,在安装完成后先不要直接编译OpenCV的MinGW版本,要保证Qt已经安装完成。否则会缺少必要的执行程序导致无法编译成需要的MinGW库。

打开CMake,参考这篇资料选取OpenCV源文件位置和输出文件位置,点击configure。注意,这里我没有完全按照这一篇资料,而是根据另一篇资料的教程。傻瓜式的总结一下,这里需要点击“2次configure 和 1次generate”。

我这里自己选取了C和C++编译器,具体为下图步骤点:

我选取了"Specify native compilers",并在下一步选择了编译器,因为之前直接选取“Use default native compilers”时总是出错,我猜测我的默认编译器不对。

我自己选择的编译器就是Qt中的MinGW中的gcc和g++,如上图。 选取后finish,则进入其他教程中的正常步骤,如下图。

成功后,在第二次configue前,需要有两个地方勾选或者更改,第一个是下图处:

上图选取的地方是CMake生成的configure类型,可以填入Debug和Release,这样生成的库文件就可以指出上面两种版本的编译。

另外必须要勾选下图中的 WITH_QT,以使CMake编译出可以供Qt使用的库文件(我认为就是在这里才会需要cmake去调用qt中的qmake指令)。

至此,就可以点击generate进行生成了。

我在这之后出现了错误,经过查看得知,就是因为CMake会调用qmake执行文件,而我的环境变量的第一行是 C:\Python27\Lib\site-packages\PyQt4(这是因为前人使用这台电脑是安装了PyQt),而这个目录下有一个qmake执行文件,但这个文件不满足本次编译的要求,所以总是出错。于是我将C:\Qt\Qt5.5.1\5.5\mingw492_32\bin%OpenCV_MinGW%\bin插入到前面即可。

这之后就打开控制台软件,依次键入 mingw32-make 和 mingw32-make install ,如之前配置无误,程序就会依次开始编译和安装,下图依次为相应结果:

Qt配置

opencv的MinGW库编译好后,就可以直接在Qt中配置了。Qt的配置是靠Qt工程创建后生成的那个pro文件,通过在pro文件中配置文本即可,pro文件的编写规则和技巧可以参考这篇资料,不再赘述,下面是我的配置文件内容,使用的测试实例是Qt的控制台应用:

QT += core
QT -= gui

TARGET = TestQt
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

INCLUDEPATH += F:/opencv2.4.10/build/include/opencv \
 F:/opencv2.4.10/build/include/opencv2 \
 F:/opencv2.4.10/build/include

LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libcv2.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_calib3d2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_contrib2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_nonfree2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_ocl2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_gpu2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_photo2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_objdetect2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_legacy2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_ml2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_video2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_features2d2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_highgui2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_imgproc2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_flann2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_core2410.dll.a

我写的很麻烦,路径都是复制粘贴好多遍,可以使用 -L 和 -l参数进行简化。在INCLUDEPATH中的文件目录分级斜杠很有意思,我这里用的都是 / (斜杠),根据测试和查阅资料,我发现 \(反斜杠)和 \\(双反斜杠)都可以使用。使用控制台应用作为测试的原因是这样编写测试文件比较简单,并且不会过多牵扯Qt编程的相关结构和知识,测试代码也很简单,如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using namespace cv;
int main
{
    std::cout<<"fuck"<<std::endl;
    Mat img;
    img = imread("D:/c.jpg");
    imshow("test", img);
    waitKey;return 0;
}

测试成功截图如下:

在配置过程中,原先使用opencv2.3.1,这个库中就有mingw版的库文件,无需用source文件重新编译(这个版本的opencv很奇怪的没有source文件夹,而2.4.x之后的版本与这个版本的文件组织结构差别很大)。原以为是一个方便,但实际使用QT时发现,就算我的.pro文件配置好也不能正常运行测试程序,即显示出一张图片(之所以认为我的配置文件配置好是由于在配置完pro文件后,编写代码过程中使用include时可以索引到opencv库中的头文件)。现象是只要使用opencv的函数就不能正常运行程序,程序开头的打印字符串都没有显示,末尾的打印字符串更是不能出现。另一个现象是,当使用Mat关键字创建一个Mat类而不进行其他相关opencv()函数调用时,不会出现错误,但只要使用别的函数,例如Mat img; img = imread(...);时就会出错。编译问题没有一条,但就是不能出结果。

参考资料

相关推荐

《Queendom》宣布冠军!女团MAMAMOO四人激动落泪

网易娱乐11月1日报道据台湾媒体报道,南韩女团竞争回归的生死斗《Queendom》昨(10/31)晚播出大决赛,并以直播方式进行,6组女团、女歌手皆演唱新歌,并加总前三轮的赛前赛、音源成绩与直播现场投...

正确复制、重写别人的代码,不算抄袭

我最近在一篇文章提到,工程师应该怎样避免使用大量的库、包以及其他依赖关系。我建议的另一种方案是,如果你没有达到重用第三方代码的阈值时,那么你就可以自己编写代码。在本文中,我将讨论一个在重用和从头开始编...

HTML DOM tr 对象_html event对象

tr对象tr对象代表了HTML表格的行。HTML文档中出现一个<tr>标签,就会创建一个tr对象。tr对象集合W3C:W3C标签。集合描述W3Ccells返回...

JS 打造动态表格_js如何动态改变表格内容

后台列表页最常见的需求:点击表头排序+一键全选。本文用原生js代码实现零依赖方案,涵盖DOM查询、排序算法、事件代理三大核心技能。效果速览一、核心思路事件入口:为每个<th>绑...

连肝7个晚上,总结了66条计算机网络的知识点

作者|哪吒来源|程序员小灰(ID:chengxuyuanxiaohui)计算机网络知识是面试常考的内容,在实际工作中经常涉及。最近,我总结了66条计算机网络相关的知识点。1、比较http0....

Vue 中 强制组件重新渲染的正确方法

作者:MichaelThiessen译者:前端小智来源:hackernoon有时候,依赖Vue响应方式来更新数据是不够的,相反,我们需要手动重新渲染组件来更新数据。或者,我们可能只想抛开当前的...

为什么100个前端只有1人能说清?浏览器重排/重绘深度解析

面试现场的"致命拷问""你的项目里做过哪些性能优化?能具体讲讲重排和重绘的区别吗?"作为面试官,我在秋招季连续面试过100多位前端候选人,这句提问几乎成了必考题。但令...

HTML DOM 介绍_dom4j html

HTMLDOM(文档对象模型)是一种基于文档的编程接口,它是HTML和XML文档的编程接口。它可以让开发人员通过JavaScript或其他脚本语言来访问和操作HTML和XML文档...

JavaScript 事件——“事件流和事件处理程序”的注意要点

事件流事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而NetscapeCommunicator的事件流是事件捕获流。事件冒泡即事件开始时由最具体的元素接收,然后逐级向上传播到较为不...

探秘 Web 水印技术_水印制作网页

作者:fransli,腾讯PCG前端开发工程师Web水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印)...

国外顶流网红为流量拍摄性侵女学生?仅被封杀三月,回归仍爆火

曾经的油管之王,顶流网红DavidDobrik复出了。一切似乎都跟他因和成员灌酒性侵女学生被骂到退网之前一样:住在950万美元的豪宅,开着20万美元的阿斯顿马丁,每条视频都有数百万观看...人们仿佛...

JavaScript 内存泄漏排查方法_js内存泄漏及解决方法

一、概述本文主要介绍了如何通过Devtools的Memory内存工具排查JavaScript内存泄漏问题。先介绍了一些相关概念,说明了Memory内存工具的使用方式,然后介绍了堆快照的...

外贸独立站,网站优化的具体内容_外贸独立站,网站优化的具体内容有哪些

Wordpress网站优化,是通过优化代码、数据库、缓存、CSS/JS等内容,提升网站加载速度、交互性和稳定性。网站加载速度,是Google搜索引擎的第一权重,也是SEO优化的前提。1.优化渲染阻塞。...

这8个CSS工具可以提升编程速度_css用什么编译器

下面为大家推荐的这8个CSS工具,有提供函数的,有提供类的,有提取代码的,还有收集CSS的统计数据的……请花费两分钟的时间看完这篇文章,或许你会找到意外的惊喜,并且为你的编程之路打开了一扇新的大门。1...

vue的理解-vue源码 历史 简介 核心特性 和jquery区别 和 react对比

一、从历史说起Web是WorldWideWeb的简称,中文译为万维网我们可以将它规划成如下的几个时代来进行理解石器时代文明时代工业革命时代百花齐放时代石器时代石器时代指的就是我们的静态网页,可以欣...