mac os上安装有视频解码器的opencv3
在正文前,还是一个有趣的例子
See the Pen Ԉ Shuffle by 攻伤菊菊长 (@THISISAGOODNAME) on CodePen.
昨天安装了openCV2,但是安装的是homebrew预编译的版本,缺少很多模块,所以我现在使用homebrew编译定制版本的openCV3(带ffmpeg模块),并让系统中的openCV2和openCV3共存。
使用homebrew安装带ffmpeg模块的openCV3
如果你的网络条件很优秀,可以直接使用下面的命令
brew install homebrew/science/opencv3 --with-ffmpeg
网络条件不优秀的情况
homebrew编译安装openCV3时,依赖文件需要 ippicv_macosx_20141027.tgz,如果直接用命令不行,可以自行想办法下载下来,然后放在 /Library/Caches/Homebrew
目录下
然后在执行cmake时,还会有一件更让人不爽的事,ippicv在sourceforge上的代码并不是最新的,他需要的是 ippicv_macosx_20151201.tgz,下载地址为 “https://raw.githubusercontent.com/Itseez/opencv_3rdparty/81a676001ca8075ada498583e4166079e5744668/ippicv/ippicv_macosx_20151201.tgz”。cmake不会使用代理,因此这个文件下不下来。homebrew编译的路径在/tmp下,是一个临时文件,一旦停止立刻消失,正常的复制的方法不管用。
这位大神的这篇文章给了一个迂回但非常棒的解决方案,在本地建立一个server并把 raw.githubusercontent.com 重定向到本地。
创建一个SSL认证文件
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
# when Common Name (e.g. server FQDN or YOUR name) []:raw.githubusercontent.com
openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
cat server.crt server.key > server.pem
这篇文章中有更详细的关于用python建立https服务的方法
把ippicv_macosx_20151201.tgz放到正确的位置
dir=Itseez/opencv_3rdparty/81a676001ca8075ada498583e4166079e5744668/ippicv
mkdir -p $dir
mv ippicv_macosx_20151201.tgz $dir/
创建一个python服务的脚本
#!/usr/bin/python
import BaseHTTPServer, SimpleHTTPServer
import ssl
httpd = BaseHTTPServer.HTTPServer(('localhost', 443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='/path/to/server.pem', server_side=True)
httpd.serve_forever()
使用80,443端口时,需要管理员权限
修改hosts文件
修改/etc/hosts文件,加入下面这行
127.0.0.1 raw.githubusercontent.com
再次使用homebrew
brew install homebrew/science/opencv3 --with-ffmpeg
现在执行这条命令,应该没问题了。
切换openCV2到openCV3
现在,mac系统中同时安装了openCV2和openCV3,但是两个版本同时只能有一个版本生效
执行下面的命令
#断开OpenCV 2的库链接,Terminal输入
brew unlink opencv
#链接OpenCV 3的库文件
brew ln opencv3 --force
测试安装的openCV版本
可以使用下面的代码
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
using namespace cv;
using namespace std;
cout << CV_VERSION << endl;
return 0;
}
输出的应该是3.x.x
测试视频模块是否正常
使用下面的代码
#include <opencv2\opencv.hpp>
using namespace cv;
int main( )
{
//【1】读入视频
VideoCapture capture("PATH/TO/YOUR/VIDEO");
//【2】循环显示每一帧
while(1)
{
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture>>frame; //读取当前帧
imshow("读取视频",frame); //显示当前帧
waitKey(30); //延时30ms
}
return 0;
}
注意正确的视频路径