opencv编程

opencv编程

引言:
·
​ 本实验旨在介绍使用OpenCV进行图像处理和视频处理的基本操作。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,提供了丰富的图像和视频处理功能,既可以进行图像的读取、显示和保存,也可以对图像进行各种处理操作,如滤波、边缘检测、图像分割等。同时,OpenCV还支持视频的读取、播放和保存,可以实时处理摄像头捕获的视频数据。
·
在本实验中,我们将使用OpenCV库来展示图片并获取摄像头的视频数据。
·
通过本实验的学习,将了解到如何使用OpenCV库进行图像和视频处理的基本操作。这些技术在计算机视觉、图像处理、机器学习等领域具有广泛的应用,对于理解和掌握这些领域的基础知识具有重要意义。现在,让我们开始实验,探索OpenCV的魅力吧!
·
希望你在本次学习过后,能够有一定的收获!!!
·
推荐歌曲—只是太爱你-歌手:丁芙妮
·
​ 冲啊!!!! ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶

文章目录

  • opencv编程
    • 一、Opencv介绍
    • 二、三个小实验
      • 1. 展示opencv图片
      • 2. 展示摄像头视频
      • 3. 录制摄像头视频
      • 报错分析
    • 三、命令解析
    • 四、问题解答
      • 问题 1
      • 问题 2
      • 问题 3
    • 五、总结

一、Opencv介绍

OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,旨在提供广泛的图像处理和计算机视觉功能。它由一系列的函数和算法组成,可用于处理图像和视频数据,以及进行目标检测、特征提取、图像分割、摄像头标定等任务。

OpenCV最初由Intel于1999年开发,并于2000年首次发布。自那时以来,它已经成为计算机视觉领域最受欢迎和广泛使用的库之一。OpenCV提供了C++、Python和Java等多种编程语言的接口,使开发者能够在各种平台上使用该库进行图像处理和计算机视觉应用的开发。

OpenCV的主要特点包括:

  1. 广泛的功能:OpenCV提供了大量的函数和算法,涵盖了图像处理和计算机视觉的各个方面。它支持图像的读取、保存和显示,以及各种图像处理操作,如滤波、边缘检测、变换等。此外,OpenCV还提供了强大的机器学习功能和计算机视觉算法,如目标检测、人脸识别、人体姿态估计等。
  2. 跨平台支持:OpenCV可在多个操作系统上运行,包括Windows、Linux、macOS和Android等。这使得开发者能够在不同的平台上开发和部署他们的应用程序,并且无需进行太多的修改。
  3. 高性能和优化:OpenCV使用优化的算法和数据结构,以提供高性能的图像处理和计算机视觉功能。它利用硬件加速和并行计算等技术,以提高算法的执行效率。
  4. 开放源代码:OpenCV是一个开源库,其源代码可在GitHub上公开获取。这使得开发者能够自由地查看和修改库的实现细节,并为其贡献代码和改进。
  5. 大型社区支持:OpenCV拥有一个庞大的用户社区,其中包括开发者、研究者和爱好者。这个社区提供了文档、教程、示例代码和论坛等资源,以帮助开发者解决问题和学习使用OpenCV。

OpenCV教程:超详细的OpenCV入门教程,值得收藏

二、三个小实验

1. 展示opencv图片

gedit test3.cpp  // 编辑代码

test3.cpp

#include <opencv2/opencv.hpp>
using namespace cv;int main()
{Mat img;img = imread("./opencv.jpg");imshow("img",img);waitKey(0);return 0;
}

编译与运行

 g++  test3.cpp  -o  test3  `pkg-config --cflags --libs opencv` # 编译./test3 # 运行

在这里插入图片描述

2. 展示摄像头视频

gedit test1.cpp  // 编辑代码

test1.cpp

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;int main()
{VideoCapture capture(0);while (1){Mat frame;capture >> frame;imshow("读取视频帧", frame);waitKey(30);}system("pause");return 0;
}

编译与运行

 g++  test1.cpp  -o  test1  `pkg-config --cflags --libs opencv` # 编译./test3 # 运行

在这里插入图片描述

3. 录制摄像头视频

gedit test2.cpp  // 编辑代码

test2.cpp

/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;int main()
{//打开电脑摄像头VideoCapture cap(0);if (!cap.isOpened()){cout << "error" << endl;waitKey(0);return 0;}//获得cap的分辨率int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));Size videoSize(w, h);VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);Mat frame;int key;//记录键盘按键char startOrStop = 1;//0  开始录制视频; 1 结束录制视频char flag = 0;//正在录制标志 0-不在录制; 1-正在录制while (1){cap >> frame;key = waitKey(100);if (key == 32)//按下空格开始录制、暂停录制   可以来回切换{startOrStop = 1 - startOrStop;if (startOrStop == 0){flag = 1;}}if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘{break;}if (startOrStop == 0 && flag==1){writer << frame;cout << "recording" << endl;}else if (startOrStop == 1){flag = 0;cout << "end recording" << endl;}imshow("picture", frame);}cap.release();writer.release();destroyAllWindows();
}

