OpenCV二系和三系不是简单地三系就比二系新,比二系好的关系,两个版本主要是接口不同,而两个版本都在维护更新。同时安装两个版本在使用时需要在CmakeLists.txt中调用时需要进行区分。
查看opencv版本
pkg-config --modversion opencv
下载安装包, unzip解压, 先安装依赖项, 依赖项可参考(https://blog.csdn.net/xbs150/article/details/77840786)
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff5-dev libopenexr-dev libtbb-dev libgstreamer-plugins-base1.0-dev libjasper-dev
上github/opencv下安装包, 和第三方库
在解压后的安装包下mkdir build && cd build
创建目标安装文件夹sudo mkdir /usr/local/bin/opencv-2.4.13.6
cmake并避免掉CUDA影响
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_CUBLAS=0 -D WITH_CUDA=0 -D WITH_CUFFT=0 -D CMAKE_CXX_STANDARD=11 -D CMAKE_INSTALL_PREFIX=/usr/local/bin/opencv-3.4.10 ..
-D WITH_TBB=ON -D WITH_V4L=ON
或者支持CUDA的代码
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_CUBLAS=1 -D WITH_CUDA=ON -D WITH_CUFFT=1 -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D BUILD_TIFF=ON -D WITH_X11=ON -D WITH_GSTREAMER=ON -D WITH_IPP=OFF -D BUILD_opencv_cudalegacy=OFF -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-9.0 -D CUDNN_LIBRARY=/usr/local/cuda-9.0/lib64 -D CUDNN_INCLUDE_DIR=/usr/local/cuda-9.0/include -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.5/modules -D CMAKE_INSTALL_PREFIX=/usr/local/bin/opencv-3.4.5 ..
也可指定python版本并添加很多安装项(未知意义)
cmake -D CMAKE_BUILD_TYPE=RELEASE -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules -D BUILD_EXAMPLES=ON -D WITH_FFMPEG=ON -D WITH_LIBV4L=ON -D WITH_GTK=ON -D WITH_OPENGL=ON -D WITH_OPENCL=ON -D WITH_OPENMP=ON -D WITH_ZLIB=ON -D BUILD_PNG=ON -D BUILD_JPEG=ON -D BUILD_TIFF=ON -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_LAPACK=OFF -D CMAKE_INSTALL_PREFIX=/usr/local/bin/opencv-3.4.6 -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON -D PYTHON3_EXECUTABLE=$(which python) -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..
若缺少gstreamer参考(https://answers.opencv.org/question/95734/cmake-not-picking-gstreamer-on-ubuntu/)
其余可参考(https://www.cnblogs.com/yuanlibin/p/7735274.html)
(http://www.zsxrpd.com/blog/?p=671)(https://blog.csdn.net/djstavaV/article/details/86884165)
-j4代表开4个线程, 加快速度
sudo make -j4
sudo make install
还需要修改环境变量
vim ~/.bashrc
在后面追加
export PKG_CONFIG_PATH=/usr/local/bin/opencv-2.4.13.6/lib/pkgconfig${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
和export LD_LIBRARY_PATH=/usr/local/bin/opencv-2.4.13.6/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
这时使用命令已变成2.4
pkg-config --modversion opencv
首先把对应的路径弄清楚了,然后在CMakeList.txt才可以进行对应的设定
set(OpenCV_DIR /usr/local/bin/opencv-3.4.5/share/OpenCV)
find_package(OpenCV 3.4 REQUIRED)
include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS} /usr/local/bin/opencv-3.4.5/include)
link_directories(${OpenCV_LIBRARY_DIRS} /usr/local/bin/opencv-3.4.5/lib))
当你想返回使用默认的opencv2时,将find_package(OpenCV 3.4 REQUIRED )换成find_package(OpenCV REQUIRED )即可,并将该代码上面一行和下面俩行注释即可。
缺少.so库
缺少.so库时使用ldd main
查看缺哪些库, locate对应的库名, 然后vim /etc/ld.so.conf.d/opencv.conf
, 在里面添加库的路径(/lib), 之后sudo ldconfig
对于编译不成功的可能是库找的不对, 使用如下命令即可
g++ -o test_1 test_1.cpp `pkg-config opencv --cflags --libs`
简便方法(不推荐使用)
使用pip安装opencv3 (pip无opencv2)
pip install opencv-python==3.4.5.20
使用apt-get安装opencv2:
- 在Ubuntu14.04和16.04下一般运行
sudo apt-get install libopencv-dev
安装2.4系列OpenCV,然后在官网下载安装三系OpenCV。 - 而在Ubuntu18.04中
sudo apt-get install libopencv-dev
安装的OpenCV版本为3.2,还是有一些区别的。
使用apt-get安装opencv2对应的库lib在 /usr/lib/x86_64-linux-gnu/,头文件include在/usr/include/opencv和/usr/local/include/opencv2中, 需对应的在CMakeList.txt中修改.
pip输出环境包需求到requirements.txt
pip freeze | grep -v "pkg-resources" > requirements.txt
opencv2.x和opencv3.x的区别
- cv.CV_RGB2LAB变COLOR_RGB2Lab
import cv2 as cv
cv.cv.CV_RGB2Lab # opencv2
cv.COLOR_RGB2Lab # opencv3
- cv2.cvBoxPoints变cv2.boxPoints
box = np.array(cv2.cv.BoxPoints(rect)) # opencv2
box = np.array(cv2.boxPoints(rect)) # opencv3
- cv2.cv.CV_RETR_CCOMP变cv2.RETR_CCOMP
mode=cv2.cv.CV_RETR_CCOMP, # opencv2
mode=cv2.RETR_CCOMP, # opencv3
- cv2.cv.CV_CHAIN_APPROX_SIMPLE变cv2.CHAIN_APPROX_SIMPLE
method=cv2.cv.CV_CHAIN_APPROX_SIMPLE # opencv2
method=cv2.CHAIN_APPROX_SIMPLE # opencv3
cv2扩展库是针对OpenCV 2.x API创建的,直接采用NumPy的数组对象表示图像,和pyopencv相比,不再需要在数组和Mat对象之间相互转换了。
cv2的函数直接对Numpy数组进行操作,
cv2读取图像是数组,array = cv2.imread()
(1)cv读取图像:
①iplimage = cv.LoadImage()
<type 'cv2.cv.iplimage'>
<iplimage(nChannels=3 width=1212 height=824 widthStep=3636 )>
②cvmat = cv.LoadImageM()
<type 'cv2.cv.cvmat'>
<cvmat(type=42424010 8UC3 rows=824 cols=1212 step=3636 )>
(2)array, iplimage, cvmat 转换
array------> cvmat: cv.fromarray(array)
cvmat------> array: np.asarray(cvamt)
cvmat------> iplimage: cv.GetImage(cvmat)
iplimage----> cvmat: iplimage[:], 或 cv.GetMat(iplimage)
加速图片decode
- 可以使用jpeg4py库, 内部封装了libjpeg-turbo
- 手动编译opencv, 替换libjpeg库为libjpeg-turbo
- 编译支持CUDA的opencv, 使用cuda去做图片处理