opencv3.0开始分成主库+contrib库,一些不稳定的不成熟的涉及专利纠纷的库文件放置在contrib库中,contrib需要用户单独安装。本文采用opencv3.4.1配置TX2,其他opencv版本可类推。具体操作如下:
- 下载opencv3.4.1及对应的contrib
下载opencv3.4.1主模块source,地址:https://opencv.org/releases/page/2/
下载opencv3.4.1对应版本的contrib
地址:https://github.com/opencv/opencv_contrib/releases?after=4.0.0-beta
注意:opencv与从contrib版本必须保持一直。 - 创建软件安装目录
2.1在home下创建MySoftware(任意命名)安装软件,创建opencv安装文件夹
cd /home/nvidia/MySoftware
mkdir opencv
cd /home/nvidia/MySoftware/opencv
主:nvidia为TX2的名称,需要替换成自己的
2.2将下载完成的opencv3.4.1解压至/home/nvidia/MySoftware/opencv,将contrib解压至opencv3.4.1,如下图:
- 创建build目录
进入opencv安装目录/home/nvidia/MySoftware/OpenCv/opencv-3.4.1,创建build文件夹
cd /home/nvidia/MySoftware/opencv/opencv3.4.1
mkdir build
5.打开新终端,安装依赖项
依赖关系:
GCC 4.4.x or later
CMake 2.8.7 or higher
Git
GTK+2.x or higher, including headers (libgtk2.0-dev)
pkg-config
Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, python-numpy)
ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev
[optional] libtbb2 libtbb-dev
[optional] libdc1394 2.x
[optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev
注:官方文档中虽然说其中一些依赖包是可选的,但是最好还是都装上,以防出问题。
以上依赖包可用以下命令安装:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
-
opencv IPPICV 和 face_landmark_model.dat更改下载源
网络不好时, opencv IPPICV 和 face_landmark_model.dat下载容易失败,可在编译前参考如下博文处理ubuntu16.04 配置TX2 过程中opencv IPPICV 和 face_landmark_model.dat下载不下来的问题解决
https://mp.csdn.net/mdeditor/97647529# -
CMake Opencv源码:该步骤大约需要2小时左右
进入usr/local,创建opencv341目录,用于install
cd usr/local
mkdir opencv341
进入build目录:
`cd /home/nvidia/MySoftware/opencv/opencv3.4.1/build`
在该目录下运行:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv341 -D OPENCV_EXTRA_MODULES_PATH=/home/nvidia/MySoftware/OpenCv/opencv-3.4.1/opencv_contrib-3.4.1/modules/ -D PYTHON_DEFAULT_EXECUTABLE=$(which python3) -D WITH_TBB=ON -D WITH_EIGEN=ON ..
运行完成后如下图,说明没有错误:
运行sudo make
完成后运行sudo make install
一切顺利,没有报错,至此安装完成,下面进行系统配置。
8. 完成上述步骤后,接着配置环境变量等操作
sudo gedit /etc/ld.so.conf.d/opencv.conf
添加安装目录下/usr/local/opencv346的lib目录路径,并保存,输入内容如下:
sudo ldconfig
sudo gedit /etc/bash.bashrc
在bashrc文件末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv341/lib/pkgconfig
export PKG_CONFIG_PATH
9. 更新数据库
source /etc/bash.bashrc
sudo updatedb
如果updatedb报错,请参考:
ubuntu16.04 命令sudo updatedb报错: command not found解决方案https://blog.csdn.net/qq_41854650/article/details/97638260
查看opencv版本:
pkg-config --modversion opencv
至此OpenCV 3.4.1+contrib安装+配置完成。
11.测试是否安装成功
opencv3.0开始中SIFT匹配是在opencv_contrib库中的,可以用它来做一个简单的测试。
参考:
- cv::xfeatures2d::SIFT Class Reference:https://docs.opencv.org/3.4.1/d5/d3c/classcv_1_1xfeatures2d_1_1SIFT.html#gsc.tab=0
- OpenCV3.1 xfeatures2d::SIFT 使用:http://blog.csdn.net/lijiang1991/article/details/50855279
QT的pro配置:
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp
INCLUDEPATH += /usr/libaarch64-linux-gnu
INCLUDEPATH += /usr/local/opencv341/include \
INCLUDEPATH += /usr/local/opencv341/include/opencv \
INCLUDEPATH += /usr/local/opencv341/include/opencv2
LIBS += /usr/local/opencv341/lib/libopencv_*.so
LIBS += /usr/local/opencv341/lib/libopencv_*.so.3.4
LIBS += /usr/local/opencv341/lib/libopencv_*.so.3.4.1
程序:
#include <iostream>
#include <opencv2/opencv.hpp> //头文件
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
using namespace cv; //包含cv命名空间
using namespace std;
int main()
{
//Create SIFT class pointer
Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
//读入图片
Mat img_1 = imread("1.jpg");
Mat img_2 = imread("2.jpg");
//Detect the keypoints
vector<KeyPoint> keypoints_1, keypoints_2;
f2d->detect(img_1, keypoints_1);
f2d->detect(img_2, keypoints_2);
//Calculate descriptors (feature vectors)
Mat descriptors_1, descriptors_2;
f2d->compute(img_1, keypoints_1, descriptors_1);
f2d->compute(img_2, keypoints_2, descriptors_2);
//Matching descriptor vector using BFMatcher
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
//imshow("match", matches);
//绘制匹配出的关键点
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
imshow("【match图】", img_matches);
//等待任意按键按下
waitKey(0);
}
输出结果: