Ubuntu下OpenCV编译安装全攻略:解决Python imshow与C++读取视频问题

文章目录


一、引言

计算机视觉是一门涉及图像处理、机器学习和人工智能的学科,旨在让计算机理解并解释数字图像或视频中的内容。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了大量的算法来处理图像和视频,包括但不限于物体识别、人脸识别、运动追踪等。由于其丰富的功能和高效的性能,OpenCV在科研和工业界都得到了广泛的应用。

然而,在Ubuntu环境下安装和使用OpenCV的过程中,用户可能会遇到一些问题。例如,Python接口中的imshow函数在处理视频时可能会抛出错误,而C++代码在尝试读取视频文件时也可能无法正常工作。这些问题可能源于多种原因,如环境配置不当、代码错误或者OpenCV版本兼容性问题等。

本文将深入探讨这些常见问题,并提供详细的解决方案。我们将首先介绍如何在Ubuntu系统下编译安装OpenCV,然后分别讨论Python imshow报错和C++读取视频不成功的问题及其解决方法。通过阅读本文,读者不仅可以了解如何避免这些问题,还能掌握如何诊断和解决类似问题的方法。


二、准备工作,安装第三方库

在开始编译安装OpenCV之前,我们需要确保系统中已经安装了必要的依赖项。像是gcc, cmake等都是非常普遍的,这里不再详述。

在 Ubuntu 上使用 C++ 和 OpenCV 读取本地视频文件,需要确保 OpenCV 是与视频处理支持一起编译的。这通常涉及到以下几个关键的第三方库:

  1. FFmpeg
    FFmpeg 是一个非常强大的多媒体库,支持大多数视频和音频格式的编解码。OpenCV 通常使用 FFmpeg 来处理视频文件。
    安装 FFmpeg:
bash 复制代码
sudo apt-get update
sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libavutil-dev
sudo apt-get install libswscale-dev libavresample-dev
  1. libv4l (Video4Linux)
    这是 Linux 上处理视频捕获的库,尤其是当涉及到摄像头捕获时。

安装 libv4l:

bash 复制代码
sudo apt-get install libv4l-dev
  1. x264
    这是一个用于编码视频流为 H.264/MPEG-4 AVC 格式的库。
    安装 x264:
bash 复制代码
sudo apt-get install libx264-dev
  1. 为了解决imshow报错
    在运行python opencv对图像进行imshow的时候,可能会报错

    cv2.error: OpenCV(4.5.5) /io/opencv/modules/highgui/src/window.cpp:1268: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

根据报错信息,我们运行下面的命令:

bash 复制代码
sudo apt-get install libgtk2.0-dev pkg-config

然后重新安装opencv-python,一般可以解决

bash 复制代码
pip install opencv-python==4.5.5.64

注意,一般不要安装特别新的版本的。

这个时候如果还是报相同的错误,可能是哪的缓存有问题,比如我的就是在$home/.vscode里面有相关的缓存,找到并删除即可。

cv2.imshow运行的时候,还可能报下面的错误

复制代码
(Video Frame:37550): Gtk-WARNING **: 10:00:34.732: 无法在模块路径中找到主题引擎:"pixmap",

警告 (Video Frame:37550): Gtk-WARNING **: 10:00:34.732: 无法在模块路径中找到主题引擎:"pixmap" 是一个 GTK+ 相关的警告,通常发生在 GTK+ 应用程序无法找到指定的主题引擎时。这个问题一般出现在 Linux 系统上,尤其是在使用基于 GTK+ 的图形界面应用程序时。解决这个问题通常涉及到安装缺失的 GTK+ 主题引擎或配置 GTK+ 模块路径。

这个问题通常可以通过安装 gtk2-engines-pixbuf 解决。在 Ubuntu 或 Debian 系统上,可以使用以下命令安装它:

bash 复制代码
sudo apt-get install gtk2-engines-pixbuf

另外,在读视频的时候还遇到过一个错误,严格来讲算是警告[h264 @ 0x55edea5363c0] illegal short term buffer state detected,这个应该是视频的质量有点问题,与代码关系不大。