编译与运行

 g++  test2.cpp  -o  test2  `pkg-config --cflags --libs opencv` # 编译./test2 # 运行
  • 报错分析

  • 在这里插入图片描述

  • 没有打开摄像头

  • 在这里插入图片描述

  • 录制结果

  • 在这里插入图片描述

三、命令解析

命令 — g++ test1.cpp -o test1 pkg-config --cflags --libs opencv

这条编译命令是用于编译名为 test1.cpp 的源代码文件,并生成可执行文件 test1。并且使用了 pkg-config 工具来获取 OpenCV 的头文件路径和库文件路径,并将其传递给编译器。

分析命令各个部分:

  1. gcc: 这是 GNU Compiler Collection 的命令,用于调用 GNU 编译器进行源代码的编译。
  2. test1.cpp: 这是要编译的源代码文件的名称,后缀 .cpp 表示它是一个 C++ 的源代码文件。
  3. -o test1: 这是编译器选项,用于指定生成的可执行文件的名称。在这个例子中,生成的可执行文件将被命名为 test1
  4. pkg-config --cflags --libs opencv: 这是一个命令替换(command substitution),用于将 pkg-config 的输出结果插入到编译命令中。
    • pkg-config 是一个常用的工具,用于获取已安装的软件包的编译参数。在这里,我们使用 pkg-config 来获取 OpenCV 的相关编译参数。
    • --cflags 选项用于获取 OpenCV 的编译器标志(例如,包含头文件的路径)。
    • --libs 选项用于获取 OpenCV 的链接器标志(例如,链接库文件的路径)。
    • opencv 是要查询的软件包名称,pkg-config 将根据这个名称来获取 OpenCV 的相关编译参数。

通过将 pkg-config 的输出结果用反引号包围起来,并在编译命令中使用这个命令替换,我们可以将 OpenCV 的头文件路径和库文件路径传递给编译器,以便正确编译和链接程序。

四、问题解答

问题 1

如果要求打开你硬盘上一个视频文件来播放,请问示例 test1.c 第7行代码如何修改?

**解答:**修改为

 VideoCapture capture("videoPath");

只需将0 换为对应的视频路径即可

问题 2

在示例代码 test1.c 第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?

解答:

在示例代码中,Mat 是 OpenCV 中用于表示图像和矩阵的数据结构。它是 OpenCV 库中的一个类,用于存储和操作图像数据。

Mat 类提供了许多方法和操作符,用于访问和修改图像的像素值,执行图像处理操作,以及进行矩阵运算等。在示例代码中,Mat frame; 声明了一个 Mat 对象,用于存储从视频中读取的每一帧图像数据。

关于 waitKey 函数,它是一个用于等待键盘按键的函数。在这个示例中,waitKey(30) 表示程序将等待30毫秒。这个延时是为了控制视频的播放速度,如果没有延时,视频将以最快的速度播放。

如果删除了 waitKey 行,程序将变得非常快速,并几乎立即读取和显示所有的视频帧。这意味着视频将会以非常快的速度播放,并且你可能无法看到每一帧的内容。因此,为了能够以适当的速度播放和显示视频帧,建议保留 waitKey 行,并根据需要调整延时的时间。

问题 3

示例代码 test1.c 代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?

解答:

要改进示例代码以便能够通过鼠标关闭图像显示窗口,可以通过添加一些逻辑来监听按键事件并在按下特定按键时退出循环。在 OpenCV 中,可以使用 waitKey 函数结合 break 语句来实现这个逻辑。

下面是修改后的代码示例,可以通过按下 ESC 键来关闭图像显示窗口并退出循环:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{// 指定视频文件路径string videoPath = "path/to/your/video/file.mp4";// 创建 VideoCapture 对象并打开视频文件VideoCapture capture(videoPath);// 检查视频是否成功打开if (!capture.isOpened()){cout << "无法打开视频文件" << endl;return -1;}// 创建窗口namedWindow("读取视频帧", WINDOW_NORMAL);// 循环读取视频帧while (true){Mat frame;capture >> frame;// 检查是否到达视频末尾if (frame.empty())break;// 显示视频帧imshow("读取视频帧", frame);// 等待按键int key = waitKey(30);// 按下 ESC 键退出循环if (key == 27)break;}// 关闭视频文件capture.release();// 销毁窗口destroyAllWindows();return 0;
}

在这个修改后的代码中,我们创建了一个窗口并命名为"读取视频帧"(可以根据需要修改窗口名称)。然后,在每次循环中,我们使用 waitKey 函数来等待按键事件,返回按下键的 ASCII 码。如果按下的是 ESC 键(ASCII 码为 27),我们使用 break 语句退出循环,从而关闭图像显示窗口并结束程序。

这样修改后,就可以通过按下 ESC 键来关闭图像显示窗口并正常退出程序,而无需使用 Ctrl+C 强制中断。

