import cv2 as cv
import numpy as np

src = cv.imread("st_02.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)

# 图像二值化
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)

se = cv.getStructuringElement(cv.MORPH_RECT, (3, 3), (-1, -1))
binary = cv.morphologyEx(binary, cv.MORPH_OPEN, se)
cv.imshow("binary", binary)
cv.imwrite("binary.png", binary)

# 轮廓提取, 发现最大轮廓
out, contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

# 寻找最大面积轮廓
cnt_maxArea = sorted(contours, key=cv.contourArea)[0]

# 寻找最小外接矩形,返回最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
rect = cv.minAreaRect(cnt_maxArea)
print(rect[2])
print(rect[0])
# trick
height, width = rect[1]
print(rect[1])
box = cv.boxPoints(rect)
src_pts = np.int0(box)
print(src_pts)

dst_pts = []
dst_pts.append([width,height])
dst_pts.append([0, height])
dst_pts.append([0, 0])
dst_pts.append([width, 0])

# 透视变换
M, status = cv.findHomography(src_pts, np.array(dst_pts))  #原图到透视后的图的四个点的转换矩阵
result = cv.warpPerspective(src, M, (np.int32(width), np.int32(height)))

if height < width:
    result = cv.rotate(result, cv.ROTATE_90_CLOCKWISE)

cv.imshow("result", result)
cv.imwrite("result.png", result)

cv.waitKey(0)
cv.destroyAllWindows()