角点
P1 [0] (255, 000, 000)
P2 [1] (000, 255, 000)
P3 [2] (000, 000, 255)
P4 [3] (000, 000, 000)
垂直矩形框
rect = cv2.minAreaRect(cnt)targetColor = roi_colortargetThickness = 1targetColor = (255, 255, 255)if lineVerbose:if True:cv2.line(photo, (x, y), (x+w//4, y), targetColor, targetThickness)cv2.line(photo, (x, y), (x, y+h//4), targetColor, targetThickness)cv2.line(photo, (x+3*w//4, y), (x+w, y), targetColor, targetThickness)cv2.line(photo, (x+w, y), (x+w, y+h//4), targetColor, targetThickness)cv2.line(photo, (x, y+h), (x+w//4, y+h), targetColor, targetThickness)cv2.line(photo, (x, y+h), (x, y+3*h//4), targetColor, targetThickness)cv2.line(photo, (x+w, y+h), (x+3*w//4, y+h), targetColor, targetThickness)cv2.line(photo, (x+w, y+h), (x+w, y+3*h//4), targetColor, targetThickness)crossLength = 15cv2.line(photo, (x+w//2-crossLength, y+h//2), (x+w//2+crossLength, y+h//2), targetColor, targetThickness)cv2.line(photo, (x+w//2, y+h//2-crossLength), (x+w//2, y+h//2+crossLength), targetColor, targetThickness)
倾斜矩形框
def lineByAngle(photo, p1, p2, length, color, thickness):slope = 0 + (p2[1] - p1[1]) / (p2[0] - p1[0])theta = np.arctan(slope)degree = int(theta * 57.29577) % 360length = getDistance(p1, p2) // 4if (p2[0] < p1[0]):pp = (int(p1[0] - length * np.cos(theta)),int(p1[1] - length * np.sin(theta)))else:pp = (int(p1[0] + length * np.cos(theta)),int(p1[1] + length * np.sin(theta)))cv2.line(photo, p1, pp, color, thickness)
几何关键点
if True:cv2.circle(photo, p1, 1, roi_red, 5)cv2.circle(photo, p2, 1, roi_red, 5)cv2.circle(photo, p3, 1, roi_red, 5)cv2.circle(photo, p4, 1, roi_red, 5)center = (int((p1[0] + p3[0]) / 2), int((p2[1] + p4[1]) / 2))cv2.circle(photo, center, 1, roi_green, 5)
def slopeAngle(p1, p2):slope = (p2[1] - p1[1]) / (p2[0] - p1[0])theta = np.arctan(slope)degree = int(theta * 57.29577) % 360return thetadef lineByPoint(photo, pp, theta, length, color, thickness):if True:p1 = (int(pp[0] - length * math.cos(theta)),int(pp[1] - length * math.sin(theta)))
center = (int((p1[0] + p3[0]) / 2), int((p2[1] + p4[1]) / 2))if not True:cv2.circle(photo, p1, 1, roi_blue, 5)cv2.circle(photo, p2, 1, roi_green, 5)cv2.circle(photo, p3, 1, roi_red, 5)cv2.circle(photo, p4, 1, roi_black, 5)cv2.circle(photo, center, 1, roi_green, 5)if True:crossLength = 15theta = slopeAngle(p1, p2)lineByPoint(photo, center, theta, crossLength, targetColor, targetThickness)theta = slopeAngle(p2, p3)lineByPoint(photo, center, theta, crossLength, targetColor, targetThickness)
Automatic Mask
if True:matrix = np.array(cnt)for i in range(len(matrix)):matrix[i][0][0] = matrix[i][0][0] - xmatrix[i][0][1] = matrix[i][0][1] - ymask = np.zeros(characteristic.shape[:2], dtype=np.uint8)mask = cv2.fillPoly(mask, [matrix], 255)cv2.imshow('Mask', mask)image = cv2.bitwise_and(characteristic, characteristic, mask = mask)image = stretch(image)cv2.imshow('Masked', image)