OpenCV开发笔记(三十四):红胖子带你小白式编译Qt+openCV3.4.1+opencv_contrib(全网最简单最强,可读性最高,没有之一)

若该文为原创文章,未经容许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-tffoidxv-nu.html
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么本身研究c++

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)面试

OpenCV开发专栏(点击传送门)

上一篇:OpenCV开发笔记(三十三):红胖子8分钟带你深刻了解漫水填充算法(图文并茂+浅显易懂+程序源码)算法

下一篇:OpenCV开发笔记(三十五):红胖子8分钟带你深刻了解ximgproc扩展模块中的自适应流行滤波器(图文并茂+浅显易懂+程序源码)​​​​》网络

 

前言

       红胖子来也!!!app

       opencv_contrib是opencv提供额外的工具,提供一些基础算法,以前编译了不带opencv_contrib的版本,不带opencv_contrib的cuda硬加速版本,缺一个opencv+contrib的版本。ide

 

OpenCV编译相关博客

OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境模块化

OpenCV开发笔记(一):OpenCV介绍、编译工具

OpenCV开发笔记(十一):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-mingw32编译测试

OpenCV开发笔记(十二):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-msvc2015编译(opencv3.4.0、cuda9.0、VS2015)ui

OpenCV开发笔记(三十四):红胖子带你傻瓜式编译Qt+openCV3.4.1+opencv_contrib(全网最浅显易懂)

OpenCV开发笔记(七十):红胖子带你傻瓜式编译VS2017x64版本的openCV4

 

版本汇总

  • Qt5.2.0 mingw32 + Opencv2.4.10 版本

OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境

  • Qt5.9.3 mingw32 + Opencv3.4.1 版本

OpenCV开发笔记(一):OpenCV介绍、编译

  • Opencv3.4.0 + cuda9.0 + VS2015版本

OpenCV开发笔记(十二):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-msvc2015编译(opencv3.4.0、cuda9.0、VS2015)

  • Opencv3.4.1 + opencv_contrib3.4.1 + Qt5.9.3 mingw32版本(本篇编译)

打包集合下载地址:

       https://download.csdn.net/download/qq21497936/12255080

 

下载地址

       Github还真难下,各类网关设置仍是是慢,因此,提供下载地址以下:

       https://download.csdn.net/download/qq21497936/12253553

 

OpenCV+opencv_contrib编译

步骤一:解压到编译文件夹

      

步骤二:CMake配置configure第一次

       (注意:可能会卡住,由于网络很差,默认勾选一些库,如ffmpeg,cmake本身会下载)

       只设置2个路径,configure一次,上面是路径,下面试配置的时候选择mingw make相关,并指定编译器,而后configure以下图:

步骤三:CMake配置configure第二次

       添加opencv_contrib,以下图:

       此处勾opencv_world,这样工程就只须要包含一个库文件(特别注意:添加opencv_contrib不要勾选,会出现连接错误,请查看入坑一),以下图,就主动不勾选了,默认为不勾选:

       配置With_Qt,With_OPENGL,以下图:

       配置一下,会在出现几个变量,更改以下图:

       须要支持c++11,以下图:

       找到源码modules\videoio\src\cap_dshow.cpp,搜索#include “DShow.h”,添加宏定义:

步骤四:Generate生成工程

步骤五:命令行编译

       漫长的等待。

步骤六:缺乏文件

       缺乏以下文件,请本身下载,提供csdn地址:

       https://download.csdn.net/download/qq21497936/12253633

       注意:你能够本身装个openssl软件,而后就能够了下载到了,提供OpenSSL的下载地址:

       https://download.csdn.net/download/qq21497936/12254468

成功下载:

放入对应目录。

步骤七:编译成功

       (未勾选world,库都是分开的)

(勾选world,加入opencv_contrib失败)

步骤八:install安装,方便抽取库

       (未勾选world,库都是分开的)

步骤九:检查库

 

模块化与测试

勾选world后libopencv_world341.dll模块化

       请参照博文《OpenCV开发笔记(一):OpenCV介绍、编译》就行模块化封装与测试,该博文中也有一些入坑,本博客本质与其差很少,只是添加了opencv_contrib的支持。

       往下图片这是world版本的模块化处理,可是添加了opencv _contrib没法编译成world模块,因此一下这个只是对于《OpenCV开发笔记(一):OpenCV介绍、编译》使用world编译项的补充。

编译opencv_contrib的模块化

       那么仍是按照以前的:

       笔者直接替换以前的库,再讲opencv_contrib相关的库加入工程文件,造成工程模板v1.29.0。

       新的测试程序,测试是否加入opencv_contrib。

