【笔记】OpenCV3 图形处理-轮廓检测-边界框、最小矩形与闭圆(五)

接着折腾 轮廓检测。。

cv2.findContours函数可以找到图像中不规则的、歪斜的及旋转的形状。对这些找到的图形研究一下。。

我们在在返回的轮廓数据中,要用矩形框、最小的矩形框、最小的封闭圆标识出来,这对图形研究比较重要

 

img = cv2.imread('img/guo.jpg',cv2.IMREAD_UNCHANGED)
imgD = cv2.pyrDown(img)
cv2.imshow('dowD', imgD)

ret, thresh = cv2.threshold(cv2.cvtColor(imgD.copy(),cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_OTSU)
contours, hier = cv2.findContours(thresh,cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
for c in contours:
    # 用绿色矩形框将找到的轮廓数据框起来
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(imgD, (x,y),(x+w,y+h),(0,255,0), 2)

    # 用红色显示包围的最小矩形框
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(imgD, [box], 0 ,(0,0,255),3)

    #用绿色显示最小圆
    (x,y),radius = cv2.minEnclosingCircle(c)
    # print(x,y,radius)
    center = (int(x), int(y))
    radius = int(radius)
    # print(x, y, radius)
    cv2.circle(imgD,center,radius,(0,255,0), 2)

#蓝色边框 标识所有轮廓  不规则的边框
cv2.drawContours(imgD,contours, -1, (255,0,0), 2)

cv2.imshow('imgd',imgD)

蓝色不规则边框 标记所有边框、红色矩形标识最小矩形框,绿色圆标识最小闭合的圆

【笔记】OpenCV3 图形处理-轮廓检测-边界框、最小矩形与闭圆(五)_第1张图片

 

其中,用到了:

  • cv2.boundingRect  用最小的矩形框将图形包围起来,不旋转,返回:左下角坐标、矩形的长宽
  • cv2.minAreaRect  返回最小外接矩形,返回的数据:中心点坐标、长宽、旋转角度

通过cv2.boxPoints,将数据转换为4个顶点的坐标

4个顶点的一组坐标表示的轮廓,直接放到一个数组里,传递个绘制轮廓的函数cv2.drawContours来绘制

  • cv2.minEnclosingCircle 返回轮廓的最小包围圆,返回的数据:中心点坐标、圆的半径

 

在返回的结果中,发现小的轮廓点比较多,可以通过计算面积 cv2.contourArea,去除一部分点

for c in contours:

    area = cv2.contourArea(c)
    if area< 100:
        continue

苹果上的反光点的轮廓数据去除了

【笔记】OpenCV3 图形处理-轮廓检测-边界框、最小矩形与闭圆(五)_第2张图片

 

只绘制大面积的轮廓,去掉小点

for c in contours:

    area = cv2.contourArea(c)
    if area< 50:
        continue

    cv2.drawContours(imgD, c, -1, (255, 0, 0), 2)

有一些小小的误差  总体效果感觉还挺浪。。。。

【笔记】OpenCV3 图形处理-轮廓检测-边界框、最小矩形与闭圆(五)_第3张图片

 


  • 图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低

OpenCV实现了用于创建图像金字塔的两个函数:下采样pyrDown()和上采样pryUp()

  1. pyrDown():隔行隔列删去图像中的对应行和列
  2. pryUp():将图像在每个方向放大为原来的两倍,新增的行和列用0填充

 

img = cv2.imread('img/boxdemo.jpg',cv2.IMREAD_UNCHANGED)
cv2.imshow('dow', img)
imgD = cv2.pyrDown(img)
cv2.imshow('dowD', imgD)
imgU = cv2.pyrUp(img)
cv2.imshow('dowU', imgU)

【笔记】OpenCV3 图形处理-轮廓检测-边界框、最小矩形与闭圆(五)_第4张图片

你可能感兴趣的:(学习笔记,OpenCV)