opencv 缩放,python opencv透视变换
OpenCV彻底改变了整个图像处理领域。从图像分类到物体检测,我们不仅可以用OpenCV库做一些很酷的事情,还可以构建一流的应用。本文将使用OpenCV实现虚拟缩放,大家可以参考自己需要的。
00-1010简介需求目标构建结论
目录
OpenCV彻底改变了整个图像处理领域。从图像分类到物体检测,我们不仅可以用OpenCV库做一些很酷的事情,还可以构建一流的应用。
今天我们要实现一个有趣的东西,是手机或者电脑里的一个功能,就是图像缩放。但在这里,它将是所需图像在帧上实时的虚拟缩放。
介绍
对于这个项目,我们将使用OpenCV库和另一个名为Cvzone的库来使用虚拟缩放。
CVZone
它是一个基于OpenCV和MediaPipe的库。这让事情变得简单多了。
CVZone有一些非常有用的内置功能,比如手部追踪、面部标志检测、姿态估计等等。这些都可以用几行代码完成。
我们写个代码来看看用CVZone做手部检测器的演示吧。首先,安装要求。可以使用下面的命令安装,也可以一个一个安装。
pip安装-r要求. txt
或者
pip安装opencv-python==3.4.11.43
pip安装cvzone==1.5.3
现在我们来测试一下手。
导入cv2
来自cvzone。手动跟踪模块导入手动检测器
#来自网络摄像头的输入
frame=cv2。视频捕获(0)
frame.set(3,1280)
frame.set(4,720)
#满怀信心地初始化手检测器模块
手动检测器=手动检测器(检测图标=0.8)
#循环
而True:
#从网络摄像头读取画面
res,img=frame.read()
#检测手,默认情况下会检测两只手
hands=hand detector . find hands(img)
#显示输出
cv2.imshow("示例CVZone输出",img)
cv2.waitKey(1)
首先,让我们导入所需的模块cv2,并从cvzone导入HandDetector*。手动跟踪模块*
然后我们将使用OpenCV的Videocapture功能从网络摄像头获取输入。设置窗口的高度和宽度,用一定的检测置信度初始化手部检测器模块。
然后从循环内部的网络摄像头读取输入帧,传递到手部检测器模块内部,也就是findHands。显示图像。
同样,我们可以使用CVZone来实现面部标志点检测、姿态估计等。
要求
我们的目标是建立一个在屏幕上有图像的项目,使用OpenCV进行虚拟缩放,使用我们的手势,即如果双手的食指和拇指向上,两个手指相互远离,则放大,如果双手的食指和拇指向上,两个手指相互靠近,则缩小。考虑到这一点,我们将制定一些步骤。
步骤
初始化网络摄像头的输入。
设置输出窗口的高度和宽度。
初始化手检测器模块。
分别声明计算距离、缩放范围、中心x和中心y的四个变量。
读取输入帧。
测试你的手。
读取用于变焦操作的图像。
检查是否检测到两只手。
检查食指和拇指是否向上。
计算两只手之间的距离,并将图像调整到两只手的中心。
p>计算新的高度和宽度,然后调整图像大小。
显示输出。
构建
如上一节所述安装所需的库。现在让我们开始吧。
首先,导入所需的模块。这里我们只需要 cv2 和 cvzone 的手部检测器模块。
导入库后,使用 cv2.VideoCapture(0) 从网络摄像头获取输入,其中 0 是网络摄像头 ID。
然后设置输出窗口的宽度和高度。这里是 1280 x 720。
import cv2
# Input from webcam
现在,我们将初始化手检测模块(handDetector),检测置信度为 0.8,并将在 while 循环中用于检测手。
声明 4 个变量,一个是初始存储距离,它是None,一个是缩放范围,初始是0,另外 2 个用于捕捉缩放对象的中心 X 和中心 Y,并设置一些随机值。
这里代码中的变量分别是 distStart、zoom_range、cx、cy。
# initialize hand detector module
开始一个while循环,从现在开始,一切操作都应该在这个循环中。
从网络摄像头读取输入,并使用上面初始化的手部检测器模块,我们可以调用方法 findHands 将帧作为输入传递。此方法会在框架中找到手,默认它可以检测框架中的两只手并返回手的列表。
我们可以从中访问每只检测到的手(这里:一只手为hands[0],另一只手为hands[1]),并且它还返回图像。然后我们将使用 OpenCV 的 imread() 函数读取屏幕上要缩放的图像。最好图像大小应低于 (250, 250),否则你可以使用 cv2.resize(img, (250,250)) 调整其大小。这里图像大小为 (225, 225)。
while True:
现在,我们需要检查框架中是否有两只手,然后我们将检查食指和拇指是否向上,这可以使用手检测模块中的 FingerUp() 方法轻松完成。
在下面的第一个 if 语句之后的代码中,我们将使用两个打印语句 print(handDetector.fingersUp(hands[0])) ,如果食指和拇指向上,则这将打印一个包含 5 个元素的列表,结果列表显示一只手将是 [1, 1, 0, 0, 0],另一只手类似地执行 print(handDetector.fingersUp(hands[1]))。
请参考下图。
# if two hands are detected
然后是重要的部分,现在我们需要检查双手的食指和拇指是否向上。我们将再次使用 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。
if handDetector.fingersUp(hands[0]) == [1, 1, 0, 0, 0] and handDetector.fingersUp(hands[1]) == [1, 1, 0, 0, 0]:
# length, info, img = handDetector.findDistance(lmList1[8], lmList2[8], img)
然后获取要放大的图像的高度和宽度,并计算图像的新高度和宽度。这有点棘手,要获得新的高度和宽度,我们需要将图像之前的高度和宽度添加到缩放范围并执行向下取整除法,然后乘以 2。
然后我们可以动态找到放置缩放的位置图像(这里:img[cy – newH // 2:cy + newH // 2, cx – newW // 2:cx + newW // 2])。
但是还有一个问题,如果缩放后的图像低于窗口边距,则会出错,为了解决这个问题,我们将使用 try 和 except。然后显示输出。
try:
# new height and new width
完整的代码也可以在这个 GitHub 中找到
结论
这就是这篇关于使用 OpenCV 进行虚拟缩放的博客的内容。如果你想即兴发挥,让它更有趣,你可以在屏幕上保留一些图像,每次选择一个并放大它,或者你可以创建不同的形状,使用不同的手势来让它变大或变小。这就是我们如何使用 OpenCV 实现虚拟缩放。
到此这篇关于Python使用OpenCV实现虚拟缩放效果的文章就介绍到这了,更多相关Python OpenCV虚拟缩放内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。