在Ubuntu 14.10上安装OpenCV

4

我正在按照说明在Ubuntu 14.10中安装OpenCV。我已经安装了所有所需的依赖项,但是当我尝试运行make时,出现以下错误:

/home/ilia/opencv-2.4.8/modules/highgui/src/ffmpeg_codecs.hpp:114:7: error: ‘CODEC_ID_H261’ was not declared in this scope
 { CODEC_ID_H261, MKTAG('H', '2', '6', '1') }

对于所有编解码器,我认为都适用。还有这些错误:

    In file included from /home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg.cpp:45:0:
/home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg_impl.hpp: In member function ‘double CvCapture_FFMPEG::getProperty(int)’:
/home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg_impl.hpp:773:33: error: ‘AVStream’ has no member named ‘r_frame_rate’
         return av_q2d(video_st->r_frame_rate);
                                 ^
/home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg_impl.hpp: In member function ‘double CvCapture_FFMPEG::get_fps()’:
/home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg_impl.hpp:820:49: error: ‘AVStream’ has no member named ‘r_frame_rate’
     double fps = r2d(ic->streams[video_stream]->r_frame_rate);
                                                 ^
In file included from /home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg.cpp:45:0:
/home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg_impl.hpp: In function ‘int icv_av_write_frame_FFMPEG(AVFormatContext*, AVStream*, uint8_t*, uint32_t, AVFrame*)’:
/home/ilia/opencv-2.4.8/modules/highgui/src/cap_ffmpeg_impl.hpp:1236:72: error: ‘avcodec_encode_video’ was not declared in this scope
         out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
                                                                        ^    

看起来找不到一些头文件,但我已经安装了所有必要的开发包,包括libswscale-dev、libavdevice-dev、libavfilter-dev、libavformat-dev和libavcodec-dev。为解决这些问题,我该怎么做?


在Ubuntu 14.10中,libav使用API版本11。 OpenCV仍然使用Ubuntu 14.04 LTS中包含的API版本9。 我认为他们必须为此提供一个补丁。 - madduci
3个回答

17

从Ubuntu仓库安装OpenCV通常是一个不错的选择,但有时您需要自己从源代码构建OpenCV。

例如,如果您需要OpenCV的非免费功能,或者想为该项目做出贡献(您应该使用最新版本创建拉取请求),或者想要更改一些内容(是的,OpenCV也可能存在错误)。

解决方法之一是构建ffmpeg(这相当简单)-我真的不明白为什么Debian / Ubuntu喜欢没有替代方案的libav。

要安装ffmpeg,您应该从官方网站下载其源代码或克隆GIT存储库(git://source.ffmpeg.org/ffmpeg.git),然后进入源目录并运行:

./configure --enable-shared --disable-static
make
sudo make install

您还可以向configure添加其他参数。您也可以构建静态库,但是不能使用静态ffmpeg库构建OpenCV(现在我不知道为什么)。

完成此操作后,您可以从OpenCV网站下载OpenCV源代码或克隆GitHub存储库(OpenCV repository),创建构建文件夹并从中运行以下内容:

cmake PATH_TO_SOURCES -DCMAKE_BUILD_TYPE=Release
make
sudo make install

当然,PATH_TO_SOURCES必须是实际的OpenCV源代码路径。

完成这些步骤后,您的系统上就会有最新的可用OpenCV版本。


从源代码构建FFmpeg而不是使用Libav对我很有效。 - afenster
这正是我在答案中建议的。 - avtomaton
我收到了这条消息:禁用yasm可以吗?hyasm/nasm未找到或太旧。使用--disable-yasm进行残缺构建。@avtomaton - MAS
@avtomaton 更新:我尝试了,但是我得到了相同的错误。我正在使用Mac OS。 - MAS
1
@MAS 可能存在不兼容的opencv和ffmpeg版本。在Mac上,我更喜欢使用brewport来安装ffmpeg,而不是从源代码编译 - 应该可以与最新的opencv(3.1)一起使用。如果您喜欢从源代码编译,请仔细检查ffmpeg和opencv的版本及其兼容性。原始问题适用于Ubuntu 14.10,其中维护者出于某种原因从存储库中删除了ffmpeg。 - avtomaton

3

除非您有特殊原因,否则我建议安装已经在Ubuntu存储库中的OpenCV:sudo apt-get install libopencv-dev

对于视频编解码器,我建议尝试安装所有与ffmpeg和gstreamer相关的编解码器包。


1
谢谢。这比我想象的要容易得多。 - Ilia
3
好的,那并不是一个解决方案。特别是当有人需要Qt、CUDA、OpenNI时。 - madduci

3

您可以尝试在没有ffmpeg的情况下进行构建:

cmake -DCMAKE_BUILD_TYPE=RELEASE -DWITH_FFMPEG=OFF ..
make
sudo make install

没有ffmpeg,你可能会得到一个版本,无法读写视频 - 只有在您的项目中不使用它们时才可以。 - avtomaton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接