如何利用OpenCV寻找轮廓的中心?

网友投稿 1019 2022-05-29

简 介:

本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。

关键词:

OpenCV,contours,中心点

寻找轮廓的中心

目 录

Contents

形状检测和分析

利用OpenCV寻

找边界中心点

总 结

寻找轮廓的中心

目 录

Contents

形状检测和分析

利用OpenCV寻

找边界中心点

总 结

天在图像处理中需要用到OpenCV的轮廓中心,在 OpenCV center of contour 中看到了给定的方法。将其总结如下,便于以后的应用。

1.1 形状检测和分析

今天我们开启一个新的三联示例程序,用于形状检测和分析。通过这个系列,我们可以:

1. 计算边界、形状的中心点;

2. 识别不同的形状,比如圆形、方形,举行,三角形,五边形。这些仅仅根据边界的性质就可以进行识别;

3. 标示形状的颜色。

相比于PyImageSearch网文来说,这个话题比较基础,但是为了回应下面我所遇到的提问:

我如何能够使用Python和OpenCV计算边界的中心点?

今天的博文中,我将回答上面的问题。

在这个系列的上一篇博文中,我们基于已经知晓了物体的边界然后来识别图像中的形状。

1.2 利用OpenCV寻找边界中心点

在上面的图像中,你可以看到一系列从建筑纸张材料切割下来的不同形状,也注意到他们并不是完美的多边形,也就是长方形并不是严格的长方形,圆形也不是那么的圆。毕竟它们是人徒手绘制出并切割下来的形状,所以包含了不同的变形。

记住这一点,今天的教程的目的是:

检测图片中各种形状的外轮廓;

接着计算所有形状的中心点,也称为区域的中心;

为了实现这个目标,我们需要进行一些图像处理,包括:

将图片转换成灰度图;

进行模糊化来提高轮廓检测精度;

将图像进行二值化;采用经典的边缘检测和阈值处理完成二值化。这里采用阈值处理的方式。

在开始正式编程之前,你需要先保证在你的系统中已经安装了 imutils Python Packages :

pip install --upgrade imutils

1

现在我们可以开始编程了。

建立一个新的文件,命名为: 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]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

2 - 4 行为输入相应的软件包,接着对于命令行参数进行分析。 我们只需要单开关量 ---image ,这是给出我们需要处理的图片在磁盘上的路径。

我们将该图像从磁盘上载入到及其内存,使用灰度转换进行预处理。采用5×5尺寸的高斯核完成图像平滑,最后进行阈值处理。

输出的图像如下图所示:

可以注意到,经过阈值处理,各类形状为白色,背景为黑色。

下一步就是找到这些区域的边缘:

# find contours in the thresholded image cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts)

1

2

3

4

在程序中的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)

1

2

3

4

5

6

7

8

9

10

11

如何利用OpenCV寻找轮廓的中心?

12

13

14

程序行 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

1

下面是显示的运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBoGbgBA-1643421016158)(https://pyimagesearch.com/wp-content/uploads/2016/01/center_of_contour_results.gif#pic_center =560x )]

你可以看到每一个形状都被正确的检测到。

文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。

■ 相关文献链接:

OpenCV center of contour

imutils Python Packages

这个链接

image moments

● 相关图表链接:

图1.1.1 下面将要使用到的具有很多不同颜色形状的图片

图1.2.2 将图片进行阈值处理输出二值化的图片,这类形状为白色,背景为黑色

OpenCV Python

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【云小课】应用平台第6课 命令行管理Kafka的Topic,方便又实用
下一篇:c++开发环境构建(一)——编译器选择
相关文章