Python使用OpenCV实现虚拟缩放效果


Posted in Python onFebruary 28, 2022

介绍

OpenCV 彻底改变了整个图像处理领域。从图像分类到对象检测,我们不仅可以使用 OpenCV 库做一些很酷的事情,而且还可以构建一流的应用程序。

今天我们要实现一个有趣的东西,它是手机或电脑中的一种功能,即图像缩放。但在这里,它将是实时对帧上所需的图像进行虚拟缩放。

要求

对于这个项目,我们将使用 OpenCV 库和另一个名为 Cvzone 的库来使用虚拟缩放。

CVZone

它是一个建立在 OpenCV 和 MediaPipe 之上的库。它使事情变得容易得多。

CVZone 具有一些非常有用的内置功能,例如手部跟踪、面部标志检测、姿势估计等等。这些都可以通过几行代码来完成。

让我们编写一段代码来看看使用 CVZone 的手部检测器的演示。首先,安装 requirements 。你可以使用以下命令安装它,也可以逐个安装。

– pip install -r requirements.txt

– pip install opencv-python==3.4.11.43

– pip install cvzone==1.5.3

现在让我们检测手。

import cv2
from cvzone.HandTrackingModule import HandDetector
# Input from webcam
frame = cv2.VideoCapture(0)
frame.set(3, 1280)
frame.set(4, 720)
 
# initialize hand detector module with some confidence
handDetector = HandDetector(detectionCon=0.8)
 
# loop
while True:
# Read the frames from webcam
res, img = frame.read()
 
# detect the hands, by default it will detect two hands
hands = handDetector.findHands(img)
 
# show the output
cv2.imshow(“Sample CVZone output”, img)
cv2.waitKey(1)

首先,让我们导入所需的模块,cv2,以及从 cvzone.HandTrackingModule 导入HandDetector*。*

然后我们将使用 OpenCV 的 Videocapture 功能从网络摄像头获取输入。设置窗口的高度和宽度,并以一定的检测置信度初始化手部检测器模块。

然后在循环内部从网络摄像头读取输入帧并将其传递给手部检测器模块内部的方法,即 findHands。显示图像。

Python使用OpenCV实现虚拟缩放效果

与此类似,我们可以使用 CVZone 实现面部地标检测、姿势估计等。

目标

我们的目标是构建一个屏幕上有图像的项目,使用 OpenCV 进行虚拟缩放,并使用我们的手势,即如果双手的食指和拇指向上并且两根手指彼此远离,就放大,如果双手的食指和拇指向上并且两根手指彼此靠近,则缩小该图像或对象。牢记这一点,我们将制定一些步骤。

步骤

初始化来自网络摄像头的输入。

设置输出窗口的高度和宽度。

初始化手部检测器模块。

分别声明计算距离、缩放范围、中心X和中心Y的4个变量。

读取输入帧。

检测双手。

读取用于缩放操作的图像。

检查是否检测到两只手。

检查食指和拇指是否向上。

计算两只手之间的距离,并将图像调整到两只手的中心。

计算新的高度和宽度,然后调整图像大小。

显示输出。

Python使用OpenCV实现虚拟缩放效果

构建

如上一节所述安装所需的库。现在让我们开始吧。

首先,导入所需的模块。这里我们只需要 cv2 和 cvzone 的手部检测器模块。

导入库后,使用 cv2.VideoCapture(0) 从网络摄像头获取输入,其中 0 是网络摄像头 ID。

然后设置输出窗口的宽度和高度。这里是 1280 x 720。

import cv2
from cvzone.HandTrackingModule import HandDetector
# Input from webcam
frame = cv2.VideoCapture(0)
frame.set(3, 1280)
frame.set(4, 720)

现在,我们将初始化手检测模块(handDetector),检测置信度为 0.8,并将在 while 循环中用于检测手。

声明 4 个变量,一个是初始存储距离,它是None,一个是缩放范围,初始是0,另外 2 个用于捕捉缩放对象的中心 X 和中心 Y,并设置一些随机值。

这里代码中的变量分别是 distStart、zoom_range、cx、cy。

# initialize hand detector module
handDetector = HandDetector(detectionCon=0.8)
distStart = None
zoom_range = 0
cx, cy = 500, 500

开始一个while循环,从现在开始,一切操作都应该在这个循环中。

从网络摄像头读取输入,并使用上面初始化的手部检测器模块,我们可以调用方法 findHands 将帧作为输入传递。此方法会在框架中找到手,默认它可以检测框架中的两只手并返回手的列表。

我们可以从中访问每只检测到的手(这里:一只手为hands[0],另一只手为hands[1]),并且它还返回图像。然后我们将使用 OpenCV 的 imread() 函数读取屏幕上要缩放的图像。最好图像大小应低于 (250, 250),否则你可以使用 cv2.resize(img, (250,250)) 调整其大小。这里图像大小为 (225, 225)。

while True:
    # Read the input frame
    res, img = frame.read()
    # Detect the hands
    hands, img = handDetector.findHands(img)
    # Image to be zoomed
    new_img = cv2.imread('resized_test.jpg')

现在,我们需要检查框架中是否有两只手,然后我们将检查食指和拇指是否向上,这可以使用手检测模块中的 FingerUp() 方法轻松完成。