# 带opencv_contrib的非world版本
LIBS += \
    -lopencv_calib3d341 \
    -lopencv_ccalib341 \
    -lopencv_core341 \
    -lopencv_cvv341 \
    -lopencv_datasets341 \
    -lopencv_dnn_objdetect341 \
    -lopencv_dnn341 \
    -lopencv_dpm341 \
    -lopencv_face341 \
    -lopencv_features2d341 \
    -lopencv_flann341 \
    -lopencv_fuzzy341 \
    -lopencv_hfs341 \
    -lopencv_highgui341 \
    -lopencv_img_hash341 \
    -lopencv_imgcodecs341 \
    -lopencv_imgproc341 \
    -lopencv_line_descriptor341 \
    -lopencv_ml341 \
    -lopencv_objdetect341 \
    -lopencv_optflow341 \
    -lopencv_phase_unwrapping341 \
    -lopencv_photo341 \
    -lopencv_plot341 \
    -lopencv_reg341 \
    -lopencv_rgbd341 \
    -lopencv_saliency341 \
    -lopencv_shape341 \
    -lopencv_stereo341 \
    -lopencv_stitching341 \
    -lopencv_structured_light341 \
    -lopencv_superres341 \
    -lopencv_surface_matching341 \
    -lopencv_text341 \
    -lopencv_tracking341 \
    -lopencv_video341 \
    -lopencv_videoio341 \
    -lopencv_videostab341 \
    -lopencv_xfeatures2d341 \
    -lopencv_ximgproc341 \
    -lopencv_xobjdetect341 \
    -lopencv_xphoto341 \
    -lopencv_ffmpeg341 \
    -lopencv_aruco341 \
    -lopencv_bgsegm341 \
    -lopencv_bioinspired341

 

测试opencv_contrib的Demo

使用了opencv_contrib中的三种白平衡验证。

 

Demo源码

void OpenCVManager::testContrib()
{
    QString fileName1 = "D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg";
    cv::Mat srcMat = cv::imread(fileName1.toStdString());

    int width = 300;
    int height = 200;
    cv::resize(srcMat, srcMat, cv::Size(width, height));

    cv::String windowName = _windowTitle.toStdString();
    cvui::init(windowName);

    cv::Mat windowMat = cv::Mat(cv::Size(srcMat.cols * 3, srcMat.rows * 2),
                                srcMat.type());

    cv::Ptr<cv::xphoto::SimpleWB> pSimpleWB = cv::xphoto::createSimpleWB();
    cv::Ptr<cv::xphoto::GrayworldWB> pGrayworldWB = cv::xphoto::createGrayworldWB();
    cv::Ptr<cv::xphoto::LearningBasedWB> pLearningBasedWB = cv::xphoto::createLearningBasedWB();

    while(true)
    {
        windowMat = cv::Scalar(0, 0, 0);
        // 原图先copy到左边
        cv::Mat leftMat = windowMat(cv::Range(0, srcMat.rows),
                                    cv::Range(0, srcMat.cols));
        cv::addWeighted(leftMat, 0.0f, srcMat, 1.0f, 0.0f, leftMat);

        cv::Mat dstMat;
        // 白平衡
        pSimpleWB->balanceWhite(srcMat, dstMat);
        // 白平衡的图copy到左下
        cv::Mat leftBottomMat = windowMat(cv::Range(srcMat.rows, srcMat.rows * 2),
                                          cv::Range(0, srcMat.cols));
        cv::addWeighted(leftBottomMat, 0.0f, dstMat, 1.0f, 0.0f, leftBottomMat);

        // 白平衡
        pGrayworldWB->balanceWhite(srcMat, dstMat);
        // 白平衡的图copy到左下
        cv::Mat rightBottomMat = windowMat(cv::Range(srcMat.rows, srcMat.rows * 2),
                                           cv::Range(srcMat.cols, srcMat.cols * 2));
        cv::addWeighted(rightBottomMat, 0.0f, dstMat, 1.0f, 0.0f, rightBottomMat);

        // 白平衡
        pLearningBasedWB->balanceWhite(srcMat, dstMat);
        // 白平衡的图copy到左下
        cv::Mat rightBottomMat2 = windowMat(cv::Range(srcMat.rows, srcMat.rows * 2),
                                            cv::Range(srcMat.cols * 2, srcMat.cols * 3));
        cv::addWeighted(rightBottomMat2, 0.0f, dstMat, 1.0f, 0.0f, rightBottomMat2);

        // 更新
        cvui::update();
        // 显示
        cv::imshow(windowName, windowMat);
        // esc键退出
        if(cv::waitKey(25) == 27)
        {
            break;
        }
    }
}

 

工程模板:对应版本号v1.29.0

       对应版本号v1.29.0

 

入坑

入坑一:编译opencv添加opencv_contrib失败

缘由:

       编译成一个world的dll,CMake中未包含opencv_contrib部分的兼容。

解决方法:

       不勾选,只能分多个dll。

 

上一篇:OpenCV开发笔记(三十三):红胖子8分钟带你深刻了解漫水填充算法(图文并茂+浅显易懂+程序源码)

下一篇:OpenCV开发笔记(三十五):红胖子8分钟带你深刻了解ximgproc扩展模块中的自适应流行滤波器(图文并茂+浅显易懂+程序源码)​​​​》

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-tffoidxv-nu.html