1. 程式人生 > >Opencv3.2.0如何使用SIFT/SURF運算元(配置環境Windows10+VS2017+CMake+OpenCV3.2.0+opencv_contrib3.2.0)

Opencv3.2.0如何使用SIFT/SURF運算元(配置環境Windows10+VS2017+CMake+OpenCV3.2.0+opencv_contrib3.2.0)

Opencv3.2.0使用SIFT/SURF等運算元的解決方法

一、需要檔案下載

OpenCV3.2.0 : https://github.com/opencv/opencv/releases/download/3.2.0/opencv-3.2.0-vc14.exe
opencv_contrib3.2.0 : https://github.com/opencv/opencv_contrib/archive/3.2.0.zip (可以根據自己本機已經配置的opencv版本下載對應的opencv_contrib)
opencv_contrib: https://github.com/opencv/opencv_contrib/tags


CMake(可以去官網下載較新的版本) : https://cmake.org/download/

二、檔案安裝

1.安裝opencv(若本機之前已裝好,跳過此步)

將下載好的opencv-3.2.0-vc14.exe(不是.zip檔案)雙擊開啟->選擇安裝目錄D:\Program Files (x86)\OpenCV3.2.0

裝好之後在安裝目錄下會有個opencv的資料夾

這裡寫圖片描述

然後最好把下載下來的opencv_contrib也解壓在該目錄下創立的資料夾opencv_extra裡

這裡寫圖片描述

三、CMake配置生成檔案

這裡寫圖片描述
源路徑選擇的是opencv3.2.0安裝目錄下的sources目錄,目的路徑隨意選擇一個空目錄即可;然後點選Configure後出現如下選擇框:
這裡寫圖片描述


選擇對應環境即可,VS2017,win64;點finish;等待ing… 直到出現如下介面:
這裡寫圖片描述
往下拉直到找到OPENCV_EXTRA_MODULES_PATH 選擇解壓opencv_contrib目錄下的modules資料夾,如下圖(其他選項最好不要隨意亂動,預設選項即可):
這裡寫圖片描述
目錄選好之後,點選Generate;繼續等待ing…

這一步我在剛開始配置的時候總是會在下載protobuf-cpp-3.1.0.tar.gz檔案的時候報錯,之後上網找了解決方法,需要自己手動下載一個protobuf-cpp-3.1.0.tar.gz去替換如下所示路徑中的檔案:

D:\Program Files (x86)\OpenCV3.2.0\opencv_extra\opencv_contrib-3.2.0\modules\dnn.download\bd5e3eed635a8d32e2b99658633815ef\v3.1.0目錄下的protobuf-cpp-3.1.0.tar.gz(親測有效)

附上下載地址:連結: https://download.csdn.net/download/qq_39707351/10454808

替換並且配置後出現Configure done;Generate done就是CMake成功了:

這裡寫圖片描述

四、編譯生成install

1、首先在CMake的目的路徑 D:\Documents\Projects\NewOpencv 下找到OpenCV.sln檔案開啟:
這裡寫圖片描述

2、然後右擊解決方案,選擇重新生成解決方案,操作如下圖所示,然後繼續等待若干分鐘ing…(這一步挺久的):
這裡寫圖片描述

3、生成成功之後->右擊CMakeTargets目錄下的INSTALL->選擇僅用於專案->僅生成INSTALL;如下圖所示生成install檔案,繼續等待ing…:
這裡寫圖片描述
4、顯示成功1,失敗後面都是0,恭喜就表示生成成功了。

五、配置專案屬性

生成成功之後,在目的路徑會新生成一個Install資料夾,該資料夾就相當於結合了opencv_contrib的opencv庫目錄。

1、將目的路徑 D:\Documents\Projects\NewOpencv\install\bin 路徑加入到電腦的環境變數當中(不會加的話百度,這裡不詳說了)
2、開啟VS->新建一個空專案,如下:

這裡寫圖片描述

3、建立空專案之後->原始檔上右鍵->新增新建專案:

這裡寫圖片描述

這裡寫圖片描述

注意以後使用的時候都要將vs上面的解決平臺選擇X64,不然會出錯:

這裡寫圖片描述

4、有一種可以一勞永逸的配置屬性的方法,以後用的話可以直接新增,不用每次都要配置,首先在屬性管理器下(檢視中可以找到)->右擊Debug|X64->新增新專案屬性表:

