【发布时间】:2021-11-10 22:39:04
【问题描述】:
我有一个带有广角镜头的固定摄像头和一个移动物体的系统。当物体以恒定速度移动时,我以 10 毫米间隔和 2064x40 像素捕获图像。此外,我在没有恒定速度的情况下拍摄了 2048x40 的图像。我想拼接这些捕获的图像。
首先我参考link尝试了OpenCV的拼接方法。但是,我收到错误代码 1,并且我了解到两个图像之间没有足够的重叠区域来拼接。
在那之后,我想我可以尝试将图像连接为等速物体。我使用下面的代码,并将 13 px 作为移动参数。
我尝试过的代码:
import numpy as np
import cv2
import os
from Stitching.Blending import UVSSBlendingConcate
from Stitching.DistortionCorrection import load_coefficients
def load_images_from_folder(folder):
print("\nImages are reading from folder: " + folder)
images = []
for filename in os.listdir(folder):
img = cv2.imread((folder + "/" + filename))
if img is not None:
images.append(img)
return images
def unDistortImages(images):
mtx, dist = load_coefficients('calibration_chessboard.yml')
for i in range(len(images)):
images[i] = cv2.undistort(images[i], mtx, dist, None, None)
return images
def LineTriggerConcate(dx, images, blending, IsFlip, IsUnDistorted):
print("\nImage LineTrigger Concate Start")
if IsUnDistorted:
images = unDistortImages(images)
cropped_images = []
for i in range(len(images) - 1):
if IsFlip is True:
cropped_images.append(cv2.flip(images[i][2:2 + dx, 0:2064], 0))
else:
cropped_images.append(images[i][2:2 + dx, 0:2064])
if not blending:
result = cv2.vconcat(cropped_images)
return result
else:
global blendingResult
for i in range(len(cropped_images) - 1):
if i == 0:
blendingResult = UVSSBlendingConcate(cropped_images[i], cropped_images[i + 1], dx / 2)
else:
blendingResult = UVSSBlendingConcate(blendingResult, cropped_images[i + 1], dx / 2)
print("\nImage LineTrigger Concate Finish")
return blendingResult
def concateImages(image_list):
image_h = cv2.vconcat(image_list)
return image_h
def main():
images_path = "10mm"
image_list = load_images_from_folder(images_path)
# LineTriggerConcate Parameters
shiftParameter = 13
IsBlending = False
IsFlipped = True
IsUnDistorted = False
result = LineTriggerConcate(shiftParameter, image_list, IsBlending, IsFlipped, IsUnDistorted)
cv2.imwrite(images_path + r"//" + str(shiftParameter) + r"_Shift_" + str(IsBlending) + "_Blending_Result.bmp", result)
print('Successfully saved to %s' % images_path)
if __name__ == '__main__':
main()
输出图像:
在上面的结果中,过渡不平滑,我尝试使用混合和不失真的方法来修复过渡,但没有成功。
另一方面,我假设物体的速度是恒定的,但不幸的是,实际情况并非如此。当物体有加速度时,图像的某些部分可能会被拉长或缩短。
有人可以建议任何方法或研究吗?
我也分享a part of 10mm intervals datasets。
【问题讨论】:
-
混合是一个孤立的问题,您可以通过不混合来解决,只需连接切片(我假设为 vconcat)。一个重复的黑色像素行似乎是由混合尝试引起的。 - 我会使用“平面”投影切片,然后尝试特征匹配并找到仿射变换(实际上只是一个翻译)。或者您可以安装某种类型的物理传感器,以稍微精确地测量物体的位置。
-
我将从事一些使用相关性和亚像素对齐的工作...
-
是的,对不起。切片有点太窄(并且包含固定的污垢斑点)。光学跟踪的表现低于我的希望。它也受到深度/视差的影响。这是结果(忽略懒惰的拼接)imgur.com/a/JXuHka2
-
我每步大约 7.5 像素...或多或少
-
我认为您的图像中仍有相当多的镜头失真。遮蔽背景(天空和汽车的眩光)以及使用校准网格(大约在起落架的距离处)改进初始单应映射都可以改进所有后续拟合策略。
标签: python opencv image-processing computer-vision image-stitching