一文带你了解计算机视觉之视频读入,目标检测与跟踪

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

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

了解OpenCV的计算机视觉

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

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第1张图片

我们可以发现这是纽约天际线的图像。但是,计算机可以自己找出所有这些吗?答案是不!计算机读取的任何图像的取值范围为0到255。
对于任何彩色图像,都有3个主要通道-红色,绿色和蓝色。它的工作原理非常简单。
为每种原色形成一个矩阵,然后,这些矩阵组合以提供每种R,G和B颜色的像素值。
矩阵的每个元素提供有关像素亮度强度的数据。
考虑下图:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第2张图片
如图所示,此处图像的大小可以计算为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改变图像的大小

输出结果:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第3张图片
另外一个改变图像大小的API

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

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

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

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

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第4张图片

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

##给识别的人脸添加矩形面框,xml为人脸数据集
这种逻辑非常简单-就像使用for循环语句一样简单。查看以下图片:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第5张图片

我们通过传递诸如图像对象,框轮廓的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捕获视频也非常简单。以下循环将为您提供一个更好的主意。一探究竟:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第6张图片

图像被一张一张地读取,因此由于帧的快速处理而产生了视频,这使得单个图像移动。查看以下图片:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第7张图片

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

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第8张图片

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

添加一个窗口以显示视频输出非常简单,可以与用于图像的相同方法进行比较。但是,有一点变化。查看以下代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nmm3vOz1-1578030281858)(https://note.youdao.com/yws/api/personal/file/WEBd59541df20e30a95d8e2a27ff3328c65?method=download&shareKey=ccc97bd7e3f2cfbf6699a41eda152ac2)]

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第9张图片
如您所见,我们得到的输出为True,并打印了框架数组的一部分。

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

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第10张图片

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

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第11张图片
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第12张图片

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

这是代码片段:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第13张图片

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

现在,让我们深入研究一些代码:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第14张图片

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第15张图片

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

接下来是我们之前解释过的VideoCapture函数。但是在这里,我们有一个标志位,称之为status。我们在记录开始时设置status为0,因为对象在最初是不可见的。
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第16张图片
如上图所示,当检测到对象时,我们将status标志更改为1。很简单吧?

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第17张图片

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第18张图片

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

绘制运动检测图:

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

一文带你了解计算机视觉之视频读入,目标检测与跟踪_第19张图片

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

输出:
一文带你了解计算机视觉之视频读入,目标检测与跟踪_第20张图片

结论:

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

更多请参考

你可能感兴趣的:(图像处理,c++,与opencv,学习笔记)