一问解读OpenCV的计算机视觉中视频处理

2023-11-13

微信公众号:小白图像与视觉

关于技术、关注yysilence00。有问题或建议,请公众号留言。

了解OpenCV的计算机视觉

OpenCV Python教程

在本OpenCV Python教程中,我们将介绍在Python中使用OpenCV进行计算机视觉的各个方面。长期以来,OpenCV一直是软件开发中至关重要的部分。

什么是计算机视觉?

为了简化答案,让我们考虑一个场景。
假设您和您的朋友去度假,您将一堆图片上传到了Facebook。但是现在要花些时间才能找到朋友的脸并在每张照片中标记它们。实际上,Facebook足够聪明,可以为您标记人物
那么,您如何看待自动标记功能?简而言之,它通过计算机视觉起作用。
计算机视觉是一个跨学科领域,涉及如何制作计算机以从数字图像或视频获得高层次的理解。

计算机如何读取图像?

在这里插入图片描述

我们可以发现这是纽约天际线的图像。但是,计算机可以自己找出所有这些吗?答案是不!计算机读取的任何图像的取值范围为0到255。
对于任何彩色图像,都有3个主要通道-红色,绿色和蓝色。它的工作原理非常简单。
为每种原色形成一个矩阵,然后,这些矩阵组合以提供每种R,G和B颜色的像素值。
矩阵的每个元素提供有关像素亮度强度的数据。
考虑下图:

如图所示,此处图像的大小可以计算为B x A x 3
注意:对于黑白图像,只有一个单一通道。
现在让我们看一下OpenCV到底是什么。

什么是OpenCV?

OpenCV是一个旨在解决计算机视觉问题的Python库。OpenCV最初是由Intel在1999年开发的,但后来得到Willow Garage的支持。它支持多种编程语言,例如C ++,Python,Java等。支持多种平台,包括Windows,Linux和MacOS。
OpenCV Python只是用于Python的原始C ++库的包装类。使用此方法,所有OpenCV数组结构都可以与NumPy数组进行相互转换。这样可以更轻松地将其与使用NumPy的其他库集成。例如,诸如SciPy和Matplotlib之类的库。

使用OpenCV的基本操作?

让我们看一下从加载图像到调整图像大小等各种概念。

  • 1、使用OpenCV加载图像
Import cv2

# colored Image
Img = cv2.imread ("Penguins.jpg",1)

# Black and White (gray scale)
Img_1 = cv2.imread ("Penguins.jpg",0)

如以上代码所示,第一个要求是导入OpenCV模块。
稍后,我们可以使用imread模块读取图像。参数中的1表示它是彩色图像。如果参数是0而不是1,则意味着导入的图像是黑白图像。图像的名称是“企鹅”。很简单吧?

  • 2、图像形状/分辨率

使用shape子函数来输出图片的形状。查看代码:

Import cv2  

# Black and White (gray scale)  

Img = cv2.imread ("Penguins.jpg",0)  

Print(img.shape)  

通过图像的形状,我们指的是NumPy数组的形状。从执行代码中可以看到,矩阵由768行和1024列组成。

  • 3、显示图像
import cv2
# Black and White (gray scale)
Img = cv2.imread ("Penguins.jpg",0)
cv2.imshow("Penguins", img)
cv2.waitKey(0)
# cv2.waitKey(2000)
cv2.destroyAllWindows()
  • 4、调整图像大小
