如何利用OpenCV寻找轮廓的中心?
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用OpenCV寻找轮廓的中心?相关的知识,希望对你有一定的参考价值。
简 介: 本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。
关键词
: OpenCV,contours,中心点
§01 寻找轮廓的中心
今天在图像处理中需要用到OpenCV的轮廓中心,在 OpenCV center of contour 中看到了给定的方法。将其总结如下,便于以后的应用。
1.1 形状检测和分析
今天我们开启一个新的三联示例程序,用于形状检测和分析。通过这个系列,我们可以:
1. 计算边界、形状的中心点;
2. 识别不同的形状,比如圆形、方形,举行,三角形,五边形。这些仅仅根据边界的性质就可以进行识别;
3. 标示形状的颜色。
相比于PyImageSearch网文来说,这个话题比较基础,但是为了回应下面我所遇到的提问:
我如何能够使用Python和OpenCV计算边界的中心点?
今天的博文中,我将回答上面的问题。
在这个系列的上一篇博文中,我们基于已经知晓了物体的边界然后来识别图像中的形状。
1.2 利用OpenCV寻找边界中心点
▲ 图1.1.1 下面将要使用到的具有很多不同颜色形状的图片
在上面的图像中,你可以看到一系列从建筑纸张材料切割下来的不同形状,也注意到他们并不是完美的多边形,也就是长方形并不是严格的长方形,圆形也不是那么的圆。毕竟它们是人徒手绘制出并切割下来的形状,所以包含了不同的变形。
记住这一点,今天的教程的目的是:
- 检测图片中各种形状的外轮廓;
- 接着计算所有形状的中心点,也称为区域的中心;
为了实现这个目标,我们需要进行一些图像处理,包括:
- 将图片转换成灰度图;
- 进行模糊化来提高轮廓检测精度;
- 将图像进行二值化;采用经典的边缘检测和阈值处理完成二值化。这里采用阈值处理的方式。
在开始正式编程之前,你需要先保证在你的系统中已经安装了 imutils Python Packages :
pip install --upgrade imutils
现在我们可以开始编程了。
建立一个新的文件,命名为: center_of_shape.py,下面是相应的代码:
# import the necessary packages
import argparse
import imutils
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to the input image")
args = vars(ap.parse_args())
# load the image, convert it to grayscale, blur it slightly,
# and threshold it
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]
2 - 4 行为输入相应的软件包,接着对于命令行参数进行分析。 我们只需要单开关量 ---image
,这是给出我们需要处理的图片在磁盘上的路径。
我们将该图像从磁盘上载入到及其内存,使用灰度转换进行预处理。采用5×5尺寸的高斯核完成图像平滑,最后进行阈值处理。
输出的图像如下图所示:
▲ 图1.2.2 将图片进行阈值处理输出二值化的图片,这类形状为白色,背景为黑色
可以注意到,经过阈值处理,各类形状为白色,背景为黑色。
下一步就是找到这些区域的边缘:
# find contours in the thresholded image
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
在程序中的20 - 21 行,调用 cv2.findContours
返回形状的轮廓,对应的图片中白色大块区域的边缘。 根据所使用的OpenCV的版本不同, 2.4.3,2.3.4 行22 使用恰当的元组参数。你可以在 这个链接 看到关于不同OpenCV版本在 cv2.findContours 函数返回的不同参数。
下面我们开始处理每一个轮廓:
# loop over the contours
for c in cnts:
# compute the center of the contour
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# draw the contour and center of the shape on the image
cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1)
cv2.putText(image, "center", (cX - 20, cY - 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
# show the image
cv2.imshow("Image", image)
cv2.waitKey(0)
程序行 25 是开始一个循环来处理每一个单个轮廓,紧接着 程序行27 计算他们的图像矩( image moments )。
在计算机视觉和图像处理中,图像矩表征了图像中物体的形状。这些矩给出了 形状的基本统计特征,包括物体的面积,中心(也就是物体中心 ( x , y ) \\left( x,y \\right) (x,y) 的坐标位置),方向以及其他的一些可能用到的特性。
这里我们只对轮廓的中心感兴趣,通过程序行 28 - 29 我们计算获得轮廓的中心点。
从程序行 32-34 进行如下的处理:
- 通过使用
cv2.drawContours
在当前形状周围绘制轮廓; - 在形状中心
(cX, cY)
绘制白色圆圈; - 在白色圆圈附近输出字符
text
。
在计算机命令窗口使用下面的命令运行上述Python程序:
$ python center_of_shape.py --image shapes_and_colors.png
下面是显示的运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBoGbgBA-1643421016158)(https://pyimagesearch.com/wp-content/uploads/2016/01/center_of_contour_results.gif#pic_center =560x )]
▲ 图1.2.3 处理结果
你可以看到每一个形状都被正确的检测到。
※ 总 结 ※
本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。
■ 相关文献链接:
● 相关图表链接:
以上是关于如何利用OpenCV寻找轮廓的中心?的主要内容,如果未能解决你的问题,请参考以下文章