[英]Perspective transform using Opencv
我正在尝试使用Python和Open CV实现透视图转换。 通过选择图像上的4个点来完成变换时,输出图像高度模糊。 即使我没有使用鼠标事件来选择4个点(而是对其进行硬编码),图像质量仍然模糊不清。
`def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img, (x, y), 5, (255, 0, 0), -1)
p = (x, y)
l.append(p)
print(l)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
img = cv2.imread('Path to my input image')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.resizeWindow('image', 600, 600)
cv2.setMouseCallback('image', draw_circle)
while 1:
cv2.imshow('image', img)
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()
rows, cols, channels = img.shape
pts1 = np.float32(l)
pts2 = np.float32([[0, 0], [200, 0], [200, 100], [0, 100]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (200, 100), cv2.INTER_LINEAR)
h1 = math.sqrt((abs(pts1[1][0] - pts1[0][0])) ** 2 + (abs(pts1[1][1] - pts1[0][1])) ** 2)
h2 = math.sqrt((abs(pts1[3][0] - pts1[2][0])) ** 2 + (abs(pts1[3][1] - pts1[2][1])) ** 2)
v1 = math.sqrt((abs(pts1[3][0] - pts1[0][0])) ** 2 + (abs(pts1[3][1] - pts1[0][1])) ** 2)
v2 = math.sqrt((abs(pts1[2][0] - pts1[1][0])) ** 2 + (abs(pts1[2][1] - pts1[1][1])) ** 2)
max_h = int(max(h1, h2))
max_v = int(max(v1, v2))
dst = cv2.resize(dst, (max_h, max_v))
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst), plt.title('Output')
plt.show()`
这是我的输入图像:这是带有选择性饮料的冰箱图像
这是我的输出图像:这是透视变换后的输出图像
在您的代码中替换此行
pts2 = np.float32([[0, 0], [200, 0], [200, 100], [0, 100]])
到这一个(也许您必须切换v / h顺序,我不知道python语法):
pts2 = np.float32([[0, 0], [max_h,0], [max_h,max_v], [0,max_v]])
通过将max_h / max_v计算移动到变换计算之前。 然后删除调整大小的代码。
目前,您首先(隐式)将尺寸调整为100x200的临时图像,如果此后再将其调整为较大的图像,这将非常模糊。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.