三、从github上下载opencv

虽然可以通过Ubuntu的包管理器apt-get来安装OpenCV,例如使用命令sudo apt-get install libopencv-dev,但这通常会安装一个较低版本的OpenCV。通过这种方式安装的OpenCV版本为3.2,一是版本有点低,二是没有其它选项可以配置。

如果想使用更高版本的OpenCV,或者想自定义编译参数以满足特定需求,可以选择从OpenCV的官网官方GitHub仓库直接下载源代码。这样做的好处是可以选择你想要的特定版本,并且可以自由配置编译选项。

在众多可用的OpenCV版本中,3.4版本经过实践证明是一个稳定的选择。因此,在本教程中,我们将指导你如何从GitHub上下载并编译安装OpenCV 3.4版本。

我们以从官方GitHub上下载安装为例进行说明:

bash 复制代码
git clone https://github.com/opencv/opencv.git
git checkout -b 3.4 origin/3.4

说明,如果从官网上下载可选的子版本比较多,github上下载的代码通过git branch -r查看远程分支没有太多,比如2.4, 3.4, 4.x等,我们选择3.4


四、 编译与安装OpenCV

在从源代码编译OpenCV时,cmake 命令可以设置多种参数来定制编译过程。这些参数控制了各种功能的启用/禁用、依赖库的链接、编译选项等。以下是一些常用的cmake参数及其作用:

参数 描述
CMAKE_BUILD_TYPE 设置构建类型(Release 或 Debug)。Release 用于优化构建,Debug 用于调试。
CMAKE_INSTALL_PREFIX 设置安装路径。OpenCV将被安装到这个目录下。
WITH_TBB 启用Intel线程构建块(TBB)支持,以改善多线程性能。
WITH_CUDA 启用NVIDIA CUDA支持(用于加速OpenCV的某些操作)。仅适用于安装了NVIDIA显卡和CUDA工具包的系统。
WITH_VTK 启用对VTK(可视化工具包)的支持。对于某些视觉项目特别有用。
BUILD_SHARED_LIBS 指定是构建静态库还是动态库。静态库将OpenCV编译到您的应用程序中,动态库则在运行时链接。
OPENCV_EXTRA_MODULES_PATH 设置OpenCV额外模块(如contrib库)的路径。仅在编译OpenCV的额外模块时使用。
BUILD_opencv_python2/3 启用对Python 2或Python 3的支持。
WITH_QT 启用Qt支持,Qt是一个更丰富的GUI框架。
WITH_OPENGL 启用OpenGL支持。对于某些图形密集型应用很有用。
WITH_FFMPEG 启用FFmpeg支持,用于处理音视频流。
BUILD_EXAMPLES 编译OpenCV附带的示例

在安装了必要的依赖库之后,当从源代码编译 OpenCV 时,应确保在 cmake 配置命令中包括对这些库的支持。我们写一个sh文件,将上面的安装依赖和opencv的编译安装放在一起,这样把这个sh文件直接复制到下载下来的opencv源码文件夹中即可

bash 复制代码
#!/bin/bash
sudo apt-get install libgtk2.0-dev pkg-config
sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libavutil-dev
sudo apt-get install libswscale-dev libavresample-dev
sudo apt-get install libv4l-dev
sudo apt-get install libx264-dev
sudo apt-get install gtk2-engines-pixbuf

rm -rf build
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_C_EXAMPLES=ON \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D OPENCV_GENERATE_PKGCONFIG=ON \
      -D BUILD_EXAMPLES=ON \
      -D WITH_GTK=ON \
      -D WITH_FFMPEG=ON \
      -D WITH_V4L=ON \
      -D WITH_LIBV4L=ON \
      -D WITH_X264=ON ..
make -j12
sudo make install

这样做一是为了方便,二是这些依赖一般必须要在opencv编译安装之前安装,所以放在一起。

