使用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。显示图像。
使用OpenCV进行虚拟缩放
类似地,我们可以使用CVZone来实现面部地标检测.姿势估计等。
目标
我们的目标是用屏幕上的图像构建一个项目,使用OpenCV进行虚拟缩放,并使用我们的手势,也就是说,如果两只手的食指和拇指向上,并且两根手指彼此远离,我们将放大;如果双手的食指和拇指向上,并且两个手指彼此靠近,我们将缩小图像或对象。考虑到这一点,我们将制定一些步骤。
步
初始化网络摄像头的输入。
设置输出窗口的高度和宽度。
初始化手检测器模块。
声明用于计算距离.缩放范围.中心X和中心Y的四个变量。
读取输入帧。
测试你的手。
读取用于缩放操作的图像。
检查是否检测到两只手。
检查食指和拇指是否向上。
计算两只手之间的距离,并将图像调整到两只手的中心。
计算新的高度和宽度,然后调整图像大小。
显示输出。
使用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]))
使用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。
使用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实现虚拟缩放。
参考资源:
600学习网 » 使用OpenCV进行虚拟缩放-600学习网