从参加工作到现在,使用opencv已经有近五个月的时间,从刚开始误入歧途学习1.x版本的API到后来纠正学习路线,再到用Opencv做很多图像处理工作。在这过程中,opencv从2.4.3更新到了2.4.5,每一次都让我有一种耳目一新的感觉,当我使用2.4.3编写程序要被java调用时,刚开始想到采用JNI,但是发现2.4.3到2.4.4的更新正式添加了的java的支持,虽然在2.4.3之前就有java版本的opencv,但是是由一个岛国程序猿贡献的,性能不是特别好。当我使用2.4.4工作的是对CLAHE算法进行纠结的时候,2.4.5出现了,其中一条就是添加CLAHE的算法,让我又小激动了一下。随着使用的时间越来越长,对opencv的module也了解的越来越清楚,甚至都发现了一两个小bug自己动手进行了修复,然后重新编译。废话不多说了,之前最视频采集压缩编码时发现对H264编码的不支持,于是回忆起半年过前做基于ARM的嵌入式视频采集项目时利用x264和ffmpeg作h264编码压缩,这次同样采用这种方法进行,于是乎进行添加x264和ffmpeg的支持。

过程如下(环境Ubuntu12.04.2 LTS):

1.清除原有的x264和ffmpeg,方面后续的手动编译(aptitude与apt-get的等同,在处理包的依赖关系时更加优秀,所以我一般采用这个软件包管理工具)。

sudo aptitude remove ffmpeg x264 libx264-dev

2.安装x264和ffmpeg依赖的软件包

sudo aptitude update
sudo aptitude install build-essential checkinstall git cmake libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev texi2html yasm zlib1g-dev

3.下载并编译安装x264源码包

ftp://ftp.videolan.org/pub/videolan/x264/snapshots/下载一个稳定的x264源码包,不需要太新,但也不要太老,太新的源码包依赖于较新的其他包,比如x264-20130531stable依赖yasm版本要高一些,但是apt源中提供的版本较低,需要手动编译yasm。假如yasm需要其他更新的包,这样就更加繁琐了,为了方便我这里采用一年前的安装包。

cd /opt
sudo wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20120601-2245-stable.tar.bz2
sudo tar -xvf x264-snapshot-20120601-2245-stable.tar.bz2
cd x264-snapshot-20120601-2245-stable
#如果使用的32位的linux,按照如下选项编译即可。
sudo ./configure --enable-static --enable-shared
sudo make 
sudo make install

如果你使用的是64位的linux,则需要按照如下的选项编译。

sudo ./configure --enable-shared --enable-pic
sudo make 
sudo make install

否则在编译opencv过程中,会出现如下错误提示:
Linking CXX shared library ../../lib/libopencv_highgui.so
/usr/bin/ld: /usr/local/lib/libavcodec.a(avpacket.o): relocation R_X86_64_32S against `av_destruct_packet’ can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
大概是编译到26%的过程中.
3.下载并编译安装ffmpeg(由于ffmpeg需要先安装x264,所以顺序不能颠倒)
最新版本的ffmpeg可以到http://ffmpeg.org/download.html下载,这里我采用的是1.2.1的版本。过程如下:

cd /opt
sudo wget http://ffmpeg.org/releases/ffmpeg-1.2.1.tar.bz2
sudo tar -xvf ffmpeg-1.2.1.tar.bz2
cd ffmpeg-1.2.1
#如果是linux32位平台
sudo ./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab
sudo make
sudo make install
#如果是linux64位平台
sudo ./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab --enable-shared --enable-pic
sudo make 
sudo make install

这样x264和ffmpeg就编译安装完成了,其中特别注意的是如果是其他架构的CPU,比如64位或者ARM架构的,configure选项是不同的,其中64位的cpu架构特别需要–enable–shared –enable-pic选项。否则就会报上述错误,如果没有–enable-shared会默认编译为静态库,但是编译opencv的时候链接器无法识别该库,至于–enable-pic选项原因暂时未知,不过在编译ffmpeg的时候经常需要这个选项。
4.安装opencv2.4.5
这是目前最新版的opencv了,下载之后,放到/opt目录下

cd /opt/opencv-2.4.5
mkdir release
cd release
#cmake如果有其他需要的话可以根据官方文档进行添加,比如添加TBB支持,-DWITH_TBB=ON 
cmake .. 
sudo make 
sudo make install

这样,为opencv编译x264和ffmpeg就安装完成了。
总结:
很久没用采用源码包编译安装程序了,这次编译让我回忆起了几年前刚学习linux源码包安装的时的乐趣。几年过去了,Linux也从虚拟机搬到了我实体机,“windows7下虚拟机安装linux的日子”变成了现在“linux下虚拟机安装windows7”的日子。手中管理的Linux VPS和服务器也越来越多。也许大学给我的其中之一就是“喜欢”上linux?在linux下开发我还是个小菜鸟,希望未来的很长的日子里,我可以从在linux下开发发展为对linux开发。
编译参考:
A Comprehensive Guide to Installing and Configuring OpenCV 2.4.2 on Ubuntu Web Site:http://www.ozbotz.org/opencv-installation/
Sebastian Montabone has several articles on installing OpenCV and image processing. His web site is http://www.samontab.com/

编译opencv添加x264和ffmpeg支持

发表评论

电子邮件地址不会被公开。 必填项已用*标注