Ubuntu下 OpenCV3.4.1和OpenCV_Contrib3.4.1的配置
说明
-
目前OpenCV4官方版本已经更新到了4.4.0版,OpenCV3也已经更新到了3.4.11,但理论OpenCV3各个版本的配置方法相同,下面以3.4.1为例配置;
-
许多项目由于要使用一些OpenCV中已经集成到contrib中的模块,所以需要重新编译OpenCV和OpenCV_Contrib,之前安装配置一直没有记录,这次特意记录便于后续使用,供大家参考,如有纰漏或问题,欢迎留言。
-
但务必注意,两者版本必须保持一致。
一、下载
-
可以直接在官网、GitHub进行下载对应版本的Sources:
-
由于官网下载速度过慢,给出百度云链接,附一些教程书籍(提取码: gq39):
二、安装
2.1 各种依赖包安装
sudo apt-get install pkg-config
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev qt5-default
sudo apt-get install build-essential qt5-default ccache libv4l-dev libavresample-dev libgphoto2-dev libopenblas-base libopenblas-dev doxygen openjdk-8-jdk pylint libvtk6-dev
2.2 编译前准备
1、解压:
直接将两个包解压:
sudo unzip opencv-3.4.1.zip
sudo unzip opencv_contrib-3.4.1.zip
2、构建目录结构
将opencv_contirb放入opencv目录:
sudo cp -r opencv_contrib-3.4.1 opencv-3.4.1
进入opencv-3.4.1目录下,新建build文件夹,使用cmake生成makefile:
cd opencv-3.4.1
sudo mkdir build && cd build
确保你的opencv-3.4.1目录如下所示:
2.3 编译安装
1、生成makefile文件
在build目录下,使用cmake生成Makefile:
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/rjj/文档/opencv-3.4.1/opencv_contrib-3.4.1/modules/ ..
sudo cmake -DENABLE_PRECOMPILED_HEADERS=OFF -D CMAKE_BUILD_TYPE=Release -DBUILD_TIFF=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/rjj/文档/opencv-3.4.1/opencv_contrib-3.4.1/modules/ ..
注意:OPENCV_EXTRA_MODULES_PATH是你自己opencv_contrib-3.4.1下面的modules目录,务必进行修改后在执行,下图给出一个例子:
即OPENCV_EXTRA_MODULES_PATH=/home/rjj/文档/opencv-3.4.1/opencv_contrib-3.4.1/modules … ,两点不能省略
经过一段时间后生成完毕,提示如下:
2、编译
Makefile成功生成后,使用make在build下直接编译:
sudo make
#sudo make -j8 #可以使用多线程编译,加快速度
编译需要更长一段时间(我自己在15分钟左右,如果中间中断,可以多次执行),成功后提示:
然后进行安装即可:
sudo make install
2.4 链接库共享
为了让编译器发现你的OpenCV库,需要执行:
sudo ldconfig -v
至此,安装全部结束。
三、测试
3.1 使用OpenCV官方测试程序测试
进入如下目录:/home/rjj/文档/opencv-3.4.1/samples/cpp/example_cmake,执行以下命令:
cd /home/rjj/文档/opencv-3.4.1/samples/cpp/example_cmake
sudo mkdir build && cd build # 建立编译build文件夹
sudo cmake .. # 生成makefile文件
sudo make # 编译生成目标文件opencv_example
该程序会自动打开摄像头,并在图像左上角显示Hello OpenCV字样,出现下图即说明安装成功:
3.2 测试opencv_contirb模块
这里我们直接使用opencv训练好的人脸、人眼分类器进行检测。
- 新建main.cpp,复制如下程序:
#include<iostream>
#include<string>
#include<opencv2/opencv.hpp>
#include<opencv2/calib3d/calib3d.hpp>
using namespace std;
using namespace cv;
int main() {
Mat image_src, image_gray;
VideoCapture capture(0);
while (1) {
capture >> image_src;
cvtColor(image_src, image_gray, CV_BGR2GRAY);
equalizeHist(image_gray, image_gray); //直方图均衡化,增加对比度
String face_cascade_name = "../haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "../haarcascade_eye.xml";
CascadeClassifier face_cascade, eyes_cascade; //载入分类器
if (!face_cascade.load(face_cascade_name)) { //加载脸部分类器失败
cout << "Load haarcascade_face.xml failed!" << endl;
return 0;
}
if (!eyes_cascade.load(eyes_cascade_name)) { //加载眼部分类器失败
cout << "Load haarcascade_eye.xml failed!" << endl;
return 0;
}
vector<Rect> eyeRect;
vector<Rect> faceRect;
//检测关于眼睛部位位置
eyes_cascade.detectMultiScale(image_gray, eyeRect, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30));//检测
for (size_t eyeIdx = 0; eyeIdx < eyeRect.size(); eyeIdx++)
{
rectangle(image_src, eyeRect[eyeIdx], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
//检测关于脸部位置
face_cascade.detectMultiScale( image_gray, faceRect, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30));//检测
for (size_t i = 0; i < faceRect.size(); i++)
{
rectangle(image_src, faceRect[i], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
imshow("Image recognition", image_src); //显示当前帧
/*char c = waitKey(30); //延时30ms,即每秒播放33帧图像
if (c == 27) break;*/
waitKey(20);
}
return 0;
}
- 新建CMakeLists.txt,内容如下:
project(face_v1.0)
cmake_minimum_required(VERSION 3.0)
find_package(OpenCV REQUIRED)
add_executable(face_v1.0 main.cpp)
target_link_libraries(face_v1.0 ${OpenCV_LIBS})
-
将下载好的两个.xml文件复制进去:
[百度云链接,包含一些OpenCV教程书籍](https://pan.baidu.com/s/13OPHO6GA4fmwg8JZgay49Q 密码: gq39")
-
现在你的文件夹应该如下所示:
-
编译执行:
执行如下命令:
mkdir build && cd build # 建立编译build文件夹 cmake .. # 生成makefile文件 make # 编译生成目标文件face_v1.0 ./face_v1.0 # 运行目标文件
程序会自动打开摄像头,并标注人脸、人眼位置,此时说明opencv_contrib模块中功能基本正常,至此,所有安装测试均已完成。改程序结果如下所示:
四:常见错误记录
1.、编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件
查看 build 文件夹下的日志文件 CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中搜索 boostdesc_bgm.i 关键词。日志文件里就有它的下载地址,到指定位置下载即可。https://github.com/opencv/opencv_contrib/issues/1301,点开上面这个网址往下拉,有人提供了缺失的各个文件的链接,点击保存. 或者直接在这个网页里搜索 BenbenIO 这个用户的回答。
或者到本文提供的下载镜像去下载:boostdesc_bgm.i,vgg_generated_48.i等.rar
下载后,直接拷贝源码并生存同名文件,放在 opencv_contrib/modules/xfeatures2d/src/ 路径下即可。
2、在编译stitching模块时会提示找不到cuda.hpp
有什么还能比情况更让人心碎,漫长的等待,99%那一刻出现错误!往上翻还是xfeatures2d缺少文件,太难了。
解决方法是在opencv/modules/stitching/CMakeLists.txt文件中加入一条语句使其include opencv_contrib/modules/xfeatures2d/include,可以是绝对路径,如
INCLUDE_DIRECTORIES("/home/rjj/文档/opencv-3.4.1/opencv_contrib-3.4.1/modules/xfeatures2d/include")
**注意:**出现上述1、2问题需要重头开始编译安装。。。
3、运行程序,出现Failed to load module "canberra-gtk-module"错误
sudo apt-get install libcanberra-gtk-module
附录 :CmakeLists.txt的一般写法
cmake_minimum_required(VERSION 2.0) #指定cmake版本
project(face_6.0) #指定项目的名称,一般和项目的文件夹名称对应
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 -pthread")
#指定头文件目录
include_directories(./)
include_directories(./inc)
#指定静态和动态文件目录
link_directories(../linux_so)
#
find_package(OpenCV REQUIRED)
#该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。
#arcsoft_face生成的库文件名 [STATIC | SHARED | MODULE] 库类型
add_executable(face_6.0
./inc/amcomdef.h
./inc/arcsoft_face_sdk.h
./inc/asvloffscreen.h
./inc/merror.h
./master.cpp
./face_Factory.cpp
./face_Factory.hpp
./LinuxSerial.cpp
./LinuxSerial.hpp
)
#在给定的作用域内设置一个命名的属性
set_property(TARGET face_6.0 PROPERTY POSITION_INDEPENDENT_CODE ON)
#链接库文件
target_link_libraries(face_6.0
arcsoft_face
arcsoft_face_engine)
target_link_libraries(face_6.0 ${OpenCV_LIBS})