一直想找时间研究下opencv,趁这段时间不是很忙,就开始着手了,以下记录在安装配置opencv环境时遇到的问题:
1.在安装opencv源文件的时候,make出现了问题,大致如下:
a)error ptrdiff_t does not name a type:这个问题的解决办法是在出现该问题的文件中加入using std::ptrdiff_t,这样就认识了。
b)error no such instruction:'swpb %cl,%dl,[%edi]',类似于这类问题,是因为不认识汇编的原因,将出现该问题的文件中汇编代码用c表示即可,如我在修改过程中碰到的问题,可以修改qatomic_arm.h。
inline char q_atomic_swp(volatile char *ptr, char newval)
{
register char ret;
/*asm volatile("swpb %0,%2,[%3]"
: "=&r"(ret), "=m" (*ptr)
: "r"(newval), "r"(ptr)
: "cc", "memory");*/
ret=*ptr;
*ptr=newval;
return ret;
}
2.安装ffmpeg播视频的支持,详细依赖库的下载安装如下(来自guiru的博文http://blog.csdn.net/guiru/article/details/6023691)
a)1、lame
lame-3.97.tar.gz
Url:http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309
安装方法如下:
2、libogg
libogg-1.1.3.tar.gz
Url:http://downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz
安装方法如下:
3、libvorbis
libvorbis-1.1.2.tar.gz
Url:http://downloads.xiph.org/releases/vorbis/libvorbis-1.1.2.tar.gz
安装方法如下:
4、xvid
xvidcore-1.1.3.tar.gz
Url:http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz
安装方法如下:
5、x264
x264-snapshot-20071107-2245.tar.bz2
Url:http://www.videolan.org/developers/x264.html
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
安装方法如下:
6、libdts
libdts-0.0.2.tar.gz
[url]http://download.videolan.org/pub/videolan/libdca/0.0.2/libdca-0.0.2.tar.gz [/url]
安装方法:
7、a52
a52dec-0.7.4.tar.gz
http://liba52.sourceforge.net/downloads.html
安装方法:
8、faad2
faad2-2.6.1.tar.gz
http://www.audiocoding.com/downloads.html
安装方法
9、faac
faac-1.26.tar.gz
http://linux.softpedia.com/progDownload/FAAC-Download-554.html
安装方法:
10、amr-nb
amrnb-6.1.0.4.tar.bz2
http://ftp.penguin.cz/pub/users/utx/amr/amrnb-6.1.0.4.tar.bz2
安装方法:
这一步要连接网络
11、amr-wb
amrwb-7.0.0.1.tar.bz2
http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.1.tar.bz2
安装方法:
这一步要连接网络
12、lib52
a52dec-0.7.4.tar.gz
http://liba52.sourceforge.net/downloads.html
如果前面的安装一切顺利的话,恭喜你,可以安装ffmpeg了
/usr/include/string.h:369:28: error: previous declaration of ‘const char* strcasestr(const char*, const char*)’ with ‘C++’ linkage
mpeg4ip.h:126:64: error: conflicts with new declaration with ‘C’ linkage修改faac下的common/mp4v2/mpeg4ip.h 加上const,即将函数的参数类型和返回类型都改成与系统的一致。(不要去修改系统下的string.h),再将那个大红字C->C++就可以了。
c)./configure --prefix=/usr --enable-gpl --enable-shared --enable-libmp3lame --enable-libogg --enable-libvorbis --enable-libamr-nb --enable-libamr-wb --enable-libxvid --enable-libx264 --enable-liba52 --enable-liba52bin --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-pp --enable-pthreads --disable-ffserver --disable-ffplay
在ffmpeg执行这句时,如有报错,则按照报错信息修改,增删即可。
最新:改为./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 --disable-ffserver
3.opt/opencv/opencv-2.4.9/modules/highgui/src/cap_ffmpeg_impl.hpp: In member function ‘void CvVideoWriter_FFMPEG::close()’:
/opt/opencv/opencv-2.4.9/modules/highgui/src/cap_ffmpeg_impl.hpp:1445:29: error: ‘avformat_free_context’ was not declared in this scope
make[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/cap_ffmpeg.cpp.o] Error 1
make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error
opencv2.2.0的版本,所以ffmpeg要0.8版本以下
4.modules/highgui/CMakeFiles/opencv_highgui.dir/all这个问题,
在cmake-gui时取消掉INSTALL-OPENXER和WITH-OPENXER,再重新编译就好了。(参考http://blog.sina.com.cn/s/blog_92942dba0101d1wj.html)
5.出现类似undefined reference to `cvCreateCameraCapture_V4L(int)'错误.的语句,解决:(参考:http://blog.csdn.net/dayeshisir/article/details/6625400)
在下载的源代码里面找到OpenCV-2.2.0/modules/highgui/src/cap_v4l.cpp,
171 | 171 | if (capture) |
---|---|---|
172 | 172 | return capture; |
173 | 173 | #endif |
174 | //把本行后面的删掉,就变成本行下面的一行#if defined (HAVE_CAMV4L) |
|
174 | #if defined (HAVE_CAMV4L) | |
175 | 175 | capture = cvCreateCameraCapture_V4L (index); |
176 | 176 | if (capture) |
177 | 177 | return capture; |
6./usr/local/include/libavutil/common.h:175:47: error: ‘UINT64_C’ was not declared in this scope问题:
解决:
在头文件中加入:
#ifndef UINT64_C
#define UINT64_C(value)__CONCAT(value,ULL)
#endif
7.libhighgui.so.2.0.0: undefined reference to `cvCreateCameraCapture_V4L(int)'
我这边试的版本是2.0.0的opencv,所以是这么改的OpenCV-2.0.0/src/highgui/cvcap.cpp:(红色部分)
case CV_CAP_VFW:
#ifdef HAVE_VFW
capture = cvCreateCameraCapture_VFW (index);
if (capture)
return capture;
#endif
/*#if defined (HAVE_CAMV4L) || defined (HAVE_CAMV4L2)*/修改为
#if defined HAVE_LIBV4L || (defined (HAVE_CAMV4L) && defined (HAVE_CAMV4L2))
capture = cvCreateCameraCapture_V4L (index);
if (capture)
return capture;
然后修改: OpenCV-2.0.0/src/highgui/OpenCV-2.0.0/src/highgui(205行):(红色部分)(可参考:https://code.ros.org/trac/opencv/changeset/5099)
/*#if !defined WIN32 && defined HAVE_CAMV4L && defined HAVE_CAMV4L2*/修改为
#if !defined WIN32 && defined HAVE_LIBV4L
8.执行
./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg时,出现了问题:./facedetect: error while loading shared libraries: libcxcore.so.2.0: cannot open shared object file: No such file or directory
总结:以上为我安装配置opencv过程中遇到的部分问题,有些问题当时改了没来得及记下来,承认说,在配置过程中遇到了很多问题,版本不匹配,ffmpeg没安装成功等,没一次错误,都会学到很多东西。