• Qt-OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行



    版权声明:本文为CSDN博主「辉哈」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/huihut/article/details/78701814

    OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行

    前言

    本篇博文是使用 32 位的 MinGW 在 Windows 下编译 OpenCV 生成 32 位的 dll。

    关于使用 64 位的 MinGW 编译 OpenCV 生成 64 位的 dll,见:OpenCV使用CMake和MinGW-w64的编译安装

    软件环境

    OpenCV 的 MSVC 版及 MinGW 版

    MSVC 版

    下载的 OpenCV 文件夹会有:

    • build (已编译好的库)
    • sources (源码)

    使用 MSVC 的话,直接在路径:build/x64/vc14里面就有了,配置好路径就可以使用。

    MinGW 版

    OpenCV 没有为我们编译好 MinGW 版,所以我们只能自己编译,下面就是介绍 MinGW 版的编译流程。

    也可以直接下载使用我编译好了的 OpenCV (在上文)。

    安装及配置 Qt、MinGW、CMake

    安装

    CMake 自行安装,Qt 和 MinGW 可以直接使用qt-opensource-windows-x86-5.9.3.exe 安装包安装,注意选择安装的组件(components)的时候勾选 MinGW :

    • Qt-Qt5.9-MingGW 5.3.0 32 bit
    • Qt-Tools-MinGW 5.3.0

    配置 Qt、MinGW

    安装好后打开 QtCreator,在工具-选项-构建和运行-构建套件,选中Desktop Qt 5.9.3 MinGW 32bit,设为默认,OK。

    添加 MinGW 到环境变量

    为用户变量 Path 添加 E:QtQt5.9.3Toolsmingw530_32in

    使环境变量生效

    打开命令提示符 CMD,运行 set PATH=C:,更改当前窗口任务的环境变量,关闭这个 CMD。

    再次打开另一个 CMD,运行 echo %PATH%,显示最新的环境变量,会发现刚刚添加的 MinGW 环境变量已经生效。

    使用 CMake 生成 OpenCV 的 Makefile

    打开 cmake-gui,设置源码和生成路径:

    • Where is the source code: E:/OpenCV_3.3.1/opencv/sources
    • Where to build the binaries: E:/OpenCV_3.3.1/opencv-build

    点击 Configure,设置编译器

    • Specify the generator for this project: MinGW Makefiles
    • Specify native compilers
    • Next
    • Compilers C: E:QtQt5.9.3Toolsmingw530_32ingcc.exe
    • Compilers C++: E:QtQt5.9.3Toolsmingw530_32ing++.exe
    • Finish

    编译配置:

    • 勾选 WITH_QT
    • 勾选 WITH_OPENGL

    点击 Configure,再次配置:

    • 不勾选 WITH_IPP
    • 设置 QT_MAKE_EXECUTABLEE:QtQt5.9.35.9.3mingw53_32inqmake.exe
    • 设置 Qt5Concurrent_DIRE:QtQt5.9.35.9.3mingw53_32libcmakeQt5Concurrent
    • 设置 Qt5Core_DIRE:QtQt5.9.35.9.3mingw53_32libcmakeQt5Core
    • 设置 Qt5Gui_DIRE:QtQt5.9.35.9.3mingw53_32libcmakeQt5Gui
    • 设置 Qt5Test_DIRE:QtQt5.9.35.9.3mingw53_32libcmakeQt5Test
    • 设置 Qt5Widgets_DIRE:QtQt5.9.35.9.3mingw53_32libcmakeQt5Widgets
    • 设置 Qt5OpenGL_DIRE:QtQt5.9.35.9.3mingw53_32libcmakeQt5OpenGL
    • 设置 CMAKE_BUILD_TYPERelease 或者 RelWithDebInfo

    点击 Generate 生成 Makefile

    OpenCVCMakeGenerate

    编译 OpenCV

    打开终端进行编译:(-j 是使用 8 个线程进行编译,请根据你的计算机配置合理设置线程数)

    E:
    cd E:OpenCV_3.3.1opencv-build
    mingw32-make -j 8
    mingw32-make install
    


    如果 mingw32-make -j 8 遇到错误,请看下面的 编译 OpenCV 常见错误,否则执行 mingw32-make install,完成安装。
    编译 OpenCV 常见错误
    0. 多线程编译错误信息不明确
    表现

    如果使用了多线程编译,导致错误,但是错误信息不明确,如:

    Makefile:161: recipe for target 'all' failed
    mingw32-make: *** [all] Error 2

    解决

    使用单线程编译:

    mingw32-make

    以查看详细的错误提示,再根据具体情况解决。
    1. RC 错误
    表现

    ... windres.exe: unknown option -- W ...
    或者
    FORMAT is one of rc, res, or coff, and is deduced from the file name
    extension if not specified.  A single file name is an input file.
    No input-file is stdin, default rc.  No output-file is stdout, default rc.

     解决

    在 cmake-gui 编译配置中:

        不勾选 ENABLE_PRECOMPILED_HEADERS

    然后重新Configure-Generate-mingw32-make
    2. sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA 错误
    表现

    ...opencv/sources/modules/videoio/src/cap_dshow.cpp...
    ... 'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared in this scope ...
    或者
    Makefile:161: recipe for target 'all' failed
    mingw32-make: *** [all] Error 2

    解决

    修改E:OpenCV_3.3.1opencvsourcesmodulesvideoiosrccap_dshow.cpp文件,在#include "DShow.h"这行的上面加一行#define NO_DSHOW_STRSAFE,如:

    #define NO_DSHOW_STRSAFE
    #include "DShow.h"
    然后重新Configure-Generate-mingw32-make
    3. identifier ‘nullptr’ is a keyword in C++11 错误【2018年3月2日编译OpenCV 3.4.1时遇到并解决】
    表现

    D:opencv-3.4.1opencv-3.4.13rdpartyprotobufsrcgoogleprotobufstubsio_win32.cc:94:3: warning: identifier 'nullptr' is a keyword in C++11 [-Wc++0x-compat]
       return s == nullptr || *s == 0;
       ^
    D:opencv-3.4.1opencv-3.4.13rdpartyprotobufsrcgoogleprotobufstubsio_win32.cc: In function 'bool google::protobuf::internal::win32::{anonymous}::null_or_empty(const char_type*)':
    D:opencv-3.4.1opencv-3.4.13rdpartyprotobufsrcgoogleprotobufstubsio_win32.cc:94:15: error: 'nullptr' was not declared in this scope
       return s == nullptr || *s == 0;
                   ^
    3rdpartyprotobufCMakeFileslibprotobuf.diruild.make:412: recipe for target '3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/stubs/io_win32.cc.obj' failed
    mingw32-make[2]: *** [3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/stubs/io_win32.cc.obj] Error 1
    CMakeFilesMakefile2:710: recipe for target '3rdparty/protobuf/CMakeFiles/libprotobuf.dir/all' failed
    mingw32-make[1]: *** [3rdparty/protobuf/CMakeFiles/libprotobuf.dir/all] Error 2
    Makefile:161: recipe for target 'all' failed
    mingw32-make: *** [all] Error 2
    MakeOpenCV_nullptr_Error


    解决

    在 cmake-gui 编译配置中:

        勾选 ENABLE_CXX11

    然后重新Configure-Generate-mingw32-make
    添加 OpenCV 编译的库到环境变量

        为系统变量 Path 添加 E:OpenCV_3.3.1opencv-buildinstallx86mingwin

    新建 OpenCV 的 Qt 项目

    在 .pro 文件里面添加:

    win32 {
    INCLUDEPATH += E:OpenCV_3.3.1opencv-buildinstallinclude
    LIBS += E:OpenCV_3.3.1opencv-buildinstallx86mingwinlibopencv_*.dll
    }
    

     
    或者:(区分 debug 和 release 是因为 OpenCV 对其两者有不同的库,你需要把路径改为你自己的,我编译 MinGW 的 OpenCV 只有 release 库)

    win32 {
    INCLUDEPATH += E:OpenCV_3.3.1opencv-buildinstallinclude
    CONFIG(debug, debug|release): {
    LIBS += E:OpenCV_3.3.1opencv-buildinstallx86mingwinlibopencv_*d.dll
    } else:CONFIG(release, debug|release): {
    LIBS += -LE:OpenCV_3.3.1opencv-buildinstallx86mingwin 
        -llibopencv_core331 
        -llibopencv_highgui331 
        -llibopencv_imgcodecs331 
        -llibopencv_imgproc331 
        -llibopencv_features2d331 
        -llibopencv_calib3d331
    }
    }
    



    然后在 MainWindow 中如下:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // read an image
        cv::Mat image = cv::imread("E:/Pictures/H_white.png", 1);
        // create image window named "My Image"
        cv::namedWindow("My Image");
        // show the image on window
        cv::imshow("My Image", image);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    


    最后运行起来了,效果如图:
     

    官方教程

  • 相关阅读:
    最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离等问题
    暑假总结20160907
    数组指针和指针数组的区别
    Matlab GUI界面
    稀疏表示(sparse representation)和字典学习
    C++设计模式——策略模式
    volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
    MultiByteToWideChar和WideCharToMultiByte用法详解
    MFC中Listbox控件的简单使用
    window.open("url?param="+paramvalue) 服务端 乱码问题解决
  • 原文地址:https://www.cnblogs.com/iriczhao/p/11372688.html
Copyright © 2020-2023  润新知