介绍
使用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 ()
上面是找到一个正方形的轮廓、下面看如何找到不规则的多边形轮廓:
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怎么实现轮廓检测