使用OpenCV进行虚拟缩放-600学习网

600学习网终身会员188,所有资源无秘无压缩-购买会员

介绍

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

今天我们想实现一个有趣的东西,它是移动电话或计算机的功能,即图像缩放。但在这里,它将是帧上实时所需图像的虚拟缩放。

目录

1.要求

2.目的

3.构建

4.结论

要求

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

CVZone公司

它是一个基于OpenCV和MediaPipe的库。这让事情变得容易多了。

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

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

–pip安装-r requirements.txt

–pip安装opencv-python==3.4.11.43

–管道安装cvzone==1.5.3

现在让我们来测试一下我们的手。

导入cv2

从cvzone.HandTrackingModule导入HandDetector

#网络摄像头输入

帧=cv2.VideoCapture(0)

帧集(31280)

帧集(4720)

#以一定的信心初始化手检测器模块

手检测器=手检测器(detectionCon=0.8)

#回路

当为True时:

#从网络摄像头读取帧

res,img=frame.read()

#检测手,默认情况下它将检测两只手

hands=handDetector.findHands(img)

#显示输出

cv2.imshow(“示例CVZone输出”,img)

cv2.waitKey(1)

首先,让我们导入所需的模块cv2,并从cvzone导入HandDetector*。手持跟踪模块*

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

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

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

使用OpenCV进行虚拟缩放

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

目标

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

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

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

初始化手检测器模块。

声明用于计算距离.缩放范围.中心X和中心Y的四个变量。

读取输入帧。

测试你的手。

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

检查是否检测到两只手。

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

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

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

显示输出。

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

使用OpenCV进行虚拟缩放

结构

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

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

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

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

导入cv2

从cvzone.HandTrackingModule导入HandDetector

#网络摄像头输入

帧=cv2.VideoCapture(0)

帧集(31280)

帧集(4720)

现在,我们将用0.8的检测置信度初始化手检测器模块,它将用于在while循环中检测手。

声明四个变量,一个是初始存储距离(None),另一个是缩放范围(scale range),最初为0,另外两个用于捕捉

手检测器=手检测器(detectionCon=0.8)

distStart=无

缩放_范围=0

cx,cy=500500

开始while循环。从现在起,所有操作都应该在这个循环中。

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

我们可以从中访问每个检测到的手(这里:一只手是手[0],另一只手就是手[1]),它还返回图像。然后,我们将使用OpenCV的imread()函数读取屏幕上要缩放的图像。图像大小应小于(250250),否则您可以使用cv2.resize(img,(250250))调整其大小。此处的图像大小为(225225)。

当为True时:

#读取输入帧

res,img=frame.read()

#检测手

hands,img=handDetector.findHands(img)

#要缩放的图像

new_img=cv2.imread(‘resized_test.jpg’)

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

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

请参阅下图。

#如果检测到两只手

如果len(hands)==2:

打印(“开始缩放…”)

print(handDetector.fingersUp(hands[0]))

print(handDetector.fingersUp(hands[1]))

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

使用OpenCV进行虚拟缩放

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

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

如果条件仅在distStart为None时执行,则获得的距离将分配给我们前面声明的第三个变量distStart。然后,计算新距离,并从旧距离distStart中减去它,然后除以2(向下舍入)得到刻度范围。然后将中心坐标分配给变量cx,cy。然后,如果帧中没有两只手,则将distStart变量重置为None。

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

使用OpenCV进行虚拟缩放

如果handDetector.fingersUp(hands[0])==[1,1,0,0,0]和handDector.fingers Up(hands[1])==〔1,1,0,0,0〕:

#打印(“开始缩放…”)

lmList1=手[0][“lmList”]

lmList2=手〔1〕〔’lmList’〕

#点8是食指尖

如果distStart为None:

#length,info,img=handDetector.findDistance(lmList1[8],lmList2[8])

#绘制右手食指和左手拇指之间的连接点

length,info,img=handDetector.findDistance(指针[0][‘center’],指针[1][‘中心’],img)

#打印(长度)

distStart=长度

#length,info,img=handDetector.findDistance(lmList1[8],lmList2[8])

长度,信息,img=handDetector.findDistance(指针[0][center],指针[1][center],img)

#信息给出中心x和中心y

#计算缩放范围

缩放范围=int((长度–distStart)//2)

#计算中心点,以便我们可以将缩放图像放置在中心

cx,cy=info[4:]打印(缩放范围)

否则:

distStart=无

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

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

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

尝试:

h. w,_=新的_ img.shape

#新高度新宽度

newH,newW=((h+变焦范围)//2)*2,(w+变焦距离)//3)*

new_img=cv2.resize(new_img,(newW,newH))

#我们希望缩放图像居中,并将其放置在中心附近

img〔cy–newH//2:cy+newH//2,cx–newW//2:cx+newW//2〕=新的

除了:

通过

#显示输出

cv2.imshow(输出,img)

cv2.waitKey(1)

结论

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

参考资源:

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站,本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
600学习网 » 使用OpenCV进行虚拟缩放-600学习网