若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/104953532
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
目录
勾选world后libopencv_world341.dll模块化
入坑一:编译opencv添加opencv_contrib失败
《OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境》
《OpenCV开发笔记(三):OpenCV图像的概念和基本操作》
《OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储》
《OpenCV开发笔记(五):OpenCV读取与操作摄像头》
《OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间》
《OpenCV开发笔记(八):OpenCV常用操作之计时、缩放、旋转、镜像》
《OpenCV开发笔记(九):OpenCV区域图像(ROI)和整体、局部图像混合》
《OpenCV开发笔记(十):OpenCV图像颜色通道分离和图像颜色多通道混合》
《OpenCV开发笔记(十一):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-mingw32编译》
《OpenCV开发笔记(十二):OpenCV编译支持Gpu(cuda) 加速开发之win-qt-msvc2015编译(opencv3.4.0、cuda9.0、VS2015)》
《OpenCV开发笔记(十三):OpenCV图像对比度、亮度的调整》
《OpenCV开发笔记(十四):算法基础之线性滤波-方框滤波》
《OpenCV开发笔记(十五):算法基础之线性滤波-均值滤波》
《OpenCV开发笔记(十六):算法基础之线性滤波-高斯滤波》
《OpenCV开发笔记(十七):算法基础之线性滤波对比-方框、均值、高斯滤波》
《OpenCV开发笔记(十八):算法基础之非线性滤波-中值滤波》
《OpenCV开发笔记(十九):算法基础之非线性滤波-双边滤波》
《OpenCV开发笔记(二十):算法基础之非线性滤波对比-中值、双边滤波》
《OpenCV开发笔记(二十一):算法基础之形态学滤波-膨胀》
《OpenCV开发笔记(二十二):算法基础之形态学滤波-腐蚀》
《OpenCV开发笔记(二十三):算法基础之形态学滤波-开运算》
《OpenCV开发笔记(二十四):算法基础之形态学滤波-闭运算》
《OpenCV开发笔记(二十五):算法基础之形态学滤波-形态学梯度》
《OpenCV开发笔记(二十六):算法基础之形态学滤波-顶帽(礼帽)》
《OpenCV开发笔记(二十七):算法基础之形态学滤波-黑帽》
《OpenCV开发笔记(二十八):带你学习图像识别之阈值化》
《OpenCV开发笔记(二十九):带你学习图像识别之自适应阈值》
《OpenCV开发笔记(三十):带你学习图像识别之经典OTSU算法阈值化》
《OpenCV开发笔记(三十一):红胖子8分钟带你深入了解双阈值化(图文并貌+浅显易懂+程序源码)》
《OpenCV开发笔记(三十二):红胖子8分钟带你深入了解半阈值化(图文并貌+浅显易懂+程序源码)》
《OpenCV开发笔记(三十三):红胖子8分钟带你深入了解漫水填充算法(图文并茂+浅显易懂+程序源码)》
《OpenCV开发笔记(三十四):红胖子带你小白式编译Qt+openCV3.4.1+opencv_contrib(全网最简单最强,可读性最高,没有之一)》
持续补充中…
OpenCV开发笔记(三十四):红胖子带你小白式编译Qt+openCV3.4.1+opencv_contrib(全网最简单最强,可读性最高,没有之一)
前言
红胖子来也!!!
opencv_contrib是opencv提供额外的工具,提供一些基础算法,之前编译了不带opencv_contrib的版本,不带opencv_contrib的cuda硬加速版本,缺一个opencv+contrib的版本。
版本汇总
- Qt5.2.0 mingw32 + Opencv2.4.10 版本
《OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境》
- Qt5.9.3 mingw32 + Opencv3.4.1 版本
- 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。
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/104953532