import cv2 # python 做一个全能扫描王.
import numpy as np
img = cv2.imread('1.png')
h=640
w=480
img = cv2.resize(img, (480, 640))[...,::-1]# RESIZE IMAGE
img_blur = cv2.GaussianBlur(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY), (5, 5), 1)# 添加高斯模糊
img_edges = cv2.Canny(img_blur, 100, 200)# 寻找边缘
# 先膨胀后腐蚀的操作,去除图像中的黑点.
kernel = np.ones((5, 5))
img_dilate = cv2.dilate(img_edges, kernel, iterations=2)# 膨胀
img_erode = cv2.erode(img_dilate, kernel, iterations=1) # 腐蚀
img_counter = img.copy() # 拷贝图片
contours, hierarchy = cv2.findContours(img_erode, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 寻找轮廓
def biggestContour( contours):
biggest = np.array([])
max_area = 0
for i in contours:
area = cv2.contourArea(i) # 计算轮廓的面积
if area > 5000: # 如果面积大于5000
peri = cv2.arcLength(i, True) # 计算轮廓的周长
approx = cv2.approxPolyDP(i, 0.02 * peri, True) # 角点检测
if area > max_area and len(approx) == 4: # 如果逼近的多边形为矩形,且面积最大
biggest = approx # 数值点
max_area = area
return biggest, max_area
biggest, max_area = biggestContour(contours)
if biggest.size != 0:
biggest = biggest.reshape((4, 2))
cv2.drawContours(img_counter, [biggest], -1, (255, 0, 0), 10)
cv2.imwrite('counter.png', img_counter)
# img_counter = drawRectangle(img_counter, biggest) # 在图片上画出矩形框
points1 = np.float32(biggest)# 将坐标点转化为浮点数
# reorder points
f1=[0,0]
f2=[w,0]
f3=[0,h]
f4=[w,h]
juli=999999
b1=[0,0]
for i in points1:
if np.linalg.norm(i-f1)<juli:
b1=i
juli=np.linalg.norm(i-f1)
juli=999999
b2=[0,0]
for i in points1:
if np.linalg.norm(i-f2)<juli:
b2=i
juli=np.linalg.norm(i-f2)
juli=999999
b3=[0,0]
for i in points1:
if np.linalg.norm(i-f3)<juli:
b3=i
juli=np.linalg.norm(i-f3)
juli=999999
b4=[0,0]
for i in points1:
if np.linalg.norm(i-f4)<juli:
b4=i
juli=np.linalg.norm(i-f4)
points1=np.array([b1,b2,b3,b4])
points2 = np.float32([[0, 0], [480, 0], [0, 640], [480, 640]])# 图像为(480,640)的上下左右有四个坐标
matrix = cv2.getPerspectiveTransform(points1, points2) # 生成变换矩阵
img_warpcolor = cv2.warpPerspective(img, matrix, (480, 640)) # 利用进行透视变换
cv2.imwrite('warp.png', img_warpcolor)
else:
print('未找到矩形')
![1]()
![counter]()
![warp]()