使用OpenCV怎么实现轮廓检测

  介绍

使用OpenCV怎么实现轮廓检测?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>轮廓概述

<李>

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用只

<李>

为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者精明的边界检测只

<李>

查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他变量中只

<李>

在OpenCV中,查找轮廓就像在黑色背景中超白色物体,要找的物体应该是白色而背景应该是黑色。

<强>轮廓检测的作用:

1。可以检测图图像或者视频中物体的轮廓
2。计算多边形边界,形状逼近和计算感兴趣区域

先看一个较为简单的轮廓检测:

import  cv2   import  numpy  as  np   #,创建一个200 * 200的黑色空白图像   时间=img  np.zeros ((200,, 200), dtype=np.uint8)   #,利用numpy数组在切片上赋值的功能放置一个白色方块   img [50:150, 50:150],=255      #,对图像进行二值化操作   #,阈值(src,打,,maxval,,,, dst=没有)   #,src是输入数组,打是阈值的具体值,maxval是类型取THRESH_BINARY或者THRESH_BINARY_INV时的最大值   #,类型有5种类型,这里取0:THRESH_BINARY ,当前点值大于阈值时,取maxval,也就是前一个参数,否则设为0   #,该函数第一个返回值是阈值的值,第二个是阈值化后的图像   ret, thresh =, cv2.threshold (img,, 127,, 255,, 0)      #,findContours()有三个参数:输入图像,层次类型和轮廓逼近方法   #,该函数会修改原图像,建议使用img.copy()作为输入   #,由函数返回的层次树很重要,cv2.RETR_TREE会得到图像中轮廓的整体层次结构,以此来建立轮廓之间的“关系& # 39;。   #,如果只想得到最外面的轮廓,可以使用cv2.RETE_EXTERNAL。这样可以消除轮廓中其他的轮廓,也就是最大的集合   #,该函数有三个返回值:修改后的图像,图像的轮廓,它们的层次   形象,轮廓,hierarchy =, cv2.findContours(打,cv2.RETR_TREE,, cv2.CHAIN_APPROX_SIMPLE)      时间=color  cv2.cvtColor (img, cv2.COLOR_GRAY2BGR)   时间=img  cv2.drawContours(颜色,轮廓,,1,,(0,,255,,0),,2)   cv2.imshow (“contours",,颜色)   cv2.waitKey ()   cv2.destroyAllWindows ()

使用OpenCV怎么实现轮廓检测

上面是找到一个正方形的轮廓、下面看如何找到不规则的多边形轮廓:

import  cv2   import  numpy  as  np      #,pyrDown (): brief  Blurs  an  image 以及downsamples 它。   #,将图像高斯平滑,然后进行降采样   时间=img  cv2.pyrDown (cv2.imread (“hammer.jpg",, cv2.IMREAD_UNCHANGED))   #,依然是二值化操作   ret, thresh =, cv2.threshold (cv2.cvtColor (img.copy (),, cv2.COLOR_BGR2GRAY),, 127,, 255,, cv2.THRESH_BINARY)   #,计算图像的轮廓   形象,轮廓,hier =, cv2.findContours(打,cv2.RETR_EXTERNAL,, cv2.CHAIN_APPROX_SIMPLE)      for  c 轮廓拷贝:   #,才能find  bounding  box 坐标   #,才能先计算出一个简单的边界狂,也就是一个矩形啦   #才能,就是将轮廓信息转换为(x, y)坐标,并加上矩形的高度和宽度   ,,x,, y,, w, h =, cv2.boundingRect (c)   #,才能画出该矩形   cv2.rectangle才能(img, (x, y),(时间+ x  w, y  +, h),, (0,, 255,, 0),, 2)      #,才能find  minimum 区域   #才能,然后计算包围目标的最小矩形区域   #才能,这里先计算出最小矩形区域,然后计算区域的顶点,此时顶点坐标是浮点型,但是像素坐标是整数   #才能,需要将浮点型转换成矩形   时间=rect 才能;cv2.minAreaRect (c)   时间=box 才能;cv2.boxPoints(矩形)   时间=box 才能;np.int0(盒)   #,才能draw 轮廓   #,才能画出最小矩形   #,才能drawContours()也会修改源图像   #才能,第二个参数保存轮廓的数组,也就是保存着很多轮廓   #才能,第三个参数是要绘制的轮廓数组的索引:1是绘制所有的轮廓,否则只绘制(箱)中指定的轮廓   #才能,颜色和厚度(密度,就是粗细)放在最后两个参数   cv2.drawContours才能(img,(箱),0,,(0,0,255),,3)      #,才能calculate  center 以及radius  of  minimum  enclosing 循环   #,才能最后检查的边界轮廓为最小闭圆   #,才能minEnclosingCircle()会返回一个二元数组,第一个是圆心坐标组成的元祖,第二个元素是元的半径   ,,(x, y), radius =, cv2.minEnclosingCircle (c)   #,才能cast 用整数   center 才能=,(int (x), int (y))   radius 才能=,int(半径)   #,才能draw 从而循环   img 才能=,cv2.circle (img,中心,半径,,(255,0,0),,3)      #,绘制轮廓   cv2.drawContours (img,轮廓,,1,,(255,0,0),,1)   cv2.imshow (“contours", img)      cv2.waitKey ()   cv2.destroyAllWindows ()

使用OpenCV怎么实现轮廓检测