import cv2
# Black and White (gray scale)
img = cv2.imread ("Penguins.jpg",0)
resized_image = cv2.resize(img, (650,500))
cv2.imshow("Penguins", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

调用子函数resize改变图像的大小

输出结果:

另外一个改变图像大小的API

Resized_image = cv2.resize(img, int((img.shape[1]/2), int(img.shape[0]/2)))

得到的新图像大小是原始图像的一半。

**使用OpenCV进行人脸检测**

乍一看这很复杂,但是非常容易。让我引导您完成整个过程,您会感到相同。 第1步:考虑我们的先决条件。首先,我们将需要一张图片。稍后,我们需要创建一个级联分类器,最终将为我们提供面部特征。

第2步:
我们需要做的就是搜索面部NumPy ndarray的行和列值。原始数据点是矩形坐标的数组。
第3步:
后一步是使用矩形面框显示图像。
看看下面的图片,这里我以图片的形式总结了三个步骤,以便于阅读:

首先,我们创建了一个CascadeClassifier对象,以提取面部特征,如前所述。包含面部特征的XML文件的路径是此处的参数。
下一步将是读取带有面部的图像,并使用COLOR_BGR2GREY将其转换为黑白图像。接下来,我们搜索图像的坐标。这是使用detectMultiScale完成的
您问什么坐标?它是面部矩形的坐标。所述scaleFactor被用于由5%直到面被发现以降低形状值。因此,总的来说,值越小,精度越高。
最后,将面部打印在窗口上。

##给识别的人脸添加矩形面框,xml为人脸数据集
这种逻辑非常简单-就像使用for循环语句一样简单。查看以下图片:

我们通过传递诸如图像对象,框轮廓的RGB值和矩形的宽度之类的参数来定义使用cv2.rectangle创建矩形的方法。

让我们查看用于面部检测的整个代码:

import cv2
# Create a CascadeClassifier Object
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# Reading the image as it is
img = cv2.imread("photo.jpg")
# Reading the image as gray scale image
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Search the co-ordintes of the image
faces = face_cascade.detectMultiScale(gray_img, scaleFactor = 1.05,
                                      minNeighbors=5)
for x,y,w,h in faces:
    img = cv2.rectangle(img, (x,y), (x+w,y+h),(0,255,0),3)
resized = cv2.resize(img, (int(img.shape[1]/7),int(img.shape[0]/7)))
cv2.imshow("Gray", resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用OpenCV捕获视频

使用OpenCV捕获视频也非常简单。以下循环将为您提供一个更好的主意。一探究竟:

图像被一张一张地读取,因此由于帧的快速处理而产生了视频,这使得单个图像移动。查看以下图片:

首先,我们照常导入OpenCV库。接下来,我们有一个称为VideoCapture的方法,该方法用于创建VideoCapture对象。此方法用于在用户计算机上触发相机。该函数的参数表示程序是否应使用内置摄像机或附加摄像机。在这种情况下,“ 0”表示内置摄像机。最后,释放方法用于在几毫秒内释放相机。

当您继续输入并尝试执行上面的代码时,您会注意到相机灯会瞬间打开,稍后关闭。为什么会这样?发生这种情况是因为没有时间延迟即可保持相机正常工作.

看看以上代码,我们有新的一行time.sleep(3)。这使脚本停止3秒。请注意,传递的参数是以秒为单位的时间。因此,当代码执行时,网络摄像头将开启3秒钟。
##添加窗口:

添加一个窗口以显示视频输出非常简单,可以与用于图像的相同方法进行比较。但是,有一点变化。

在这里,我们定义了一个NumPy数组,用于表示视频捕获的第一张图像。这存储在帧数组中。
我们也有检查。这是一个布尔数据类型,如果Python能够访问和读取VideoCapture对象,则该数据类型将返回True。
查看以下输出


如您所见,我们得到的输出为True,并打印了框架数组的一部分。

但是我们需要先阅读视频的第一帧/图像,对吗?
为此,我们首先需要创建一个框架对象,该对象将读取VideoCapture对象的图像。
如上所述,read方法用于捕获视频的第一帧。
在所有这些期间,我们尝试捕获视频的第一个图像/帧。
那么我们如何捕获视频而不是OpenCV中的第一张图像?

##直接捕获视频:
为了捕获视频,我们将使用while循环。while条件将使得除非’check’为True,否则Python将显示每一帧。

如前所述,我们利用cvtColor函数将每一帧转换为灰度图像。
waitKey(1)将确保在每毫秒的间隔后生成一个新帧。
重要的是要注意,while循环完全在起作用,以帮助遍帧并最终显示视频。
这里也有一个用户事件触发器。用户按下“ q”键后,程序窗口将关闭

##案例:使用OpenCV的运动检测器
question:
一家正在研究人类行为的公司已与您联系。您的任务是给他们提供一个网络摄像头,它可以检测前面的运动。这应该返回一个图形,并且该图形应包含人类/物体在摄像机前面的时间。


最初,我们将图像保存在特定的帧中。
下一步涉及将图像转换为高斯模糊图像。这样做是为了确保我们计算出模糊图像与实际图像之间的明显差异。
此时,图像仍不是对象。我们定义一个阈值以消除斑点,例如图像中的阴影和其他噪声。
稍后将定义对象的边框,然后如本教程前面所述,在对象周围添加一个矩形框。
最后,我们计算对象出现和退出帧的时间。
很简单,对不对?

这是代码片段:

这里也遵循相同的原理。我们首先导入包并创建VideoCapture对象,以确保我们使用网络摄像头捕获视频。
while循环遍历视频的各个帧。我们将色框转换为灰度图像,然后再将此灰度图像转换为高斯模糊。
我们需要存储视频的第一个图像/帧,对吗?我们仅将if语句用于此目的。

现在,让我们深入研究一些代码:

我们使用absdiff函数计算第一个帧和其他所有帧之间的差异。
threshold函数提供阈值,它将差异值小于30的像素转换为黑。如果像素的差异值大于30,则转换为白色。THRESH_BINARY就适用于此目的。
然后,我们使用findContours函数给图像定义轮廓区域。我们也在这个阶段加入边界。
就像之前解释过的,contourArea函数可消除阴影和噪声。为了简化,它将只保留白色部分,正如我们定义的,白色部分面积大于1000像素。
然后,在我们的工作帧中在对象的周围创建一个矩形框。
剩下的一件事是,我们需要计算物体在镜头前的时间。

我们用DataFrame存储对象出现在帧中被检测到的时间和运动的时间。

接下来是我们之前解释过的VideoCapture函数。但是在这里,我们有一个标志位,称之为status。我们在记录开始时设置status为0,因为对象在最初是不可见的。

如上图所示,当检测到对象时,我们将status标志更改为1。很简单吧?

我们将创建一个status的列表存储每一个扫描到的帧的状态,然后如果某处发生改变则使用datetime在列表中记录日期和时间。

如以上的解释图所示,我们将时间值存储在 DataFrame中。我们以把DataFrame写入CSV文件中结束,如图所示

绘制运动检测图:

我们实例的最后一步是显示结果。我们将要显示的是表示两轴上的运动的图形。看看以下代码:

首先,我们从motion_detector.py文件中导入DataFrame。
下一步是将时间转换为可读的并且可以解析的字符串形式。
最后,使用Bokeh plots在浏览器上绘制时间值的DataFrame。

输出:

结论:

  • 希望这个OpenCV Python教程可以帮助您学习使用Python入门OpenCV所需的所有基础知识。
  • 当您尝试开发需要图像识别和类似原理的应用程序时,这将非常方便。现在,您还应该能够借助Python中的OpenCV使用这些概念轻松地开发应用程序。

更多请参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一问解读OpenCV的计算机视觉中视频处理 的相关文章

随机推荐

  • 上位机与欧姆龙PLC的Fins tcp通讯

    参考1 147条消息 欧姆龙PLC的FinsTCP协议 weixin 37700863的博客 CSDN博客 欧姆龙fins协议tcp 参考2 147条消息 FinsTCP协议报文详细分析 常哥说编程的博客 CSDN博客 fins协议 参考3
  • 在R语言中利用mice包进行缺失值的线性回归填补

    在数据分析中 我们会经常遇到缺失值问题 一般的缺失值的处理方法有删除法和填补法 通过删除法 我们可以删除缺失数据的样本或者变量 而缺失值填补法又可分为单变量填补法和多变量填补法 其中单变量填补法又可分为随机填补法 中位数 中值填补法 回归填
  • 常见http状态码详解

    状态码 类别 原因短语 1XX Informational 信息性状态码 接受的请求正在处理 2XX Success 成功状态码 请求正常处理完毕 3XX Redirection 重定向状态码 需要进行附加操作以完成请求 4XX Clien
  • 架构总结图

  • 斑马网络和荣威RX5深度研究

    锋影 email 174176320 qq com 佐智汽车就李想的观点访谈了两位业内专家 他们的回答如下 专家A 这个是需求推动 有需求就有人做 特斯拉用Linux一样有地图 Android过于复杂 可靠性问题比Linux大几个数量级 做
  • 调用服务工具类-HttpsUtil

    import java io BufferedReader import java io IOException import java io InputStream import java io InputStreamReader imp
  • 星际文件存储IPFS是如何颠覆云存储的?

    一句话概括 IPFS The InterPlanetary File System 星际文件存储系统是一种点到点的分布式文件系统 它连接的计算设备都拥有相同的文件管理模式 从某种意义上来说这个概念跟Web的最初理念很类似 但是实际上IPFS
  • gazebo通过sdf搭建仿真环境和机器人Husky

    具体格式要求可参考 http sdformat org spec ver 1 6 elem sdf
  • YCbCr色彩空间

    一 RGB 三原色光模式 RGB color model 表示方式 R red 红色 G green 绿色 B blue 蓝色 使用场景 摄影 彩色电视 彩色显示屏 二 HSV HSL HSV HSL 是一种将 RGB 色彩模型中的点在圆柱
  • s5p4418的uboot网络无法使用问题解决

    一 前言 s5p4418 是一个三星的基于ARM的 cortex A9的四核处理器 这个 处理器目前常用的两个系统层固件分别是 uboot2014 linux3 4 39 和 uboot2016 linux4 4 172 两个版本 本次针对
  • Bootstrap弹出模态框的运用

    作者 张铭标 撰写时间 2019年 6月3日 Bootstrap模态框主要分为三部分 modal header modal body modal footer 在使用之前需要引入一些插件 bootstrap bundle js jquery
  • 如何添加虚拟PDF打印机

    正常情况 在安装了pdfFactory Pro虚拟打印机后 打开 打印弹窗 打印机名称 下拉框 便可找到 pdfFactory Pro 但因为某种原因此处未出现该设备 怎么办呢 该如何添加虚拟PDF打印机呢 下面便来看看如何操作吧 图1 打
  • mysql死锁

    https www cnblogs com tartis p 9366574 html 线上某服务时不时报出如下异常 大约一天二十多次 Deadlock found when trying to get lock Oh My God 是死锁
  • (带权有向图)邻接矩阵表示图代码实现

    package dn1124 author sj E mail 961784535 qq com version 创建时间 2017 11 26 下午10 16 38 类说明 带权有向图 邻接矩阵表示图代码实现 public class G
  • 将从数据库获取到的数据拼接成json格式

    有时候需要将从数据库获取的数据封装成json格式 可以使用如下方式拼接 代码 public void getinfo List
  • 用单片机蜂鸣器播放音乐

    这是怎么一回事 这算是一篇水文 是的 我又来水了 话说回来 虽然暑假开始已经将近两周了 但是我们并没有回家 为什么呢 你可知道这世上有一物唤作 小学期 吗 每年暑假 我们学院大二的学生都会被拉到工训中心愉悦地学习课程 其名为 焊板子 学会了
  • mybatis的分批次插入

    最近在写mybati的分批插入 一直报错 一直在纠结自己的循环插入是不是有问题 但是数据量少的时候可以正常插入 但是插入数据量大的时候就会报错 后来查询是mysql限制插入的sqlMysql 对语句的长度有限制 默认是 4M Mybatis
  • php 新闻hot图标,div+css实现图片右上角hot、new等图标样式

    方法 用DIV CSS实现 CSS部分修改 hot play position relative hot play ul float left hot play li float left position relative width 9
  • vscode——debugger

    提示 本文适用于vscode编译java代码调试初学者 文章目录 debugger图标介绍 左侧工具栏 调试代码 debugger图标介绍 在进行调试之前我们应先在代码前打断点 调试程序时 代码就会运行至断点位置然后停下 断点即为行数前小红
  • 一问解读OpenCV的计算机视觉中视频处理

    微信公众号 小白图像与视觉 关于技术 关注yysilence00 有问题或建议 请公众号留言 了解OpenCV的计算机视觉 OpenCV Python教程 在本OpenCV Python教程中 我们将介绍在Python中使用OpenCV进行