若該文爲原創文章,未經允許不得轉載
原博主博客地址: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