五、总结

本实验介绍了使用OpenCV进行图像和视频处理的基础操作。OpenCV是一个功能丰富的开源计算机视觉库,用于处理图像和视频数据,提供了从基础的图像读取、显示和保存到高级的图像处理操作,如滤波、边缘检测和图像分割等。此外,OpenCV也支持视频的读取、播放和保存,能够实时处理视频流。
·
通过三个小实验,我们学习了如何利用OpenCV来显示图片、捕捉并展示摄像头视频流以及录制视频。这些实验不仅帮助理解了代码的具体实现,还展示了OpenCV在实际应用中的强大功能。
·
总结而言,OpenCV是计算机视觉、图像处理和相关字段学习者的宝贵工具。通过实验性的学习和问题解决,可以更扎实地掌握这一工具库的应用,为进一步的深入学习打下良好的基础。

最后感谢大佬友情链接:

  • OpenCV教程:超详细的OpenCV入门教程,值得收藏 - 知乎 (zhihu.com)
  • Ubuntu18.04下OpenCV3.4.11的安装及使用示例-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/525926.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

植物病虫害:YOLO玉米病虫害识别数据集

玉米病虫害识别数据集&#xff1a;玉米枯萎病&#xff0c;玉米灰斑病&#xff0c;玉米锈病叶&#xff0c;粘虫幼虫&#xff0c;玉米条斑病&#xff0c;黄二化螟&#xff0c;黄二化螟幼虫7类&#xff0c;yolo标注完整&#xff0c;3900多张图像&#xff0c;全部原始数据&#xff…

“大步迈进:探索未来的UI自动化测试框架“

源于一次测试 最近做了一些业务开发&#xff0c;功能本身还是挺简单的&#xff0c;由于测试资源不足&#xff0c;应测试要求&#xff0c;我就顺道接下了一些测试的活。测试任务也不复杂&#xff0c;无非是一些字段CURD来回变了法子的测试&#xff0c;各个字段分开&#xff0c;…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的…

ROS基础学习—话题、服务、动作编程

ROS基础学习—话题、服务、动作编程 引言&#xff1a; ​ 通过本实验&#xff0c;我们将进行ROS基础学习内容主要包括&#xff1a;话题、服务、动作编程。掌握ROS的这些基础概念&#xff0c;进一步深入ROS的学习。 希望你在本次学习过后&#xff0c;能够有一定的收获&#xff0…

优先权的不同特征性质

目录 1.强占式&#xff0c;静态优先权&#xff0c;动态优先权 2.先来服务算法&#xff0c;高响应比优先算法&#xff0c;时间片轮转算法&#xff0c;非抢占式短任务优先 1.强占式&#xff0c;静态优先权&#xff0c;动态优先权 2.先来服务算法&#xff0c;高响应比优先算法&am…

Vue.js+SpringBoot开发海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

redis小知识:Linux系统中使用Docker安装Redis的详细步骤和命令

安装Docker&#xff1a; 首先确保在你的Linux系统上安装了Docker。你可以按照官方文档提供的步骤进行安装。 拉取Redis镜像&#xff1a; 使用以下命令从Docker Hub上拉取Redis官方镜像&#xff1a; docker pull redis创建并运行Redis容器&#xff1a; 使用以下命令创建并启动…

揭秘接口测试:完整流程指南!

在讲接口测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更好的…

ChatGPT 串接到 Discord - 团队协作好助理

ChatGPT 串接到 Discord - 团队协作好助理 ChatGPT 是由 OpenAI 开发的一个强大的语言模型&#xff0c;本篇文章教你如何串接 Discord Bot &#xff0c;协助团队在工作上更加高效并促进沟通与协作。使 ChatGPT 发挥出最大的功效&#xff0c;进一步提升工作效率和团队协作能力。…

Mamba-minimal Mamba的最小限度实现 (二)

文章目录 链接导入所需包class ModelArgsclass Mambadef __ init __def forward class ResidualBlockclass RNSNorm文本生成demo manba的简单最小限度实现&#xff0c;和原始论文实现 state-spaces/mamba (github.com)相比&#xff0c;为了可读性对参数没有很好的初始化&#…

菜鸟笔记-14Python绘图颜色使用

Python中绘图主要依赖于各种库&#xff0c;其中matplotlib是最常用且功能强大的一个。在matplotlib中&#xff0c;你可以使用各种颜色来表示不同的数据点、线条或填充区域。下面我将详细介绍如何在Python中使用matplotlib来设置绘图颜色&#xff0c;并给出具体的例子。 14.1颜…

面向对象高级编程下

面向对象高级编程下 面向对象高级编程下一. 转换函数二. non-explict-one-argument ctor三. explicit-one-argument ctor四. pointer-like classes1. 智能指针2. 迭代器 五. function-like classes六. namespace七. 模板1.类模板2.函数模板3.成员模板 八.模板特化和偏特化1. 模…