opencv安装指南

opencv安装指南

用包管理器安装

比如ubuntu下是apt-get,mac下是brew。(windows下或许用nuget?)以ubuntu下为例。

查看opencv相关的包

aptitude search opencv

执行安装

发现有很多包。不妨安装绝大多数:

sudo apt-get install libopencv-*
sudo apt-get install opencv-data python-opencv

编译安装

为什么编译安装

opencv有些功能放在opencv_contrib中了,即便用包管理器安装了opencv_contrib,有些包还是不能用,一定要自行把opencvopencv_contrib一起编译。

下载源码

依然以ubuntu16.04为例。

opencv官网下载。或者用git:

mkdir -p ~/gitwhat      #自行建立的目录
cd ~/gitwhat
git clone https://github.com/opencv/opencv --depth=1          #depth表示只下载最新commit的代码,减少下载量。
git clone https://github.com/opencv/opencv_contrib --depth=1
cd opencv
vim compile.sh    #cmake编译参数很多,写到文件中方便些

编译脚本

compile.sh内容如下:

#!/bin/bash
set -x
set -e

rm -rf build
mkdir -p build
cd build

LOG="../cmake.log"
rm $LOG

exec &> >(tee -a "$LOG")

cmake \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-git-master \
-D WITH_CUDA=OFF \
-D WITH_VTK=OFF \
-D WITH_MATLAB=OFF \
-D BUILD_DOCS=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/chris/work/gitwhat/opencv_contrib/modules \
-D PYTHON2_EXECUTABLE=/usr/bin/python \
-D PYTHON3_EXECUTABLE=/usr/bin/python3 \
-D PYTHON_INCLUDE_DIR=/usr/include/python2.7 \
-D PYTHON_INCLUDE_DIR2=/usr/include/x86_64-linux-gnu/python2.7 \
-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3.5/dist-packages/numpy/core/include/ \
..

make -j8

make doxygen # 可选,用来编译出documentation,存放在`<opencv_root>/build/doc/doxygen/html`

sudo make install #可选,强烈建议执行。

其中,CMAKE_INSTALL_PREFIX表示make install的安装路径,可修改;OPENCV_EXTRA_MODULES_PATHopencv_contrib项目下的modules目录,自行修改。

make install是把opencv和opencv_contrib进行安装到一个统一的目录,如果后续用opencv的C++接口那么当写CMakeLists.txt时需要这个安装路径;如果仅仅是python opencv调用 ,那么只需要找到cv2.so就可以用了,可以不make install

执行编译脚本、解决3rdparty下载

执行编译脚本:

chmod +x compile.sh
./compile.sh

发现往往卡在ippicv等第三方包的下载上(国内网络你懂得)。通过查看相关的.cmake文件,发现是从github上的opencv_3rdparty项目下载的,这些下载地址有些需要改掉,下载第三方包后根据.cmake文件内容,重新压缩、修改md5的hash值等。

这些下载的包放到<opencv_root>/.cache目录下,并按照固定的规则命名。

以下是细节:

手动下载ippicv包

查看/3rdparty/ippicv/ippicv.cmake
此文件是要下载指定commit的opencv_3rdparty包的URL地址,并给出了验证的md5sum值。

URL地址是有问题的,现在(2017.04.15)不能用raw.githutcontent.com开头形式的URL下载东西了。

换用这个地址:

https://codeload.github.com/opencv/opencv_3rdparty/zip/81a676001ca8075ada498583e4166079e5744668

其中url最后一部分是commit的id

这样下载完的是zip包,解压它并压缩为.tgz格式。算出它的md5sum值。重命名为md5sum-文件名的格式:

1469ff5ced054be500921d2d46278ef4-ippicv_linux_20151201.tgz

移动到/.cache/ippicv目录下

手动下载protobuf包

查看opencv_contrib/modules/dnn/cmake/OpenCVFindLibProtobuf.cmake
此文件是要下载指定版本的protobuf-cpp。我这里是3.1版本的。它下载地址是:
https://github.com/google/protobuf/releases/download/v3.1.0/
这个地址会转到aws的地址,所以用迅雷下载吧。这个md5sum不用换。

