AI社交距离检测器:使用OpenCV中处理图像

恬静的小魔龙 2020-12-12 15:24:59 9426

导言

在本系列文章中,我们将探讨如何在视频帧上使用人工智能和深入学习,以确保人们在人群中保持足够的社交距离。

在这里,我们将学习如何使用OpenCV处理图像和视频序列。我们学习如何从摄像头和视频文件中读取、写入和显示图像和视频。

2020年,随着COVID-19 病毒危机席卷全球,社交距离突然变得非常重要。社交隔离措施对公共卫生至关重要,但也不可能同时在任何地方实施。

在本系列文章中,我们将探讨如何在视频帧上使用人工智能和深入学习,以确保人们在人群中保持足够的社交距离。在本系列的最后,您将了解如何使用人工智能来确定人们有没有遵守社交距离协议:

img

社交距离探测器,通常应用于图像或视频序列。首先,我们将解释如何使用Python 3和OpenCV从摄像机中获取图像、读取和编写图片以及视频序列。在下一步中,我们将学习如何使用OpenCV对检测到的对象进行分析。

OpenCV是一个流行的开源、跨平台的实时计算机视觉应用程序库,它为图像处理、目标检测、机器学习、深度学习、计算摄影等提供了方便的API。要在Python 3应用程序中开始使用OpenCV,只需安装opencv-python

pip3 install opencv-python

然后导入cv2模块如下:

import cv2 as opencv

有了它,您就可以使用OpenCV了。在接下来的部分中,我们将使用OpenCV API来读取、显示和写入图像。然后,我们将学习如何处理视频流,并从网络摄像头获取视频。

静态图像的读取和显示

我们首先从Lena.png文件中读取图像。下面是加载和显示图像的完整Python脚本:

import cv2 as opencv

# Load image
file_path = 'Lena.png'
lena_img = opencv.imread(file_path)

# Display image
opencv.imshow('Lena', lena_img)
opencv.waitKey(0)

首先,我使用imread函数从文件中读取图像。我将此操作的结果存储在lena_img变量。然后,我使用imshow方法。此方法接受两个参数:将在其中显示图像的窗口的标题和要显示的图像。注意最后一次调用waitKey功能。它将阻止脚本执行以显示图像,直到用户按下任何键。waitKey函数是延时作用。我写入参数0,这意味着无限延时。

运行上述脚本后,您将看到Lena图片:

img

注意,imread函数,除图像文件路径外,还接受指示图像颜色比例的可选参数。您可以使用以下三个值之一:

  • IMREAD_GRAYSCALE或者1-图像将以灰度形式加载。
  • IMREAD_COLOR或者0-图像将以颜色加载,忽略透明通道。
  • IMREAD_UNCHANGED或者-1-图像将使用原始颜色刻度加载并包含透明度。

这个IMREAD_COLOR选项是默认选项。这就是为什么我们看到的彩色版本的莉娜图像。让我们看看如何以灰度加载图像。为此,请修改imread详情如下:

lena_img = opencv.imread(file_path, opencv.IMREAD_GRAYSCALE)

重新运行脚本之后,您将看到以下输出:

img

图片保存

现在我们已经知道了如何读取和显示图像,让我们看看如何将图片写入磁盘。为此,我们将使用以下语句扩展脚本:

# Process image (Gaussian blur) 
kernel_size = (11,11)
sigma_X = 0

lena_img_processed = opencv.GaussianBlur(lena_img, kernel_size, sigma_X)

# Save image
output_file_path = 'Lena-processed.jpg'
opencv.imwrite(output_file_path, lena_img_processed)

上面的脚本首先模糊了预定义的11x11像素的图像。GaussianBlur方法来自OpenCV。模糊图像存储在lena_img_processed变量,然后将其保存到Lena-processed.pngimwrite方法。如上文所示,imwrite接受两个参数。第一个是文件的路径,第二个是要写入的图像。或者,imwrite接受压缩参数数组。您可以按以下方式传递它们:

