2018.08.22更新:
Mac到手了,环境立马配起来,先把ffmpeg装了不然后面读视频读不了。
brew install ffmpeg
brew install pkg-config
pkg-config这个东西有点恶心,装了ffmpeg还不行,在ccmake里一直显示ffmpeg是no,非得装,opencv还有个专门的issue OpenCV 3.2.0 won’t see ffmpeg on cmake. Versions 3.1.0 and 3.0.0 will,不过不用看那么多,只要把pkg-config装好,ccmake上面的ffmpeg就yes了。
然后我还是先装的python3版的anaconda,cmake命令如下,后面编译什么的都一样不多说了。
cmake -D WITH_IPP=OFF -D PYTHON_DEFAULT_EXECUTABLE=/Users/phd/Softwares/anaconda3/bin/python3 -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D PYTHON3_EXCUTABLE=/Users/phd/Softwares/anaconda3/bin/python3 -D PYTHON3_INCLUDE_DIR=/Users/phd/Softwares/anaconda3/include/python3.6m -D PYTHON3_LIBRARY=/Users/phd/Softwares/anaconda3/lib/libpython3.6m.dylib -D PYTHON_NUMPY_PATH=/Users/phd/Softwares/anaconda3/lib/python3.6/site-packages ..
2018.07.16更新:
以前把anaconda装在Documents里了,强迫症看着不舒服,今天把乱七八糟的文件夹都清理了一下,把原来的anaconda和opencv全删了,网上下了最新的anaconda 3.5.2和最新的opencv 3.4.2源码,按之前的步骤重新编译了一遍(就改了路径,下面可以看到我在opt,自己随意不强求),编译完了直接sudo make install安装,基本上没啥问题。
贴出命令以示清白(如果是别的版本,先看下libpython3.6m.so.1.0等这些东西都在不在,是不是,千万不要直接拷代码硬刚)
cmake -D WITH_IPP=OFF -D PYTHON_DEFAULT_EXECUTABLE=/opt/anaconda3/bin/python3 -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D PYTHON3_EXCUTABLE=/opt/anaconda3/bin/python3 -D PYTHON3_INCLUDE_DIR=/opt/anaconda3/include/python3.6m -D PYTHON3_LIBRARY=/opt/anaconda3/lib/libpython3.6m.so.1.0 -D PYTHON_NUMPY_PATH=/opt/anaconda3/lib/python3.6/site-packages ..
在使用的时候,可能会遇到下面这个小问题需要解决一下:
在编译完上述新的opencv并安装之后,我在编译自己用qt写的标注工具(用cmake管理的)的时候出现了下面的错误:
//opt/anaconda3 libpng16.so.16 对‘inflateValidate@ZLIB_1.2.9’未定义的引用
网上一搜,所有的来源基本上都是在编caffe的时候才遇到的这个问题,而所有的答案基本上都来源于下面caffe的这个issue:
https://github.com/BVLC/caffe/issues/6139
我自己的机子根本就没装caffe,让改的Makefile.config是caffe的又不是opencv里的,搞毛线啊。
后来仔细看下路径,//opt/anaconda3 前面两条杠是几个意思?我以为问题出在路径这里,ccmake ..进去看了下,路径没问题啊。
接着我以为是那俩库没装,于是conda install libpng zlib…了一波,但是没卵用,装得时候问我要不要更新anaconda里的这几个库。。。
再后来想了想,链接问题,估计就是opencv编译的时候没带上这几位。于是马上ccmake ..,t一下找到如下flags:
BUILD_ZLIB
BUILD_JPEG
BUILD_TIFF
BUILD_PNG
#上面四个是指从源码编译安装库,如果install了可以不用再开
WITH_PNG
WITH_JPEG
WITH_TIFF
全ON一波,然后查看一下上面这些库的lib和include都指到了正确的位置。接着就是c g, make -j8了,make完了install,跑项目稳的一笔。
总结:ccmake是个好东西
2017.10.16原文:
anaconda pip或者conda直接install opencv-python的opencv版本无法读取视频,装了ffmpeg也没用,估计是被阉割了,没办法只能下源码编译。
重复一下:系统是Ubuntu 16.04;anaconda是python3.6的,装在了/home/naphid/Documents/anaconda3里;opencv源码版本是3.3。
下完opencv源码后解压,新建一个build文件夹,cd到build;直接输入cmake .. 不出意外opencv会链到系统的python2.7上去(看cache可知),所以需要指定到咱下的anaconda的python3上;另外IPP这个加速包一般被墙了下不来,反正我们也是research不是production,干脆不要算了。下面的命令复制到终端,实在不行就一行行复制,记得把python所有相关路径改到自己的anaconda下。 (用ccmake改也行)
cmake
-D WITH_IPP=OFF
-D PYTHON_DEFAULT_EXECUTABLE=/home/naphid/Documents/anaconda3/bin/python3
-D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF
-D PYTHON3_EXCUTABLE=/home/naphid/Documents/anaconda3/bin/python3
-D PYTHON3_INCLUDE_DIR=/home/naphid/Documents/anaconda3/include/python3.6m
-D PYTHON3_LIBRARY=/home/naphid/Documents/anaconda3/lib/libpython3.6m.so.1.0
-D PYTHON_NUMPY_PATH=/home/naphid/Documents/anaconda3/lib/python3.6/site-packages
..
从cmake的summary中确认已经成功链到想要的地方后,开始编译。
make -j4
编译完成后,把编译出来的cv2.cpython-36m-x86_64-linux-gnu.so库拷到anaconda的python库包下;其实不用sudo make install,opencv就已经可以用了,python的warpper都有。
cp /home/naphid/Documents/opencv-3.3.0/build/lib/python3/* ~/Documents/anaconda3/lib/python3.6/site-packages/
终端输入python,import一下cv2,多半会出错。
naphid@phdsky:~/Documents/anaconda3/lib/python3.6/site-packages$ python
Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:09:58)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "" , line 1, in <module>
ImportError: /home/naphid/Documents/anaconda3/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/naphid/Documents/anaconda3/lib/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so)
如果出了上面的错误`GLIBCXX_3.4.21’ not found,一定是因为gcc库版本太老,conda装个。
conda install libgcc
再试一次,import应该没问题了,然后赶紧试一下能读视频否。
import cv2
cap = cv2.VideoCapture('/home/naphid/Documents/phd.avi')
print(cap.isOpened())
while (cap.isOpened()):
ret, frame = cap.read()
if frame is None:
break
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
如果还是不能读取视频打印了False的话,估计以前没装过ffmpeg视频解码相关库,sudo apt install ffmpeg装一下,再重来之前所有步骤即可。
之前其实直接把so库拷过去就能用,但是后来在编译caffe的时候发现cmake找不到源码编的opencv;原因是opencv相关config没在系统路径里,cmake找不到,所以如果要基于opencv编译其他东西的话,最好还是install一下。
sudo make install