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++读取视频问题。在每个部分中,我们都提供了详细的步骤和说明,以帮助读者顺利完成操作。

相关推荐
蒙娜丽宁9 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev11 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子24 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python29 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯38 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
plmm烟酒僧42 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
千天夜1 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
测试界的酸菜鱼1 小时前
Python 大数据展示屏实例
大数据·开发语言·python
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨1 小时前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测