在利用python进行图片矫正时,所写的代码,但返回值一直出错,能看看怎么改吗?
出错
import cv2
import math
import numpy as np
def Img_Outline(input_dir):
original_img = cv2.imread(input_dir)
gray_img = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray_img, (9, 9), 0) # 高斯模糊去噪(设定卷积核大小影响效果)
_, RedThresh = cv2.threshold(blurred, 165, 255, cv2.THRESH_BINARY) # 设定阈值165(阈值影响开闭运算效果)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 定义矩形结构元素
closed = cv2.morphologyEx(RedThresh, cv2.MORPH_CLOSE, kernel) # 闭运算(链接块)
opened = cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel) # 开运算(去噪点)
return original_img, gray_img, RedThresh, closed, opened
def findContours_img(original_img, opened):
image, contours, hierarchy = cv2.findContours(opened, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(contours, key=cv2.contourArea, reverse=True)[1] # 计算最大轮廓的旋转包围盒
rect = cv2.minAreaRect(c) # 获取包围盒(中心点,宽高,旋转角度)
box = np.int0(cv2.boxPoints(rect)) # box
draw_img = cv2.drawContours(original_img.copy(), [box], -1, (0, 0, 255), 3)
print("box[0]:", box[0])
print("box[1]:", box[1])
print("box[2]:", box[2])
print("box[3]:", box[3])
return box,draw_img
def Perspective_transform(box,original_img):
# 获取画框宽高(x=orignal_W,y=orignal_H)
orignal_W = math.ceil(np.sqrt((box[3][1] - box[2][1])**2 + (box[3][0] - box[2][0])**2))
orignal_H= math.ceil(np.sqrt((box[3][1] - box[0][1])**2 + (box[3][0] - box[0][0])**2))
# 原图中的四个顶点,与变换矩阵
pts1 = np.float32([box[0], box[1], box[2], box[3]])
pts2 = np.float32([[int(orignal_W+1),int(orignal_H+1)], [0, int(orignal_H+1)], [0, 0], [int(orignal_W+1), 0]])
# 生成透视变换矩阵;进行透视变换
M = cv2.getPerspectiveTransform(pts1, pts2)
result_img = cv2.warpPerspective(original_img, M, (int(orignal_W+3),int(orignal_H+1)))
return result_img
if __name__=="__main__":
input_dir = "qingxie2.jpg"
original_img, gray_img, RedThresh, closed, opened = Img_Outline(input_dir)
box, draw_img = findContours_img(original_img,opened)
result_img = Perspective_transform(box,original_img)
cv2.imshow("original", original_img)
cv2.imshow("gray", gray_img)
cv2.imshow("closed", closed)
cv2.imshow("opened", opened)
cv2.imshow("draw_img", draw_img)
cv2.imshow("result_img", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import math
import numpy as np
def Img_Outline(input_dir):
original_img = cv2.imread(input_dir)
gray_img = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray_img, (9, 9), 0) # 高斯模糊去噪(设定卷积核大小影响效果)
_, RedThresh = cv2.threshold(blurred, 165, 255, cv2.THRESH_BINARY) # 设定阈值165(阈值影响开闭运算效果)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 定义矩形结构元素
closed = cv2.morphologyEx(RedThresh, cv2.MORPH_CLOSE, kernel) # 闭运算(链接块)
opened = cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel) # 开运算(去噪点)
return (original_img, gray_img, RedThresh), closed, opened
def findContours_img(original_img, opened):
image, contours, hierarchy = cv2.findContours(opened, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(contours, key=cv2.contourArea, reverse=True)[1] # 计算最大轮廓的旋转包围盒
rect = cv2.minAreaRect(c) # 获取包围盒(中心点,宽高,旋转角度)
box = np.int0(cv2.boxPoints(rect)) # box
draw_img = cv2.drawContours(original_img.copy(), [box], -1, (0, 0, 255), 3)
print("box[0]:", box[0])
print("box[1]:", box[1])
print("box[2]:", box[2])
print("box[3]:", box[3])
return box, draw_img
def Perspective_transform(box, original_img):
# 获取画框宽高(x=orignal_W,y=orignal_H)
orignal_W = math.ceil(
np.sqrt((box[3][1] - box[2][1])**2 + (box[3][0] - box[2][0])**2))
orignal_H = math.ceil(
np.sqrt((box[3][1] - box[0][1])**2 + (box[3][0] - box[0][0])**2))
# 原图中的四个顶点,与变换矩阵
pts1 = np.float32([box[0], box[1], box[2], box[3]])
pts2 = np.float32([[int(orignal_W+1), int(orignal_H+1)], [0, int(orignal_H+1)], [
0, 0], [int(orignal_W+1), 0]])
# 生成透视变换矩阵;进行透视变换
M = cv2.getPerspectiveTransform(pts1, pts2)
result_img = cv2.warpPerspective(
original_img, M, (int(orignal_W+3), int(orignal_H+1)))
return result_img
if __name__ == "__main__":
input_dir = "qingxie2.jpg"
# 修改此处返回值
(original_img, gray_img, RedThresh), closed, opened = Img_Outline(input_dir)
box, draw_img = findContours_img(original_img, opened)
result_img = Perspective_transform(box, original_img)
cv2.imshow("original", original_img)
cv2.imshow("gray", gray_img)
cv2.imshow("closed", closed)
cv2.imshow("opened", opened)
cv2.imshow("draw_img", draw_img)
cv2.imshow("result_img", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
修改完之后的代码,有用采纳下,谢谢
按下键盘中的‘PRTSC’或者‘Print Screen’键,即可实现全屏截图(不同键盘位置和名称可能不同)。此时,并不能看到效果,只是将截图保存在粘贴板中,我们打开Word或者其它windows自带的画图板工具(以画图板工具为例)。我们打开画图板直接按下‘Ctrl’+ 'V'粘贴即可。然后你可以对该图片执行其它操作了。