一开始网上搜了一些 “安装教程” , 很多是误导新人,所以写了篇 经过个人实践没有问题的流程,以供大家参考:
先上电脑配置:
- 首先下载opencv的源码以及opencv_contrib(如果需要用到SURF/SIFT等功能),我已经下载好打包
- 链接: https://pan.baidu.com/s/1BPL1gTvzL5OZgLtFHUoi5A 密码: 4s77
- 其次下载过程中会用到的一些第三方的东西,如IPPICV
- 链接:链接: https://pan.baidu.com/s/1ExZyhdHXicoMWLioE6NTpQ 密码: viko
- 编译工具cmake: https://cmake.org/download/
- 下面开始干活:
- 解压opencv4和opencv_3rdparty-ippicv-master_20191018,最好是放在同一目录下
- 把boost一堆解压到src目录(这一步可能需要配置目录)
- 把IPPICV放到/opencv/3rdparty/ippicv目录下
- 修改opencv/3rdparty/ippicv/ippicv.cmake文件,用sublime 之类的工具打开,找到第42行修改为它的绝对目录,例如我的就是
- 除了上面以外还有一个文件一般会下载失败,就是face_landmark_modet.dat文件,下载链接如下链接: https://pan.baidu.com/s/1zZOXfYqK9nzj5D_TOIDyIQ 密码: gwaw,拷贝到然后/opencv_contrib/modules/face/目录并修改修改/opencv_contrib/modules/face/CmakeList.txt中的第19行,结果如下
- 基本配置完毕,下面开始配置编译选项,需要把opencv_contrib也编译进去,然后生成相应的库文件以及头文件
-
cd opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules -D OPENCV_ENABLE_NONFREE:BOOL=ON ..
等待没有错误的完成
-
然后
make -j12
一直等到完成
-
然后
sudo make install
等待完成。
-
代码示例:
-
#include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/xfeatures2d.hpp> #include <iostream> #include <vector> using namespace std; void orbFeatures(cv::Mat &matGray, vector<cv::KeyPoint> &keyPoints, cv::Mat & descripton){ cv::Ptr<cv::ORB> orb = cv::ORB::create(100, 1.2f); orb->detect(matGray, keyPoints); orb->compute(matGray, keyPoints, descripton); } int main(){ #if 1 cv::Mat imgSrcA = cv::imread("/Users/cairne/Desktop/desktop/cats.jpeg",cv::IMREAD_COLOR); cv::Mat imgSrcB = cv::imread("/Users/cairne/Desktop/desktop/mycata.png", cv::IMREAD_COLOR); if(imgSrcA.empty() || imgSrcB.empty()){ cout << "Please check you Pics path ! " << endl; return -1; } cv::Ptr<cv::xfeatures2d::SURF> mySurf = cv::xfeatures2d::SURF::create(); std::vector<cv::KeyPoint> myKeypointA, myKeypointB; mySurf->detect(imgSrcA, myKeypointA); mySurf->detect(imgSrcB, myKeypointB); cv::Mat keyPointImgA, keyPointImgB; cv::drawKeypoints(imgSrcA, myKeypointA, keyPointImgA, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); cv::drawKeypoints(imgSrcB, myKeypointB, keyPointImgB, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); cv::namedWindow("KeyPoints of imgA"); cv::namedWindow("KeyPoints of imgB"); cv::imshow("KeyPoints of imgA", keyPointImgA); cv::imshow("KeyPoints of imgB", keyPointImgB); cv::Mat disA, disB; mySurf->detectAndCompute(imgSrcA, cv::Mat(), myKeypointA, disA); mySurf->detectAndCompute(imgSrcB, cv::Mat(), myKeypointB, disB); std::vector<cv::DMatch> myMatches; if(disA.type() != CV_32F || disB.type() != CV_32F){ disA.convertTo(disA, CV_32F); disB.convertTo(disB, CV_32F); } cv::Ptr<cv::DescriptorMatcher> myMatcher = cv::DescriptorMatcher::create("FlannBased"); myMatcher->match(disA, disB, myMatches); double maxDist = 0; for(int i = 0; i < disA.rows; i++){ double dist = myMatches[i].distance; if(dist > maxDist) maxDist = dist; } cout << "max dis : " << maxDist << endl; std::vector<cv::DMatch> goodMatches; for(int i = 0; i < disA.rows; i++){ //cout << myMatches[i].distance << " "; if(myMatches[i].distance < 0.1 * maxDist) goodMatches.push_back(myMatches[i]); } cout << endl; cv::Mat imageOut; cv::drawMatches(imgSrcA, myKeypointA, imgSrcB, myKeypointB, goodMatches, imageOut); cv::imshow("Picture of matching", imageOut); #endif #if 0 cv::Mat myImgA, myImgB; myImgA = cv::imread("/Users/cairne/Desktop/desktop/aaaaa.png", cv::IMREAD_COLOR); myImgB = cv::imread("/Users/cairne/Desktop/desktop/bbbbd.png", cv::IMREAD_COLOR); if(myImgA.empty() || myImgB.empty()){ cout << "Please check you pictures!" << endl; return -1; } vector<cv::KeyPoint> keyPointsA, keyPointsB; cv::Mat desA, desB; orbFeatures(myImgA, keyPointsA, desA); orbFeatures(myImgB, keyPointsB, desB); vector<cv::DMatch> matches; cv::BFMatcher matcher(cv::NORM_HAMMING); matcher.match(desA, desB, matches); cout << "Matches = " << matches.size() << endl; double minDist = 1000, maxDist = 0; for(int i = 0; i < matches.size(); i++){ double dist = matches[i].distance; if(dist < minDist) minDist = dist; if(dist > maxDist) maxDist =dist; } cout << "min dist = " << minDist << endl; cout << "max dist = " << maxDist << endl; vector<cv::DMatch> goodMatches; for(int i = 0; i < matches.size(); i++){ cout << matches[i].distance << " " ; if(matches[i].distance <= max(2 * minDist, 40.0)){ goodMatches.push_back(matches[i]); } } cout << endl; cout << "good match min = " << goodMatches.size() << endl; cv::Mat outImgA, outImgB; cv::drawMatches(myImgA, keyPointsA, myImgB, keyPointsB, matches, outImgA); cv::drawMatches(myImgA, keyPointsA, myImgB, keyPointsB, goodMatches, outImgB); cv::imshow("without filter", outImgA); cv::imshow("with filter", outImgB); #endif char myWaitKey = cv::waitKey(); if(myWaitKey == 'q' || myWaitKey == 'Q'){ cout << "End of program ! " << endl; return 0; } }
结果展示
-
-
另外关于OPENCV与VSCODE的配置问题,请参考别的大神的教程。