或者下载地址换用这种形式:

https://codeload.github.com/google/protobuf/zip/a428e42072765993ff674fda72863c9f1aa2d268

其中URL最后的commit是protobuf-cpp-3.1对应的commit号。可以试试看。(试了,不行,因该是因为下载的不是protobuf-cpp吧)

xfeatures包

和上面的包的方法类似。只不过放到.cache目录下后,是把一个个的单个文件进行重命名,格式也是md5sum-文件名,记得对比.cmake文件中的hash值。

.cache目录结构

  .cache git:(master)  tree
.
├── ippicv
│   └── 1469ff5ced054be500921d2d46278ef4-ippicv_linux_20151201.tgz
├── protobuf
│   └── bd5e3eed635a8d32e2b99658633815ef-protobuf-cpp-3.1.0.tar.gz
├── tiny_dnn
│   └── adb1c512e09ca2c7a6faef36f9c53e59-v1.0.0a3.tar.gz
└── xfeatures2d
    ├── boostdesc
    │   ├── 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
    │   ├── 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
    │   ├── 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
    │   ├── 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
    │   ├── 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
    │   ├── 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
    │   └── e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
    └── vgg
        ├── 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
        ├── 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
        ├── 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
        └── e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i

6 directories, 14 files

编译后的设定-环境变量

新编译出来的cv2.so位于/usr/local/opencv-git-master/lib/cv2.so

要使用新编译出来的cv2.so,删除apt的python-opencv包,或者把cv2.so放到PYTHONPATH中。

sudo apt-get remove python-opencv
sudo ln -sf /usr/local/opencv-git-master/lib/python2.7/dist-packages/cv2.so /usr/lib/python2.7

mac下的compile.sh脚本

mac下装caffe时候发现,系统自带的python不靠谱用不了啊,brew的也不怎么能用,所幸有anaconda在。装好anaconda后再brew从源码装boost和boost-python,再caffe。。

对应的opencv编译脚本,改掉python相关的几个路径:

#!/bin/bash
set -x
set -e

LOG="../cmake.log"
touch $LOG
rm $LOG

exec &> >(tee -a "$LOG")

BUILD_ROOT=build

if [ -d $BUILD_ROOT ]; then
    rm -rf $BUILD_ROOT
fi
mkdir -p $BUILD_ROOT
cd $BUILD_ROOT

ANACONDA=/Users/tusdk/anaconda

cmake \
    -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-git-master \
    -D WITH_CUDA=OFF \
    -D WITH_VTK=OFF \
    -D WITH_MATLAB=OFF \
    -D BUILD_DOCS=ON \
    -D OPENCV_EXTRA_MODULES_PATH=/Users/tusdk/work/opencv_contrib/modules \
    -D PYTHON2_EXECUTABLE=${ANACONDA}/bin/python \
    -D PYTHON_INCLUDE_DIR=${ANACONDA}/include/python2.7 \
    -D PYTHON_LIBRARY=${ANACONDA}/lib/libpython2.7.dylib \
    -D PYTHON2_NUMPY_INCLUDE_DIRS=${ANACONDA}/lib/python2.7/site-packages/numpy/core/include/ \
    ..

make -j8

make doxygen # 可选,用来编译出documentation,存放在`<opencv_root>/build/doc/doxygen/html`

sudo make install

其他问题

opencv_world.so

编译opencv_contrib时候发现没有编译出opencv_world.so

需要cmake开启开关:

···
-D BUILD_opencv_world=ON
···

缺点:只生成一个opencv_world.so,其他的.so都没有!

编译opencv_contrib时报错Unknown CMake command ‘ocv_download’

问题出现原因:opencv_contrib里面用到的ocv_download函数没有找到对应的定义。很可能是:你的opencv是下载的.zip/.rar压缩包并且版本比较老(比如opencv-2.4.13.zip),而老版本的opencv中没有定义ocv_download函数

