opencv 简单轮廓绘制、外接矩形、外接旋转矩形、外接圆、轮廓近似,可倾斜,非矩形、凸包、4极点检测、

import cv2
import numpy as np

def cv_show(neme, img):
    cv2.imshow(neme, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


# 图像轮廓
img = cv2.imread('1.png')
# 灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 轮廓查询
# cv2.findContours 只接受二值化后的图像
# 所有轮廓、外轮廓、内外轮廓、所有轮廓 爷、父、儿、孙
print(cv2.RETR_LIST, cv2.RETR_EXTERNAL, cv2.RETR_CCOMP, cv2.RETR_TREE)
#  cv2.CHAIN_APPROX_NONE,如果是一条直线, 它会取所有端点
#  cv2.CHAIN_APPROX_SIMPLE 如果是一条直线, 它只取两个端点
# 根据版本,返回的参数有可能是3个
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 精准绘制轮廓(需要绘制的图像,轮廓,-1是所有轮廓或者第几个,颜色通道蓝绿红,粗细)
sd = cv2.drawContours(img, contours, -1, (0, 0, 255), 3)
cv_show('sd', sd)

# 第几个轮廓
cnt = contours[0]
# 用于显示
# 获取4点
x, y, w, h = cv2.boundingRect(cnt)
# 轮廓外接矩形 正矩形,不可倾斜
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)
cv_show('sad', img)

# 旋转最小外接矩形
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)  # 对box进行处理 这一步一定要进行
# 精准绘制轮廓
cv2.drawContours(img, [box], -1, (0, 255, 0), 1)
cv_show("s", img)


# 轮廓外接圆
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
img = cv2.circle(img, center, radius, (0, 0, 255), 1)
cv_show('sad', img)

# 轮廓近似,可倾斜,非矩形
epsilon = 0.1 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
# 绘制多边形
cv2.polylines(img, [approx], True, (0, 255, 255), 2)
cv_show('sad', img)

# 绘制凸包
hull = cv2.convexHull(cnt)
# 绘制多边形
i = cv2.polylines(img, [hull], True, (255, 255, 0), 2)
cv_show("s", img)


# 4个极点检测
leftmost = tuple(cnt[cnt[:, :, 0].argmin()][0])
rightmost = tuple(cnt[cnt[:, :, 0].argmax()][0])
topmost = tuple(cnt[cnt[:, :, 1].argmin()][0])
bottommost = tuple(cnt[cnt[:, :, 1].argmax()][0])
# 画线 参数:图像、坐标1、坐标2、颜色(蓝B,绿G,红R)、粗细
# 思想:起点和终点如果是一样的,那就是点
cv2.line(img, leftmost, leftmost, (255, 0, 0), 5)
cv2.line(img, rightmost, rightmost, (255, 0, 0), 5)
cv2.line(img, topmost, topmost, (255, 0, 0), 5)
cv2.line(img, bottommost, bottommost, (255, 0, 0), 5)
cv_show("s", img)


# 找圆中心点的位置、长短轴长度、中心旋转的角度

# 其中 cnt 代表了一组轮廓点,一般常采用cv2.findContours()函数所返回的轮廓点(也就是一组点集)
# 返回值:ellipse = [ (x, y) , (a, b), angle ]
# (x, y)代表椭圆中心点的位置
# (a, b)代表长短轴长度,应注意a、b为长短轴的直径,而非半径
# angle 代表了中心旋转的角度

(x, y), (MA, ma), angle = cv2.fitEllipse(cnt)
print(x, y, MA, ma, angle)

你可能感兴趣的:(opencv-python,opencv,计算机视觉,人工智能)