OpenCV获取边界框,最小矩形区域和最小闭圆的轮廓

import cv2
import numpy as np

#边界框,最小矩形区域和最小闭圆的轮廓
'''cv2.pyrUp()和cv2.pyrDown()用于构建图像金字塔
    一般情况下,我们要处理是一副具有固定分辨率的图像,但是有些情况下,
需要对同一图像的不同分辨率的子图像进行处理。
比如,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小,
这种情况下,我们需要创建创建一组图像,这些图像是具有不同分辨率的原始图像。
我们把这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集合)。
如果我们把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。 
  有两类图像金字塔:高斯金字塔和拉普拉斯金字塔。 
  高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的,顶部图像中的每个像素值
等于下一层图像中 5 个像素的高斯加权平均值。这样操作一次一个 MxN 的图像就变成了一个 M/2xN/2
 的图像。所以这幅图像的面积就变为原来图像面积的四分之一,这被称为 Octave。
 连续进行这样的操作我们就会得到一个分辨率不断下降的图像金字塔。使用函数  
  函数 cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金字塔(尺寸变小,分辨率降低)
    函数 cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会)'''
img = cv2.pyrDown(cv2.imread("img6.jpg", cv2.IMREAD_UNCHANGED))

'''cv2.threshold()函数功能是像素高于阈值时,给像素赋予新值。此处对于像素值高于127的,赋值255.
该功能用于去噪。'''
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY),
                            200, 255, cv2.THRESH_BINARY)

#findContour用于找到不规则形状的轮廓
image, contours, hier = cv2.findContours(thresh,
                                         cv2.RETR_EXTERNAL,
                                         cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    #计算一个简单的边界框
    x,y,w,h = cv2.boundingRect(contour)
    #画出边界框
    cv2.rectangle(img, (x,y), (x+w, y+h),(0,0,255),2)
    #计算包围目标的最小矩形区域
    rect = cv2.minAreaRect(contour)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(img, [box], 0, (255,0,255), 2)
    #cv2.minEnclosingCircle函数返回一个二元组,第一个元组为圆心坐标,第二个为半径
    (x0,y0), radius = cv2.minEnclosingCircle(contour)
    center = (int(x0), int(y0))
    radius = int(radius)
    img = cv2.circle(img, center, radius, (0,255,255))

cv2.drawContours(img, contours, -1, (255,0,0), 1)
cv2.imshow("findcontour",img)
cv2.waitKey()
cv2.destroyAllWindows()
使用cv2.threshold()函数进行二值化处理。
使用cv2.findContours()函数检测轮廓。
使用cv2.boundingRect()函数获得边界框。
使用cv2.rectangle()函数绘制边界框。
使用cv2.minAreaRect()函数获得最小矩形区域。
使用cv2.drawContours()函数绘制最小矩形区域。
使用cv2.minEnclosingCircle()函数获得最小闭圆。
使用cv2.circle()函数绘制最小闭圆。

你可能感兴趣的:(openCV)