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

这篇具有很好参考价值的文章主要介绍了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:
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:

sudo apt-get install libv4l-dev
  1. x264
    这是一个用于编码视频流为 H.264/MPEG-4 AVC 格式的库。
    安装 x264:
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'

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

sudo apt-get install libgtk2.0-dev pkg-config

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

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 系统上,可以使用以下命令安装它:

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上下载安装为例进行说明:

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源码文件夹中即可

#!/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读取视频文件并逐帧处理:

示例代码:读取视频文件

#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标志编译代码。在终端中,您可以使用类似于以下的命令:
g++ read_video.cpp -o read_video `pkg-config --cflags --libs opencv`

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

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

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

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


六、总结

本篇文章详细介绍了在Ubuntu环境下如何从源代码编译安装OpenCV,同时解决了Python OpenCV接口中imshow函数报错和C++代码读取视频不成功的问题,并解释了为什么选择直接从GitHub下载并编译安装OpenCV的原因,即可以获得更高的版本和更多的定制选项。
文章分为几个部分,包括准备工作、编译与安装OpenCV以及解决Python imshow报错和C++读取视频问题。在每个部分中,我们都提供了详细的步骤和说明,以帮助读者顺利完成操作。文章来源地址https://www.toymoban.com/news/detail-775153.html

到了这里,关于Ubuntu下OpenCV编译安装全攻略:解决Python imshow与C++读取视频问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MAC机器Unity接入iOS SDK安装cocoapods全攻略

    要在Unity3D里面接入iOS SDK,因此又在新mac上配置了一道环境。机器是Mac mini,芯片是M2,OS为Sonoma 14.2。 若Unity3D工程里面有EDM4U插件,且配置了Dependencies文件(文件内配置了iosPod),那么在导出XCode的工程时,会自动安装CocoaPods,但多半会失败。失败原因多是机器自带的ruby版本

    2024年04月29日
    浏览(35)
  • Python开发者必读:Pip使用全攻略与最佳实践

    在这篇文章中,我们将深入探讨Python的主要包管理工具——Pip。内容涵盖了Pip的基本概念、安装和配置、中国国内镜像源的使用、包管理、与虚拟环境的关系、高级用法、问题解决。 在现代的软件开发实践中,依赖管理成为了一项非常重要的任务。它确保了我们可以在任何地

    2024年02月16日
    浏览(42)
  • 由于找不到vcomp140.dll无法继续执行代码,解决方法全攻略

    如何解决找不到vcomp140.dll错误?在使用某些软件或者游戏的时候,你可能会遇到下面的错误提示:“由于找不到vcomp140.dll,无法继续执行代码”。这个错误提示通常表示你的电脑缺少一个或多个DLL文件,而这些文件是软件和游戏必须的组件之一。如果你不知道如何解决这个问

    2024年02月08日
    浏览(65)
  • ZooKeeper完美安装指南:在CentOS中从单节点到集群部署全攻略

      ZooKeeper是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供群组服务。其高效且稳定的特性使得它成为分布式环境中的不可或缺的组件。本文将深入探讨如何在CentOS 系统上安装和配置最新版本的ZooKeeper,涵盖从单节点到集群的全面部署。 系统版本:

    2024年02月06日
    浏览(41)
  • Python 字典取值全攻略:高效、简洁地获取字典值的多种技巧

    使用中括号([])操作符 要访问字典中的值,您可以使用中括号操作符([])来检索给定键的值。以下是一个示例代码: 在这个示例中,我们创建了一个名为 my_dict 的字典,并使用中括号操作符([])来获取 apple 键对应的值。 请注意,如果字典中不存在指定的键,则会引发

    2024年01月20日
    浏览(50)
  • 二:nextcloud27最全面优化与解决各种安全警告_nextcloud 优化全攻略

    不被信任的域名 vim /var/www/nextcloud/config/config.php 添加该域名即可 #受信任的域名 ‘trusted_domains’ = array ( 0 = ‘10.0.0.2’, 1 = ‘10.1.1.20’, 2 = ‘nc6.example.com’, 3 = ‘hnc6.example.com’, 4 = ‘nc4.example.com’, ), 您的网页服务器未正确设置以解析“/.well-known/**” 编辑nginx配置文件,修改

    2024年04月16日
    浏览(35)
  • 二:nextcloud27最全面优化与解决各种安全警告_nextcloud 优化全攻略(1)

    ps aux|grep php-fpm 使用kill命令 kill -USR2 33166 最大上传大小与内存限制 PHP-FPM 如果您想增加最大上传大小,您还必须修改 您的 php-fpm 配置并增加 upload_max_filesize 和 post_max_size 值。并且修改最大内存大小 memory_limit .您需要重新启动 php-fpm 和您的 HTTP 服务器以便应用这些更改。 参考

    2024年04月16日
    浏览(37)
  • 90天玩转Python—11—基础知识篇:Python自动化操作Excel:读写、增删改查、分组统计全攻略

    90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Python编程基础:标识符、保留字、注释、多行语句、p

    2024年04月11日
    浏览(43)
  • MongoDB 索引全攻略

    目录 一、索引介绍         1.1 单字段索引         1.2 复合索引         1.3 多键索引         1.4 主键索引         1.5 TTL 索引         1.6 地理空间索引         1.7 哈希索引         1.8 创建索引时注意事项         1.9 索引效果查看  二、索引实现原理         2.1 为

    2024年04月27日
    浏览(68)
  • HackTheGame游戏全攻略

    游戏链接 链接: 百度网盘 请输入提取码 提取码:bu1w HackTheGame游戏的玩法: 您将扮演一个黑客的角色,接受各种各样的任务,在不被发现的情况下,使用一些工具入侵他人的电脑,服务器并完成窃取资料,粉碎文件,植入病毒等操作.您有一共有两次机会,第三次被追踪到的话,您就会被捕

    2024年02月05日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包