不同相机位置拍摄图像的OpenCV拼接错位问题求解
不同相机位置拍摄图像的OpenCV拼接错位问题求解
我知道可能没法实现我想要的效果,但还是抱着试试看的心态来提问了。
我现在尝试拼接两张从不同相机位置拍摄的图像,它们是同一时间拍摄的,视角存在差异。我清楚如果是同一相机位置换角度拍摄的话拼接起来没问题,但这次我就是要解决不同相机位置下的拼接难题。
(两张不同相机位置拍摄的同一场景图:画面包含冰面、红蓝线条以及球员,呈现出不同的拍摄视角)
我用这段OpenCV代码尝试拼接:
images = [] image1 = cv2.imread('./VideosToStitch/video2.png') images.append(image1) image2 = cv2.imread('./VideosToStitch/video1.png') images.append(image2) stitcher = cv2.Stitcher.create() status, stitched = stitcher.stitch(images,cv2.Stitcher_PANORAMA) cv2.imwrite('./VideosToStitch/stitched.png', stitched)
拼接后的结果不太理想:画面里的蓝色线条拼接得还算正常,但红色线条直接断裂错位了。
后来我想,是不是可以先对图像做透视变换再拼接?于是我试了这段代码:
image1 = cv2.imread('./VideosToStitch/video1.png') tl = (907,0) bl = (0,1280) tr = (1047,0) br = (1920,1280) pts1 = np.float32([tl,bl,tr,br]) pts2 = np.float32([[0,0],[0,1280],[1920,0],[1920,1280]]) matrix = cv2.getPerspectiveTransform(pts1,pts2) transformedFrame = cv2.warpPerspective(image1, matrix,(1920,1280), flags=3)
结果是红蓝线条变直了,但冰面上的细节几乎全丢了,这显然不是我想要的。
我在想,如果能只对图像做水平方向的透视变换、不影响垂直方向的话,会不会有用?或者有没有办法先把两张图拼接成曲面,再拉直成平面?
大家有什么思路或者建议吗?
补充一下:为了说明Christoph Rackwitz评论里提到的问题,我调整了透视参数,让冰面的线条横竖都对齐了,但结果是垂直于冰面的球员完全没法对齐——两张图里的球员位置错位严重,根本重合不了。
备注:内容来源于stack exchange,提问作者Andrew Wilcox
相关产品推荐
相关产品推荐

