- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
-
- img = cv.imread("../SampleImages/stars.png")
- plt.imshow(img[:,:,::-1])
-
- img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
- #通过cv.threshold转换为二值图
- ret,thresh = cv.threshold(img_gray, 127, 255, 0)
- plt.imshow(thresh, cmap=plt.cm.gray)
-
- #轮廓检测
- contours,hierarchy = cv.findContours(thresh, 1, 2)
- #绘制轮廓
- img_contours_org = img.copy()
- img_contours_org = cv.drawContours(img_contours_org, contours, -1, (0,255,0), 2)
- plt.imshow(img_contours_org[:,:,::-1])
-
- img_rect_contour = img.copy()
- for contour in contours:
- #1. 绘制直边界矩形
- #x,y,w,h = cv.boundingRect(contour)
- #contour: 轮廓信息
- #x,y,w,h: 矩形左上角(x,y)坐标,以及矩形的宽度和高度
- #参考资料:https://blog.csdn.net/hjxu2016/article/details/77833984
- x,y,w,h = cv.boundingRect(contour)
- img_rect_contour = cv.rectangle(img_rect_contour, (x,y), (x+w,y+h), (0,255,0), 2)
- #2. 绘制旋边界矩形结果
- #rect = cv.minAreaRect(contour)
- #contour:轮廓信息
- #rect: 最小外接矩阵的信息(中心(x,y),(w,h),旋转角度)
- #参考资料:https://blog.csdn.net/lanyuelvyun/article/details/76614872
- rect = cv.minAreaRect(contour)
- #使用boxPoints获得最小外接矩阵的4个顶点坐标
- box = cv.boxPoints(rect)
- #转换为int类型
- box = np.intp(box)
- #使用cv.polylines绘制外接矩形
- cv.polylines(img_rect_contour, [box], True, (0,0,255), 2)
-
- plt.imshow(img_rect_contour[:,:,::-1])