在正文前,还是一个有趣的例子

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;     
}  

       注意正确的视频路径