opencv.imwrite(output_file_path, lena_img_processed, [int(opencv.IMWRITE_JPEG_QUALITY), 100])

修改后的脚本的结果将是Lena-processed.jpg,看起来是这样的:

img

视频捕获

若要从网络摄像机中捕获帧,请使用来自OpenCV的对象VideoCapture。其构造函数接受表示摄像机索引的整数或视频文件的路径。我从摄像机索引开始,并传递0:

import cv2 as opencv

# Create video capture
video_capture = opencv.VideoCapture(0)

然后,要从网络摄像机中捕获帧,可以使用read的功能VideoCapture类实例。此方法返回捕获状态(布尔值)和获取的帧。因此,下一步是检查状态并使用imshow职能:

quit_key = ord('q')

# Display images in a loop until user presses 'q' key
while(True):            
    (status, camera_frame) = video_capture.read()    

    if(status):
        opencv.imshow('Camera preview', camera_frame)

    key = opencv.waitKey(10)

    if(key == quit_key):
        break

上述过程将继续进行,直到用户按下键盘上的‘q’。运行此脚本时,您将看到从默认摄像头中捕获的视频序列。

将摄像机帧写入视频文件

还可以将捕获的帧写入文件。你用VideoWriter为了这个目的。在创建此类型的对象时,需要提供视频文件的路径、视频编解码器、帧速率和帧大小。OpenCV使用了FourCC编解码器,您可以使用VideoWriter_fourcc对象。您传递一组字母,表示编解码器。例如,要使用MJPG编解码器,将每个字母作为参数传递如下:

codec = opencv.VideoWriter_fourcc('M','J','P','G')

下面是一个完整的示例,演示如何将视频序列从摄像头写入视频文件:

import cv2 as opencv

quit_key = ord('q')

# Create video capture
video_capture = opencv.VideoCapture(0)

# Video writer
video_file_name = 'camera_capture.avi'
codec = opencv.VideoWriter_fourcc('M','J','P','G')
frame_rate = 25
video_writer = None

# Display images in a loop until user presses 'q' key
while(True):            
    (status, camera_frame) = video_capture.read()    

    if(status):
        opencv.imshow('Camera preview', camera_frame)        

        if(video_writer == None):            
            frame_size = camera_frame.shape[-2::-1]            
            video_writer = opencv.VideoWriter(video_file_name, 
                codec, frame_rate, frame_size)

        video_writer.write(camera_frame)

    key = opencv.waitKey(10)

    if(key == quit_key):
        break

video_writer.release()

上面的脚本通过使用VideoWriter。注意,我初始化了VideoWriter一次,在成功捕获第一帧之后。我这样做是为了能接触到相机的相框大小。我从shape的属性camera_frame。然后,我调用write方法将新帧添加到视频文件中。一旦书写完成,我就调用release方法关闭VideoWriter.

读取视频文件

在最后一步中,我将向您展示如何使用OpenCV读取视频序列。再次,使用VideoCapture对象,但这一次您需要传递视频文件名:

video_capture = opencv.VideoCapture(video_file_name)

然后,按照从摄像头获取视频的方式读取连续帧:

video_capture.read()

您可以用imshow方法。下面是实现这种功能的完整脚本:

import cv2 as opencv

video_file_name = 'camera_capture.avi'
frame_rate = 25

video_capture = opencv.VideoCapture(video_file_name)

while(True):
    (status, camera_frame) = video_capture.read()

    if(status):
        opencv.imshow('Video file', camera_frame)
        opencv.waitKey(int(1000/frame_rate))
    else:
        break

总结

我们学习了如何使用OpenCV对图像(加载、写入和显示)和视频流(读和写)执行基本操作。这将作为构建我们的AI对象检测器的基础。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 95 7 评论 打赏
评论
1个
内容存在敏感词
手气红包
  • 这把我C 2020-12-12 22:19:44
    回复

    图片都不能出来

相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
恬静的小魔龙
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区