OpenCV现在有1、2、3三个系列,1就比较老了,3在2的基础上增加了一些新的算法和T-API,但是没有了SIFT之类的算法,如果使用需要单独下载编译,目前基于2的资料和项目最多,所以新手建议使用OpenCV2。下面介绍详细的安装步骤和测试过程。
一、实验背景
(1)实验环境
系统为ubuntu 16.04.1 x64虚拟机版的最小化系统,具体参数如下:
1 2 3 4 | DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS" |
为了支持opencv的图形显示功能,首先安装图形界面
1、执行命令sudo apt install ubuntu-desktop
2、安装后需要重启系统
二、安装过程和测试
1. 先从sourceforge上下载OpenCV的源码
Wget http://jaist.dl.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip
2. 解压到任意目录
我的为/lib/OpenCV
unzip opencv-2.4.9.zip
3. 进入源码目录,创建release目录
cd opencv-2.4.9
mkdir release
4. 可以看到在OpenCV目录下,有个CMakeLists.txt文件,需要事先安装一些软件
sudo apt-get install build-essential cmake libgtk2.0-dev pkg-config python-dev python-numpy libavcodec-dev libavformat-dev libswscale-dev
5. 进入release目录,安装OpenCV是所有的文件都会被放到这个release目录下
cd release
6. cmake编译OpenCV源码,安装所有的lib文件都会被安装到/usr/local目录下
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. (指定安装目录)
7. 安装
sudo make install
8、建立链接库
sudo make install
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'(添加到系统链接库)
sudo ldconfig(生效)
9、编码
(1)SIFT代码:test.cpp
#include "opencv2/core/core.hpp"
#include "highgui.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
//待匹配的两幅图像,其中img1包括img2,也就是要从img1中识别出img2
Mat img1 = imread("1.jpg");
Mat img2 = imread("2.jpg");
SIFT sift1, sift2;
vector<KeyPoint> key_points1, key_points2;
Mat descriptors1, descriptors2, mascara;
sift1(img1,mascara,key_points1,descriptors1);
sift2(img2,mascara,key_points2,descriptors2);
//实例化暴力匹配器——BruteForceMatcher
BruteForceMatcher<L2<float> > matcher;
//定义匹配器算子
vector<DMatch>matches;
//实现描述符之间的匹配,得到算子matches
matcher.match(descriptors1,descriptors2,matches);
//提取出前30个最佳匹配结果
std::nth_element(matches.begin(), //匹配器算子的初始位置
matches.begin()+29, // 排序的数量
matches.end()); // 结束位置
//剔除掉其余的匹配结果
matches.erase(matches.begin()+30, matches.end());
namedWindow("SIFT_matches");
Mat img_matches;
//在输出图像中绘制匹配结果
drawMatches(img1,key_points1, //第一幅图像和它的特征点
img2,key_points2, //第二幅图像和它的特征点
matches, //匹配器算子
img_matches, //匹配输出图像
Scalar(255,255,255)); //用白色直线连接两幅图像中的特征点
imshow("SIFT_matches",img_matches);
waitKey(0);
return 0;
}
(3)文件目录
(4)创建临时目录我的为opencvsifttest,进入该目录,创建 CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage test.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
PROJECT(OpenCV_Example) //这是建立一个工程项目(类似于我们VS中建立C++项目一样),括号里面时工程名,工程名我们可以任意给,最后程序编译出来的可执行文件就是这个名字
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)//这是对CMake工具最低版本要求,这里我们要检查下我们的CMake工具的版本信息,我们可以使用命令“cmake --version”查看
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
FIND_PACKAGE( OpenCV REQUIRED ) //这是cmake用来查找opencv包用的,不用改
# Declare the target (an executable)
ADD_EXECUTABLE(OpenCV_Example Image_show.c) //这里括号里面的两个参数分别是工程项目名和我们要编译文件名的意思,记住中间一空格键隔开
TARGET_LINK_LIBRARIES(OpenCV_Example ${OpenCV_LIBS}) //这是我们链接到OpenCV库的环节,我们只要更改前面第一个参数位我们的工程项目名即可
#MESSAGE(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}") //好了,就修改这么点东西,保存,关闭。
10、编译和执行
在opencvsifttest目录中执行以下命令:
cmake .
make
./DisplayImage
11、执行结果
12、参考
http://blog.csdn.net/surgewong/article/details/39078251
http://blog.csdn.net/laobai1015/article/details/53665444
http://notes.maxwi.com/2017/04/01/ubuntu-compile-opencv3-with-cuda-and-ffmpeg/