不能在opencv目录下直接执行 cmake . ,会报错,需要新建目录,在opencv的目录下新建一个目录叫做 build,cd进入该目录然后执行
以下笔记来自于https://blog.csdn.net/CupidYzw97/article/details/74857467
为以后方便参考,就把文章复制两过来,原来文中有个地方有点错位,我已用红色的字体标记出来。
二、OpenCV和Opencv_contrib的编译安装
1、安装依赖
在终端依次执行以下三条命令,安装所需要的依赖
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
2、cmake生成makefile
2.1、将下载好的OpenCV解压到自己的目标目录中,我提取到home目录下,为了方便重命名为opencv
2.2、如果要同时安装opencv_contrib的话,你需要将opencv_contrib.zip提取到opencv目录下,同时在该目录下新建一个文件夹build
2.3、进入build目录。并且执行cmake生成makefile文件
第一步:
cd opencv-3.2.0/build
第二步:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/opencv/opencv_contrib/modules/ ..
如果不需要opencv_contrib模块,最好不要在cmake指令中添加“-D OPENCV_EXTRA_MODULES_PATH=/home/opencv/opencv_contrib/modules/” ,即执行以下命令:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
如果同时需要给python3.5安装OpenCV时,则可参考以下命令:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D PYTHON3_EXECUTABLE=/usr/bin/python3 -D PYTHON_INCLUDE_DIR=/usr/include/python3.5 -D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.5/dist-packages/numpy/core/include -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=OFF -D PYTHON_EXECUTABLE=/usr/lib/python3 -D BUILD_EXAMPLES=ON ..
如果不安装opencv_contrib模块,则第二步的命令为:(这句话原博主忘记添加最后的两个"..")
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
其中/usr/local/opencv320是指将要install的路径,一般默认为/usr/local
在Ubuntu18.04上编译opencv时 回出现了usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: 没有那个文件或目录这个问题。
下面还有一行include_next<stdlib.h>.
在网上查了很多办法,居然有弱智的说要降回14.04. 研究了下,应该是预编译的问题。
利用Cmake的话,在编译前加入命令屏蔽预编译就行了 -DENABLE_PRECOMPILED_HEADERS=OFF
即:
cmake -D CMAKE_BUILD_TYPE=Release -D ENABLE_PRECOMPILED_HEADERS=OFF -D CMAKE_INSTALL_PREFIX=/usr/local ..
其中OPENCV_EXTRA_MODULES_PATH=/home/jason/opencv_contrib-3.2.0/modules/ .. 是指opencv_contrib-3.2.0中modules所在的路径,后面的两点不可省略
此过程中可能遇到的问题:
(1)、由于网络原因,可能出现ippicv_linux_20151201.tgz无法在终端下载的情况,则可以先单独下载ippicv_linux_20151201.tgz之后,把其移动到终端所提示的路径(终端会提示该路径找不到文件),如路径/opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e/
移动的时候,可以另外打开一个终端操作:
sudo mv ippicv_linux_20151201.tgz /opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e
(2)、可能在cmake过程中会出现以下三个同样原因的问题(注:下载我上面的版本的opencv_contrib由于我已经修改好了,所以不会出现这个问题)
出现上述类似问题的解决方法是将显示的错误信息的对应文件的对应位置中的FILENAME修改成PACKAGE即可。
3、make和install
在cmake成功之后,就可以在build文件下make了。(-j4表示核数)
第1步:
sudo make -j4
第2步:
sudo make install
make时可能出现的问题:
(1)、会提示少一些文件,目前发现这些文件都是在opencv_contrib/modules/xfeatures2d/src文件夹下缺少的,是由于在cmake是没有下载好。可能是因为服务器不在国内的原因。(我上传的opencv_contrib.zip压缩包也已经把这些文件添加进去了)。
只需要把相应的文件复制到opencv/opencv_contrib/modules/xfeatures2d/src文件夹下即可。
(2)、如果是先安装好的opencv3.2,然后在编译添加opencv_contrib时会出现一个Bug。如下:
cuda.hpp这个文件在相应的文件夹下寻找是肯定存在的,当初我出现这个问题的时候找了好多方法,都解决不了,最后还是删了以前先安装好的opencv然后重新把opencv和opencv_contrib同时编译安装,才没有这个问题的。所以我才在最开始建议大家opencv和opencv_contrib同时编译安装。目前我并没有找到有效的方法解决这个问题(我的问题是没解决),所以只能把我找的方法给大家贴上来,大家自己尝试以下,如果总是不成功,还是建议大家删了以前的opencv,重新把opencv和opencv_contrib同时编译安装。
方法:http://code.opencv.org/issues/4140
至此我们的opencv和opencv_contrib就编译安装完成了。一定要记着sudo make install 否则会出现自己的程序在编译时提示:error:为声明的定义
下面给大家一个例程,可以验证自己的opencv和opencv_contrib是否安装成功。
三、一个KCF跟踪的小例程
1、在自己想要的任何位置新建一个用于放例程文件夹:kcf_demo
2、新建一个简单的main.cpp文件
#include <opencv2/core/utility.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <cstring>
using namespace std;
using namespace cv;
int main() {
// declares all required variables
//! [vars]
Rect2d roi;
Mat frame;
//! [vars]
// create a tracker object
Ptr<Tracker> tracker = Tracker::create("KCF");
//! [create]
// set input video
//! [setvideo]
//std::string video = "/home/cuoid/kcfDemo/demo1/vtest.avi";
//VideoCapture cap(video);
VideoCapture cap(1);
//! [setvideo]
// get bounding box
//! [getframe]
cap >> frame;
//! [getframe]
//! [selectroi]选择目标roi以GUI的形式
if(!frame.empty()){
roi=selectROI("tracker",frame);
}
//! [selectroi]
//quit if ROI was not selected
if (roi.width == 0 || roi.height == 0)
return 0;
// initialize the tracker
//! [init]
tracker->init(frame, roi);
//! [init]
// perform the tracking process
printf("Start the tracking process\n");
for (;; ) {
// get frame from the video
cap >> frame;
// stop the program if no more images
if (frame.rows == 0 || frame.cols == 0)
break;
// update the tracking result
//! [update]
tracker->update(frame, roi);
//! [update]
//! [visualization]
// draw the tracked object
rectangle(frame, roi, Scalar(255, 0, 0), 2, 1);
// show image with the tracked object
if(!frame.empty()){
imshow("tracker",frame);
}
//! [visualization]
//quit on ESC button
if (waitKey(1) == 27)
break;
}
return 0;
}
这个例程是通过摄像头获取图像进行追踪。
3、在和main.cpp同一文件夹下创建一个CMakeLists.txt文件(CMake超级强大哦)
cmake_minimum_required(VERSION 3.0)
PROJECT(kfcDemo1)
SET(SRC_LIST main.cpp)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
ADD_EXECUTABLE(demo1 ${SRC_LIST})
target_link_libraries(demo1 ${OpenCV_LIBS})
find_package(OpenCV REQUIRED)是搜索opencv的包。
include_directories(${OpenCV_INCLUDE_DIRS})是定义opencv的包含目录所在的位置
target_link_libraries(demo1 ${OpenCV_LIBS})是链接opencv的库
4、新建Build文件夹并且进行编译
1、mkdir build
2、cd build
3、cmake ..
4、make
这样我们就得到了一个小程序demo1,可以直接调用看看效果,这里就不再放结果了。
四、卸载 已安装的opencv,重新编译安装
进入安装包的build文件执行:
make uninstall
cd ..
sudo rm -r build
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*
1
最后一个删除安装文件夹的操作可以不执行