這裡寫圖片描述
然後給它起個OpenCV3.2.0Environments_Debug方便以後找到和分辨,之後可以自己將該專案下的該配置檔案儲存出來,以後直接新增即可:
這裡寫圖片描述

5、右擊選擇屬性:

這裡寫圖片描述

6、在vc++目錄,可執行檔案目錄下新增之前生成的install中的三個資料夾(因為我之前已經配過了所以NewOpencv改成了之前配置的OpencvBulid資料夾),然後點選確定:

這裡寫圖片描述

7、庫目錄新增install/lib路徑,如下所示,點選確定和應用:

這裡寫圖片描述

8、再選擇屬性->連結器->輸入->附加依賴項,將下列.lib都加入進去:

這裡寫圖片描述
新增檔案:
opencv_aruco320d.lib
opencv_bgsegm320d.lib
opencv_bioinspired320d.lib
opencv_calib3d320d.lib
opencv_ccalib320d.lib
opencv_core320d.lib
opencv_datasets320d.lib
opencv_dnn320d.lib
opencv_dpm320d.lib
opencv_face320d.lib
opencv_features2d320d.lib
opencv_flann320d.lib
opencv_fuzzy320d.lib
opencv_highgui320d.lib
opencv_imgcodecs320d.lib
opencv_imgproc320d.lib
opencv_line_descriptor320d.lib
opencv_ml320d.lib
opencv_objdetect320d.lib
opencv_optflow320d.lib
opencv_phase_unwrapping320d.lib
opencv_photo320d.lib
opencv_plot320d.lib
opencv_reg320d.lib
opencv_rgbd320d.lib
opencv_saliency320d.lib
opencv_shape320d.lib
opencv_stereo320d.lib
opencv_stitching320d.lib
opencv_structured_light320d.lib
opencv_superres320d.lib
opencv_surface_matching320d.lib
opencv_text320d.lib
opencv_tracking320d.lib
opencv_video320d.lib
opencv_videoio320d.lib
opencv_videostab320d.lib
opencv_xfeatures2d320d.lib
opencv_ximgproc320d.lib
opencv_xobjdetect320d.lib
opencv_xphoto320d.lib

到這裡整個開發環境配置就結束了,讓我們來測試下SIFT運算元吧 (由於opencv3.0之後SIFT/SURF等運算元都移植到了xfeatures2d.hpp的標頭檔案裡,和2.0等版本在nonfree.hpp裡的呼叫方法還不太一樣)

—————————————————————————–

測試程式碼:

#include "stdafx.h"
#include"iostream"
#include"opencv.hpp"
#include"highgui.hpp"
#include"xfeatures2d.hpp"
using namespace cv;
using namespace std;
int main()
{
    Mat imageL0 = imread("Pattenimage_L.bmp");
    Mat imageR0 = imread("Pattenimage_R.bmp");
    Mat imageL1, imageR1;
    GaussianBlur(imageL0, imageL1, Size(3, 3), 0.5);
    GaussianBlur(imageR0, imageR1, Size(3, 3), 0.5);

    //找出特徵點
    Ptr<Feature2D>f2d = xfeatures2d::SURF::create();  
    vector<KeyPoint> keyPoint1, keyPoint2;  
    f2d->detect(imageL1, keyPoint1);
    f2d->detect(imageR1, keyPoint2);

    drawKeypoints(imageL1, keyPoint1, imageL1, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    drawKeypoints(imageR1, keyPoint2, imageR1, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    namedWindow("KeyPoints of imageL", 0);
    namedWindow("KeyPoints of imageR", 0);

    imshow("KeyPoints of imageL", imageL1);
    imshow("KeyPoints of imageR", imageR1);

    //特徵點匹配
    Mat descriptors_1, descriptors_2;
    f2d->compute(imageL1, keyPoint1, descriptors_1);
    f2d->compute(imageR1, keyPoint2, descriptors_2);

    BFMatcher matcher;
    vector<DMatch>matches;
    matcher.match(descriptors_1, descriptors_2, matches);

    Mat imageOutput;
    drawMatches(imageL1, keyPoint1, imageR1, keyPoint2, matches, imageOutput);

    namedWindow("picture of matching", 0);
    imshow("picture of matching", imageOutput);
    waitKey(0);
    return 0;
}

實驗結果:

這裡寫圖片描述這裡寫圖片描述
這裡寫圖片描述