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

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用OpenCV寻找轮廓的中心?相关的知识,希望对你有一定的参考价值。

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

关键词 OpenCVcontours中心点

寻找轮廓的中心 目 录
Contents
形状检测和分析 利用OpenCV寻
找边界中心点
总 结

 

§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寻找轮廓的中心?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV寻找复杂背景下物体的轮廓

opencv实战——复杂背景下寻找物体轮廓(底帽)

求C++中利用opencv计算轮廓图像傅里叶描述子的代码

计算机视觉OpenCV篇 - 轮廓(寻找/绘制轮廓)

OpenCV+python轮廓

youcans 的 OpenCV 例程200篇194.寻找图像轮廓(cv.findContours)