據官方說法,目前還不是太穩定的演算法模組都在opencv_contrib裡邊,由於不穩定,所以不能在release版本里發行,只有在穩定以後才會放進release裡邊。但是這裡邊有很多我們經常要用的演算法,比如SIFT,SURF等(在xfeatures2d 模組裡邊)。官網提供了說明,可以把opencv_contrib擴充套件模組新增編譯到已安裝的opencv3裡邊。
同時我們還需要編譯opencv的GPU模組,以便在GPU上加速執行這些演算法。
1.點[Brouse Source…],選擇OpenCV原始碼那個sources資料夾的路徑。
點[Brouse Build…],選擇要生成的工程的路徑。如下圖:
2.點選 [Configure],出現對話方塊說資料夾不存在要不要新建資料夾,點yes,然後出現對話方塊選擇生成的工程版本,如下圖:
3.點[Finished],一段讀條後會生成工程。完成後可以檢查一下視窗下部的框,如果正確安裝、配置CUDA,應該會有如下字樣 CUDA detected+版本號:
4.檢查一下WITH_CUDA選項,如果Cmake檢測到你安裝了CUDA,應該是自動勾上的。如果沒自動勾上那就把它勾上。如下圖:
5.下載opencv_contrib模組,連結:https://github.com/opencv/opencv_contrib
解壓後,我把它放到了opencv3.3的目錄下
6.在cmake介面找到OPENCV_EXTRA_MODULES_PATH,修改其值為:D:/opencv3.3/opencv_contrib-master/modules,就是第5步中modules的路徑
7.確認好選項之後再按[Configure]
8.按[Generate]生成工程,如果配置和生成工程完全ok底下應該有Configuring done和Generating done兩行。如下圖:
9.關掉cmake,關掉防毒軟體,在build_opencv3.3_contrib找到OpenCV.sln用VS2015開啟,選擇生成-重新生成解決方案。
等待兩個多小時……
10.編譯好後,找到解決方案目錄裡的[CMakeTargets]項展開的[INSTALL]項,右鍵->[Project Only(僅專案)]->[Build Only INSTALL(僅生成INSTALL)]。這時在D:\build_opencv3.3_contrib\install\x64\vc14生成了編譯好的庫(預設生成debug的庫,修改為release編譯生成release的庫)。
給windows作業系統新增“系統環境變數”path環境變數:D:\build_opencv3.3_contrib\install\x64\vc14\bin
11.測試gpu模組與opencv_contrib模組。
新建VS2015控制檯應用程式,
工程屬性--配置屬性--VC++目錄--包含目錄 中新增:
D:\build_opencv3.3_contrib\install\include\opencv;
D:\build_opencv3.3_contrib\install\include\opencv2;
D:\build_opencv3.3_contrib\install\include;
工程屬性--配置屬性--VC++目錄--庫目錄 中新增:
D:\build_opencv3.3_contrib\install\x64\vc14\lib
工程屬性--配置屬性--連結器--輸入--附加依賴項 中新增:
opencv_aruco331d.lib
opencv_bgsegm331d.lib
opencv_bioinspired331d.lib
opencv_calib3d331d.lib
opencv_ccalib331d.lib
opencv_core331d.lib
opencv_cudaarithm331d.lib
opencv_cudabgsegm331d.lib
opencv_cudacodec331d.lib
opencv_cudafeatures2d331d.lib
opencv_cudafilters331d.lib
opencv_cudaimgproc331d.lib
opencv_cudalegacy331d.lib
opencv_cudaobjdetect331d.lib
opencv_cudaoptflow331d.lib
opencv_cudastereo331d.lib
opencv_cudawarping331d.lib
opencv_cudev331d.lib
opencv_datasets331d.lib
opencv_dnn331d.lib
opencv_dpm331d.lib
opencv_face331d.lib
opencv_features2d331d.lib
opencv_flann331d.lib
opencv_fuzzy331d.lib
opencv_highgui331d.lib
opencv_img_hash331d.lib
opencv_imgcodecs331d.lib
opencv_imgproc331d.lib
opencv_line_descriptor331d.lib
opencv_ml331d.lib
opencv_objdetect331d.lib
opencv_optflow331d.lib
opencv_phase_unwrapping331d.lib
opencv_photo331d.lib
opencv_plot331d.lib
opencv_reg331d.lib
opencv_rgbd331d.lib
opencv_saliency331d.lib
opencv_shape331d.lib
opencv_stereo331d.lib
opencv_stitching331d.lib
opencv_structured_light331d.lib
opencv_superres331d.lib
opencv_surface_matching331d.lib
opencv_text331d.lib
opencv_tracking331d.lib
opencv_video331d.lib
opencv_videoio331d.lib
opencv_videostab331d.lib
opencv_xfeatures2d331d.lib
opencv_ximgproc331d.lib
opencv_xobjdetect331d.lib
opencv_xphoto331d.lib
可以在D:\opencv3.3\sources\samples\gpu\surf_keypoint_matcher.cpp找到一個測試例程,對其程式碼做簡單修改如下:
#include <iostream> #include "opencv2/opencv_modules.hpp"
#include "opencv2/core.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/cudafeatures2d.hpp"
#include "opencv2/xfeatures2d/cuda.hpp" using namespace std;
using namespace cv;
using namespace cv::cuda; int main()
{
GpuMat img1, img2;
img1.upload(imread("1.bmp", IMREAD_GRAYSCALE));
img2.upload(imread("2.bmp", IMREAD_GRAYSCALE)); cv::cuda::printShortCudaDeviceInfo(cv::cuda::getDevice()); SURF_CUDA surf; // detecting keypoints & computing descriptors
GpuMat keypoints1GPU, keypoints2GPU;
GpuMat descriptors1GPU, descriptors2GPU;
surf(img1, GpuMat(), keypoints1GPU, descriptors1GPU);
surf(img2, GpuMat(), keypoints2GPU, descriptors2GPU); cout << "FOUND " << keypoints1GPU.cols << " keypoints on first image" << endl;
cout << "FOUND " << keypoints2GPU.cols << " keypoints on second image" << endl; // matching descriptors
Ptr<cv::cuda::DescriptorMatcher> matcher = cv::cuda::DescriptorMatcher::createBFMatcher(surf.defaultNorm());
vector<DMatch> matches;
matcher->match(descriptors1GPU, descriptors2GPU, matches); // downloading results
vector<KeyPoint> keypoints1, keypoints2;
vector<float> descriptors1, descriptors2;
surf.downloadKeypoints(keypoints1GPU, keypoints1);
surf.downloadKeypoints(keypoints2GPU, keypoints2);
surf.downloadDescriptors(descriptors1GPU, descriptors1);
surf.downloadDescriptors(descriptors2GPU, descriptors2); // drawing the results
Mat img_matches;
drawMatches(Mat(img1), keypoints1, Mat(img2), keypoints2, matches, img_matches); namedWindow("matches", );
imshow("matches", img_matches);
waitKey(); return ;
}
使用CMake編譯OpenCV3.0+OpenCV_contrib時所遇問題的解決方案
在windows下使用CMake編譯opencv+opencv_contrib的步驟,網上已有很多中文轉載,介紹得都很詳細。如果對“轉載”不放心,可以檢視opencv_contrib目錄下的README.md,它才是中文翻譯的原版。在這裡主要解決編譯中可能遇到的問題。
如果使用VS2010作為IDE, 點選configure之後,可能會出現:error in configuration process project files may be invalid。
解決方案:這是vs2010的問題,不是CMake和opencv的問題,出現這個錯誤說明電腦中vs版本不相容,查詢以下兩個路徑:C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe和C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe。右鍵屬性|詳細資訊, 檢視兩者版本號,刪除/重新命名較舊的版本,或者重新設定Path變數。如果在設定完擴充套件包之後(如下):
仍然出現 error in configuration process project files may be invalid。
解決方案:可能是opencv與opencv_contrib的版本不匹配,如果是直接開啟連結下載的opencv_contrib,則得到的是master版本,它一般是最新的穩定版,而你現在編譯的opencv是3.0的版本,所以也需要opencv_contrib為3.0版。
把它作為擴充套件包的引用,就沒有問題了。同時也解決了後續類似 “Unknown CMake command ‘ocv_download’ “的問題。
參考連結:
1、【opencv3.3】VS2015+opencv3.3 GPU模組編譯(包含opencv_contrib模組)
3、Windows7+VS2012下64位OpenCV3.0+CUDA7.5的編譯和部署
4、【OpenCV入門教程之七】 玩轉OpenCV原始碼:生成OpenCV工程解決方案與OpenCV原始碼編譯 - 淺墨_毛星雲的CSDN部落格
5、使用CMake編譯OpenCV3.0+OpenCV_contrib時所遇問題的解決方案
6、vs2015下Cmake3.10編譯Opencv3.4及opencv_contrib3.4在Windows10
7、opencv3.4+vs2015+win10安裝過程問題解決
8、opencv3.4.0的CMake需聯外網下載的.cache資料夾內容(ippicv等)
9、OpenCV3.4.0+contrib在VS2017下編譯_win10 64位
Visual Studio下載連結:
1、Visual Studio Community下載 Community 2015