注意事项

  • 确保的系统上安装了所有必要的依赖库,这对于 OpenCV 的视频处理功能至关重要。
    OpenCV 的 VideoCapture 类可以使用 FFmpeg 来读取本地视频文件。
  • 根据具体需求,可能还需要安装其他库,比如 libgstreamer 用于 GStreamer 支持或 libgtk 用于 GUI 功能。
  • FFmpeg 特别重要,因为它提供了对多种视频格式的支持。如果您的 OpenCV 构建缺少 FFmpeg 支持,可能无法读取某些视频格式。

五、测试案例

在Ubuntu系统上使用C++和OpenCV来读取视频文件是一个相对直接的过程。以下是一个基本示例,演示如何使用OpenCV读取视频文件并逐帧处理:

示例代码:读取视频文件

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 创建VideoCapture对象并打开视频文件
    cv::VideoCapture cap("path_to_your_video.mp4"); // 替换为您的视频文件路径

    // 检查视频是否成功打开
    if (!cap.isOpened()) {
        std::cerr << "Error: Unable to open video file" << std::endl;
        return -1;
    }

    cv::Mat frame;
    while (true) {
        // 读取视频的下一帧
        cap >> frame;

        // 检查帧是否为空(例如,在视频末尾)
        if (frame.empty()) {
            break;
        }

        // 在此处处理帧(例如:显示或修改)
        cv::imshow("Video Frame", frame);

        // 等待1毫秒,并检查是否按下了'q'键,以退出循环
        if (cv::waitKey(1) == 'q') {
            break;
        }
    }

    // 释放VideoCapture对象
    cap.release();
    cv::destroyAllWindows();

    return 0;
}

编译和运行

  1. 保存代码:将上述代码保存为一个文件,例如 read_video.cpp。
  2. 编译代码:使用g++编译器和OpenCV标志编译代码。在终端中,您可以使用类似于以下的命令:
bash 复制代码
g++ read_video.cpp -o read_video `pkg-config --cflags --libs opencv`

这个命令会生成一个名为 read_video 的可执行文件。请确保替换最后的opencv 为系统中安装的OpenCV版本的正确标志(如果使用的是OpenCV 3,则需要使用 opencv , 如果使用的是OpenCV 3,需要使用opencv4)。

如果安装的是opencv4用下面的命令:

bash 复制代码
g++ read_video.cpp -o read_video `pkg-config --cflags --libs opencv4`
  1. 运行程序:运行程序,并确保提供有效的视频文件路径:
bash 复制代码
./read_video

这个程序将逐帧读取指定的视频文件,并在窗口中显示每一帧。按下键盘上的 'q' 键将关闭窗口并结束程序。请注意,您需要在有图形界面的环境中运行此程序,因为它依赖于创建窗口来显示视频帧。


六、总结

本篇文章详细介绍了在Ubuntu环境下如何从源代码编译安装OpenCV,同时解决了Python OpenCV接口中imshow函数报错和C++代码读取视频不成功的问题,并解释了为什么选择直接从GitHub下载并编译安装OpenCV的原因,即可以获得更高的版本和更多的定制选项。

文章分为几个部分,包括准备工作、编译与安装OpenCV以及解决Python imshow报错和C++读取视频问题。在每个部分中,我们都提供了详细的步骤和说明,以帮助读者顺利完成操作。

相关推荐
HEY_FLYINGPIG1 分钟前
Flask应用中处理异步事件(后台线程+事件循环)的方法(2)
后端·python·flask
知舟不叙1 小时前
基于OpenCV实现实时颜色检测
人工智能·opencv·计算机视觉·颜色检测
wb1895 小时前
流编辑器sed
运维·笔记·ubuntu·云计算
鹏码纵横6 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
仙人掌_lz6 小时前
Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型
人工智能·python·ai·lora·llm·微调·qwen3
猎人everest7 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
猎人everest7 小时前
Django的HelloWorld程序
开发语言·python·django
chusheng18407 小时前
2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)
windows·python·python3下载·python 安装教程·python3 安装教程
别勉.7 小时前
Python Day50
开发语言·python
whoarethenext7 小时前
使用 C/C++的OpenCV 裁剪 MP4 视频
c语言·c++·opencv