使用OpenCV查找轮廓中的极值点 您所在的位置:网站首页 opencv手部检测坐标数组为什么是一行 使用OpenCV查找轮廓中的极值点

使用OpenCV查找轮廓中的极值点

2024-07-03 21:52| 来源: 网络整理| 查看: 265

使用OpenCV查找轮廓中的极值点

在这篇文章的剩下部分,我将演示如何沿着轮廓的坐标去寻找最北、南、东、西的点,像在这篇博客顶部的形象。 虽然这个功能本身不太有用,但是它经常作为其它高级的计算机视觉应用的预处理环节。一个很好的的应用就是手势识别:

图1:计算沿手掌轮廓的极坐标 在上图中,我们有图片的皮肤/手掌的分段,计算手掌轮廓的凸包线(蓝色的外框线),然后沿着凸包线(红圈)寻找极点。 通过计算手部极点,我们可以更好地接近手掌区域(蓝色的高亮圈):

图2:沿着手使用极值点可以使我们近似手掌的中心。

这反过来又使我们认识到手势,比如我们举起手指的数量: 图3:使用OpenCV沿轮廓寻找极值点是手势识别的总要过程

实现这样一个手势识别系统是这篇博客的内容,所以我们需要使用下面这张图片:

图4:我们的示例图片包括一个手。我们将计算沿手部轮廓的北、南、东和西极值点坐标。

现在我们的目标是计算这张图片中沿手部轮廓的极值点。 让我们开始吧,打开一个新文件,名字是 extreme_points.py,并且编写代码:

#导入必要的包 import imutils import cv2 #载入图片,将格式转换为灰阶图像,并做轻微模糊化 image = cv2.imread("hand_01.png") gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray,(5,5),0) #二值化图像,然后进行腐蚀扩张,以去除噪点 thresh = cv2.threshold(gray,45,255,cv2.THRESH_BINARY)[1] thresh = cv2.erode(thresh,None,iterations = 2) thresh = cv2.dilate(thresh,None,iterations = 2) #在二值化图片中寻找轮廓,然后抓取最大的一个 cnts = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1] c = max(cnts,key=cv2.contourArea)

行2和行3导入我们需要的包,然后我们从磁盘导入我们示例图像,转换它为灰度图像,并且模糊处理。

行12 执行阀值化,让我我们可以将手部区域与其它部分分割开,阀值化之后,我们的二值图像看起来是这样的:

图5:经过阀值化处理之后的图像,手的外轮廓现在显现出来。

为了检测手的轮廓,我们调用 cv2.findContours函数,然后排序轮廓,找到其中最大的一个,我们假定这个就是手(行18-21)

在我们沿着轮廓找到极值点之前,必须理解一个轮廓就是一个简单的NumPy坐标数组。因此,我们可以利用Numpy函数,帮我们找到极点坐标。

# 沿着轮廓确定更多的极值点 extLeft = tuple(c[c[;,;,0].argmin()][0]) extRight = tuple(c[c[;,;,0].argmax()][0]) extTop = tuple(c[c[;,;,1].argmin()][0]) extBot = tuple(c[c[;,;,1].argmax()][0])

例如,在24行,使用方法argmin()在整个轮廓数组c中找到最小x坐标(即,“西”值)。

同样,在25行,使用argmin()函数在整个轮廓数组中找到最大x坐标(即,“东”值)。

在26和27行中通过同样的操作,仅仅是变为y坐标,让我们获取了“北”值和“南”值的坐标。

现在我们有了极值北,南,东和西的坐标,我们可以把它们画在image对象中。

#画出对象的外轮廓,然后画出极值点,左点使用红色,右点使用绿色,上点是蓝色,下点是兰绿色 cv2.drawContoure(image,[c],-1,(0,255,255),2) cv2.circle(image,rxtLeft,8,(0,0,255),-1) cv2.circle(image,extRight,8,(0,255,0),-1) cv2.circle(image,extTop,8,(255,0,0),-1) cv2.circle(image,extBot,8,(255,255,0),-1) #输出显示image cv2.imshow("Image",image) cv2.waitKey(0)

西:红色 东:绿色 北:蓝色 南:兰绿色

最后,39行和40行在我们的屏幕显示结果

执行这个脚本,确定通过这个位置下载代码和图片(使用在本教程下方找到的“下载”链接),导航到你的代码目录,然后执行下面的命令:

$ python extreme_points.py

你将看到下面这个输出的图像: 图6:通过OpenCV和Python检查轮廓中的极值点

正如你所看到的,我们沿着手部成功的标识出所有的极值点。西极值点用红色标识,北极值点用蓝色标识,东极值点用绿色标识,最后的南极值点用兰绿色标识。

下面我们将看到第二个沿手部标识极值点的示例

图7:使用OpenCV和Python沿手部轮廓标识极值点

让我们查看最后一个例子:

图8:我们再次精确计算出沿轮廓的极值点

而这一切就是这么简单!

只需记住,轮廓列表中通过cv2.findContoures方法返回的只是一个Numpy的(x,y)坐标数组。对这个数组调用argmin()和argmax()方法,我们可以提取极值坐标。

概要 在这片博客文章中,我详细的说明了如何沿着一个给定的轮廓寻找北,南,东和西极值点坐标,这个方法对于原始轮廓和转换后的边框都可以使用。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有