因为opencv_contrib模块只提供了opencv3的支持,只能放弃opencv2版本,或者手动去修改各种头文件和函数接口(暂时不考虑

重新编译时,再次需要下载ippicv等模型文件

建议搜索cmake目录下所有文件中的"file(REMOVE",注释掉对应的行。出现本状况的原因是opencv的cmake代码中,执行完下载和解压后就执行删除,好不容易下载好的东西就删除。。不理解这种做法。。

时间: 2024-10-02 23:55:58

opencv安装指南的相关文章

返回时C++内存问题opencv写的

问题描述 返回时C++内存问题opencv写的 //读取摄像头并保存为AVI文件 #include "cv.h" #include "highgui.h" int main(int argc,char**argv) { CvCapture* capture=0; IplImage *bgr_frame; int fps=25; int i; CvSize size; CvVideoWriter *writer; cvNamedWindow("Jimmy&q

openni opencv linux-如何在linux下建立一个着openni和opencv的工程?

问题描述 如何在linux下建立一个着openni和opencv的工程? 如何在linux下建立一个着openni和opencv的工程?麻烦大神们详细解说下,不胜感激!!!!

python结合opencv实现人脸检测与跟踪

  在Python下用起来OpenCV很爽,代码很简洁,很清晰易懂.使用的是Haar特征的分类器,训练之后得到的数据存在一个xml中.下面我们就来详细谈谈. 模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和pytho

视频处理-我用qt+opencv 录制了视频

问题描述 我用qt+opencv 录制了视频 我用qt+opencv 录制了视频,问题一:录制了1分钟,视频中不到一分钟!用了定时器,ntimer= 1000/fps; 问题二,怎么录制音频? 谢谢 解决方案 OpenCV 录制视频QT OpenCV 播放视频Opencv + Qt 获取视频中任意一帧

【OpenCV】椭圆拟合

直接上代码吧: #include "cv.h" #include "highgui.h" int slider_pos=70;//阈值 IplImage *image02 =0,*image03 = 0,*image04 = 0; void process_image(int h); int main(int argc ,char **argv) { //const char *filename ="binaryGroup.bmp"; const

指针-opencv学习灰度图锐化的两个函数的差别不理解

问题描述 opencv学习灰度图锐化的两个函数的差别不理解 下面是一个灰度图锐化的函数,我有两种方式实现,方式1,和方式2,居然得到的结果不一样,图片数据也不一样,请高手看一下,可能是C语言的知识掌握的不好. void my_sharpen(const cv::Mat &image, cv::Mat &result) { result.create (image.size(), image.type ()); for(int j=1; j<image.rows-1; j++) { u

opencv最新版本问题,不太理解

问题描述 opencv最新版本问题,不太理解 opencv最新版本opencv4.4.11中include有两个文件夹 opencv和opencv2,请问这和之前的opencv2.0只有一个include opencv 有什么区别啊?为什么现在的版本都包含两个文件夹,新版本中opencv2有什么作用? 解决方案 估计头文件有升级,看是否出现了一些新功能的头文件,所以用不同文件夹区分 解决方案二: 分为两个是出于向前兼容性的考虑,这样原先的源代码可以方便地移植到新版本而不会编译出错.

OpenCV肤色检测

前三种方式转载:http://blog.csdn.net/onezeros/article/details/6342567   第一种:RGB color space 第二种:RG color space 第三种:Ycrcb之cr分量+otsu阈值化 第四种:YCrCb中133<=Cr<=173 77<=Cb<=127 第五种:HSV中 7<H<29  下一步需要滤波操作 因为检测结果中有许多瑕疵 [cpp] view plaincopy #include "

OpenCv图像差分(算法自己实现)

效果杠杠的!! //图像差分 #include <stdio.h> #include <stdlib.h> #include "cv.h" #include "highgui.h" void Image_Minus(IplImage *X, IplImage *Y, IplImage *X_Y) { //图像差分函数,将图像1中像素和图像2中对应像素想减,要求X.Y.X_Y大小相同 int i,j,width,height,step,chan