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.mzph.cn/news/733143.shtml

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

相关文章

187基于matlab的弹道目标跟踪滤波方法

基于matlab的弹道目标跟踪滤波方法&#xff0c;扩展卡尔曼滤波&#xff08;extended Kalman filter, EKF&#xff09;、转换测量卡尔曼滤波&#xff08;conversion measurement Kalman filter, CMKF&#xff09;跟踪滤波&#xff0c;得到距离、方位角、俯仰角误差结果。程序已调…

人工智能|机器学习——DBSCAN聚类算法(密度聚类)

1.算法简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法&#xff0c;簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点&#xff0c;因此DBSCAN聚类的方式也可以用于异常点的检测。 2.算法原…

《汇编语言》- 读书笔记 - 第17章-实验17 编写包含多个功能子程序的中断例程

《汇编语言》- 读书笔记 - 第17章-实验17 编写包含多个功能子程序的中断例程 逻辑扇区根据逻辑扇区号算出物理编号中断例程&#xff1a;通过逻辑扇区号对软盘进行读写 代码安装 int 7ch 测试程序效果 实现通过逻辑扇区号对软盘进行读写 逻辑扇区 计算公式: 逻辑扇区号 (面号*8…

CSS基础知识

font-family: "Trebuchet MS", Verdana, sans-serif; 字体栈&#xff0c;浏览器会一个一个试过去看下哪个可以用 font-size16px; font-size1em; font-size100%;//相对于16px 字体大小&#xff0c;需要进行单位换算16px1em font-weightnormal;//400font-weight属性…

YoloV5改进策略:Block改进|自研Block,涨点超猛|代码详解|附结构图

涨点效果 参考模型 参考的Block,如下图: 我对Block做了修改,修改后的结构图如下: 代码详解 from timm.models.layers import DropPathfrom torch import Tensor def channel_shuffle(x: Tensor, groups:

用Java Socket手撸了一个HTTP服务器

作为一个 Java 后端&#xff0c;提供 HTTP 服务可以说是基本技能之一了&#xff0c;但是你真的了解 HTTP 协议么&#xff1f;你知道知道如何手撸一个 HTTP 服务器么&#xff1f;Tomcat 的底层是怎么支持 HTTP 服务的呢&#xff1f;大名鼎鼎的 Servlet 又是什么东西呢&#xff0…

可观测性是什么?新手入门指南!

如果您之前对可观测性重要性&#xff0c;益处&#xff0c;以及组成不甚了解&#xff0c;本文是一个合适的指南手册。 什么是可观测性&#xff1f; 可观测性被定义为根据系统产生的输出数据&#xff08;如日志&#xff0c;指标和链路追踪&#xff09;来衡量当前系统运行状态的…

代码理解 pseudo_labeled = outputs.max(1)[1]

import torchls torch.Tensor([[0.2,0.4],[0.3,0.2]]) print(ls.max(1))

STL之deque容器代码详解

1 基础概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作。 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低。 deque相对而言&#xff0c;对头部的插入删除速度回比vector快。 vector访问…

Unity Shader实现UI流光效果

效果&#xff1a; shader Shader "UI/Unlit/Flowlight" {Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) "white" {}_Color("Tint", Color) (1, 1, 1, 1)[MaterialToggle] PixelSnap("Pixel snap", float…

简洁的在线观影开源项目

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识。 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0c;今天介绍的开源项目简介如下&#xff1a; 仓库名&#xff1…

海外媒体发稿:7种媒体套餐推广策略解析-华煤舍

有效的媒体宣传策略对于产品或服务的推广至关重要。本文将介绍7种媒体套餐推广策略&#xff0c;帮助您惊艳市场&#xff0c;并取得成功。以下是每种策略的拆解描述&#xff1a; 1. 广告投放 广告投放是最常见的宣传手段之一。通过在各种媒体平台上购买广告&#xff0c;如电视、…

Web渗透测试流程

什么是渗透测试 渗透测试 (penetration test),是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析&#xff0c;这个分析是从一个攻击者可能存在的位置来进行的&#xff0c;并且从这个…

linux 查看打开使用了哪些端口

你可以使用 netstat 命令来查看Linux系统中正在使用的端口。例如&#xff0c;要查看所有正在使用的TCP和UDP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tulpn如果你只想查看所有正在使用的TCP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tpln 如果你只…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…

【Linux】编译器-gcc/g++使用

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 初见gcc和g3. 程序的翻译过程3.1 预处理3.1.1 宏替换 去注释 头文件展开3.1.2 条件编译 3.2 编译3.3 汇编3.4 链接 4. 链接4.1 动态链接4.2 静态链接 1. 前言 在之…

吴恩达机器学习-可选实验:特征缩放和学习率(多变量)

文章目录 目标工具概念问题陈述数据集多变量梯度下降学习率a9.9e-7a9e-7a1e-7 特征缩放实现 恭喜致谢 目标 在本实验中&#xff0c;你将: 利用在上一个实验中开发的多变量例程对具有多个特征的数据集运行梯度下降探讨学习率alpha对梯度下降的影响通过使用z-score归一化的特征…

域控操作十:安装包exe转msi软件下发

需要的文件 Advanced Installer 软件用来将exe转换成msi因为域控只能下发msi格式 一个exe安装包这里拿微信举例 一个没有密码的共享文件夹 1.exe转MSI 2&#xff0c;开始下发 服务器和用户刷新策略 #完成

某品零食交易平台设计与实现|基于springboot+ Mysql+Java的某品交易平台设计与实现(源码+数据库+文档+PPT)

目录 基于springboot MysqlJava的某品交易平台设计与实现 摘 要 系统详细设计 数据库设计 论文参考 源码获取 文末获取源码联系 基于springboot MysqlJava的某品交易平台设计与实现 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的…

html--彩虹爱心

文章目录 js内容cssreset.min.cssstyle.css html内容 js内容 const colors ["#e03776","#8f3e98","#4687bf","#3bab6f","#f9c25e","#f47274"]; const SVG_NS http://www.w3.org/2000/svg; const SVG_XLINK &q…