Open-CV Python图像失真径向和透视图

2024-05-17 10:56:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张扭曲的图片,a点、B点、C点和D点不失真地形成一个1厘米×1厘米的正方形。在

enter image description here

我试着用单纯形法来纠正它,但是它扭曲了AD和BC这两条线,你可以在图中看到。在

enter image description here

你知道我该怎么纠正吗?在

非常感谢!在

玛丽-编码器初学者

注:为了提供信息,图像是在一个有大视场的内窥镜摄像机的管子里拍摄的,这样可以在摄像机周围拍摄到管子的照片。我将使用1*1厘米的正方形来估计根的生长,并随时间推移拍摄几张照片。在

这是我的代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt

if __name__ == '__main__' :

# Read source image.
im_src = cv2.imread('points2.jpg', cv2.IMREAD_COLOR)
# Four points of the miniR image
pts_src = np.array([[742,223],[806,255],[818,507],[753,517]], dtype=float)



# Read destination image.
im_dst = cv2.imread('rectangle.jpg', cv2.IMREAD_COLOR) 
# Four points of the square
pts_dst = np.array([[200,200],[1000,200],[1000,1000],[200,1000]], dtype=float)


# Calculate Homography
h, status = cv2.findHomography(pts_src, pts_dst)

# Warp source image to destination based on homography
im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))

cv2.imwrite('corrected2.jpg', im_out)



# Display images
cv2.imshow("Source Image", im_src)
cv2.imshow("Destination Image", im_dst)
cv2.imshow("Warped Source Image", im_out)

cv2.waitKey(0)

Tags: imageimportsrcnpoutcv2pts摄像机
2条回答

我用GDAL找到了一个解决方案。我们可以使用两个棋盘图像。其中一幅图像是用产生失真的设备成像的,并且保持不变,所以没有失真。在QGIS的帮助下,您可以创建一个文件,将扭曲的点与未扭曲的点关联起来。为此,您可以使用定义的网格间隔(例如100px)在每个交叉点添加一个地面控制点,并将生成的gcp导出为pointsfile.points。在

之后,您可以使用协作者创建的批处理文件here。它正在使用GDAL对图像进行地理校正。在

您只需要将要转换的图像(jpg格式)放入repo的根目录并运行bash翘曲.sh。这将把重新转换的图像输出到out/目录中。在

单应性是一种射影变换。因此,它只能将直线映射为直线。输入曲线四边形的直边已正确校正,但无法使用投影变换拉直曲线边。在

在你发布的照片中,可以合理地假设整体几何体近似于一个圆柱体,“垂直”线平行于圆柱体的轴线。所以它们是近似直线的,一个投影变换(相机投影)将它们映射成直线。“水平”线是圆的图像,如果圆柱体被挤压,则为椭圆。投影变换将把椭圆(特别是圆)映射为椭圆。所以你可以通过拟合椭圆来继续。有关提示,请参见this other answer。在

相关问题 更多 >