在下面的第一个 if 语句之后的代码中,我们将使用两个打印语句 print(handDetector.fingersUp(hands[0])) ,如果食指和拇指向上,则这将打印一个包含 5 个元素的列表,结果列表显示一只手将是 [1, 1, 0, 0, 0],另一只手类似地执行 print(handDetector.fingersUp(hands[1]))。

请参考下图。

# if two hands are detected
if len(hands) == 2:
    print("Start Zoom...")
    print(handDetector.fingersUp(hands[0]))
    print(handDetector.fingersUp(hands[1]))

Python使用OpenCV实现虚拟缩放效果

然后是重要的部分,现在我们需要检查双手的食指和拇指是否向上。我们将再次使用 if 语句(在第一个 if 语句中:if handDetector.fingersUp(hands[0]) == [1, 1, 0, 0, 0] 和 handDetector.fingersUp(hands[1]) == [ 1, 1, 0, 0, 0]:) 然后求两只手之间的距离,具体来说就是食指两点之间的距离。

在下面的代码中,findDistance() 方法将找到距离,这里我们将两只手的中心作为参数与框架一起传递。findDistance() 方法将返回三个项目距离,一个包含位置 4 和 5 的中心 X 和中心 Y 的元组以及图像。

如果仅当 distStart 为 None 时才执行条件,则将获得的距离分配给我们之前声明的第三个变量 distStart。然后,计算新距离并从旧距离 distStart 中减去它,并执行除以 2 (向下取整)以获得缩放范围。然后将中心坐标分配给变量cx,cy。然后,如果框架中没有两只手,则将 distStart 变量重置为 None。

Python使用OpenCV实现虚拟缩放效果

if handDetector.fingersUp(hands[0]) == [1, 1, 0, 0, 0] and handDetector.fingersUp(hands[1]) == [1, 1, 0, 0, 0]:
        # print("Start Zoom...")
        lmList1 = hands[0]['lmList']
        lmList2 = hands[1]['lmList']
        # point 8 is tip of the index finger
        if distStart is None:
            # length, info, img = handDetector.findDistance(lmList1[8], lmList2[8], img)
            # draw the connection points between right hand index and thum finger to left hand
            length, info, img = handDetector.findDistance(hands[0]['center'], hands[1]['center'], img)
            # print(length)
            distStart = length
# length, info, img = handDetector.findDistance(lmList1[8], lmList2[8], img)
length, info, img = handDetector.findDistance(hands[0][‘center'], hands[1][‘center'], img)
# info gives center x and center y
# calculate the zoom range
zoom_range = int((length – distStart) // 2)
# calculate the center point so that we can place the zooming image at the center
cx, cy = info[4:] print(zoom_range)
 
else:
distStart = None

然后获取要放大的图像的高度和宽度,并计算图像的新高度和宽度。这有点棘手,要获得新的高度和宽度,我们需要将图像之前的高度和宽度添加到缩放范围并执行向下取整除法,然后乘以 2。

然后我们可以动态找到放置缩放的位置图像(这里:img[cy – newH // 2:cy + newH // 2, cx – newW // 2:cx + newW // 2])。

但是还有一个问题,如果缩放后的图像低于窗口边距,则会出错,为了解决这个问题,我们将使用 try 和 except。然后显示输出。

try:
    h, w, _ = new_img.shape
# new height and new width
newH, newW = ((h + zoom_range) // 2) * 2, ((w + zoom_range) // 2) * 2
new_img = cv2.resize(new_img, (newW, newH))
 
# we want the zooming image to be center and place it approx at the center
img[cy – newH // 2:cy + newH // 2, cx – newW // 2:cx + newW // 2] = new_img
 
except:
pass
 
# display output
cv2.imshow(‘output', img)
cv2.waitKey(1)

完整的代码也可以在这个 GitHub 中找到

结论

这就是这篇关于使用 OpenCV 进行虚拟缩放的博客的内容。如果你想即兴发挥,让它更有趣,你可以在屏幕上保留一些图像,每次选择一个并放大它,或者你可以创建不同的形状,使用不同的手势来让它变大或变小。这就是我们如何使用 OpenCV 实现虚拟缩放。

到此这篇关于Python使用OpenCV实现虚拟缩放效果的文章就介绍到这了,更多相关Python OpenCV虚拟缩放内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中的hashlib和base64加密模块使用实例
Sep 02 Python
Python与shell的3种交互方式介绍
Apr 11 Python
Python制作数据导入导出工具
Jul 31 Python
Python简单实现enum功能的方法
Apr 25 Python
一道python走迷宫算法题
Jan 22 Python
Python封装原理与实现方法详解
Aug 28 Python
Python定义函数功能与用法实例详解
Apr 08 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
python numpy矩阵信息说明,shape,size,dtype
May 22 Python
python实现KNN近邻算法
Dec 30 Python
python 统计list中各个元素出现的次数的几种方法
Feb 20 Python
python保存图片的四个常用方法
Python可视化学习之seaborn调色盘
Python可视化学习之matplotlib内置单颜色
Python可视化学习之seaborn绘制矩阵图详解
Python matplotlib可视化之绘制韦恩图
Python语言中的数据类型-序列
Feb 24 #Python
浅析python中特殊文件和特殊函数
Feb 24 #Python
You might like
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
关于Python作用域自学总结
2019/06/10 Python
python hough变换检测直线的实现方法
2019/07/12 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
先进个人获奖感言
2014/01/24 职场文书
教师节主题班会教案
2015/08/17 职场文书
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
拙作再改《我的收音机情缘》
2022/04/05 无线电