计算机视觉是一门涉及图像处理、机器学习和人工智能的学科,旨在让计算机理解并解释数字图像或视频中的内容。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 是与视频处理支持一起编译的。这通常涉及到以下几个关键的第三方库:
sudo apt-get update
sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libavutil-dev
sudo apt-get install libswscale-dev libavresample-dev
安装 libv4l:
sudo apt-get install libv4l-dev
sudo apt-get install libx264-dev
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
,这个应该是视频的质量有点问题,与代码关系不大。
虽然可以通过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时,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编译安装之前安装,所以放在一起。
注意事项
在Ubuntu系统上使用C++和OpenCV来读取视频文件是一个相对直接的过程。以下是一个基本示例,演示如何使用OpenCV读取视频文件并逐帧处理:
#include
#include
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;
}
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`
./read_video
这个程序将逐帧读取指定的视频文件,并在窗口中显示每一帧。按下键盘上的 ‘q’ 键将关闭窗口并结束程序。请注意,您需要在有图形界面的环境中运行此程序,因为它依赖于创建窗口来显示视频帧。
本篇文章详细介绍了在Ubuntu环境下如何从源代码编译安装OpenCV,同时解决了Python OpenCV接口中imshow函数报错和C++代码读取视频不成功的问题,并解释了为什么选择直接从GitHub下载并编译安装OpenCV的原因,即可以获得更高的版本和更多的定制选项。
文章分为几个部分,包括准备工作、编译与安装OpenCV以及解决Python imshow报错和C++读取视频问题。在每个部分中,我们都提供了详细的步骤和说明,以帮助读者顺利完成操作。