我正在编写一个Python脚本来处理两个视频文件,校准它们,并将它们合并成一个全景视图。由于两个相机都保持静止,我的目标是仅计算一次接缝掩模和扭曲点以供重复使用。目前,由于平面扭曲方法非常耗时,全景图创建尚未达到所需的 30 FPS。因此,我正在寻找一种解决方案来计算和保存平面扭曲器中使用的点,以避免为每一帧重新计算它们。
这是我目前正在使用的 2 个功能。
函数 getCamSeammask 将相机参数和接缝掩模存储在变量中,因此您不必每 2 帧重新计算它们。
def getCamSeammask (frameLeft, frameRight):
global cameraMask
images = Images.of([frameLeft, frameRight])
medium_imgs = images.resize(Images.Resolution.MEDIUM)
final_imgs = list(images.resize(Images.Resolution.FINAL))
features = [FINDER.detect_features(img) for img in medium_imgs]
matches = MATCHER.match_features(features)
conf = MATCHER.get_confidence_matrix(matches)
cameras = CAMERA_ESTIMATOR.estimate(features,matches)
cameras = CAMERA_ADJUSTER.adjust(features,matches,cameras)
cameras = WAVE_CORRECTOR.correct(cameras)
WARPER.set_scale(cameras)
final_sizes = images.get_scaled_img_sizes(Images.Resolution.FINAL)
camera_aspect = images.get_ratio(Images.Resolution.MEDIUM, Images.Resolution.FINAL)
warped_final_imgs = list(WARPER.warp_images(final_imgs, cameras, camera_aspect))
warped_final_masks = list(WARPER.create_and_warp_masks(final_sizes, cameras, camera_aspect))
final_corners, final_sizes = WARPER.warp_rois(final_sizes, cameras, camera_aspect)
seamMask = SEAM_FINDER.find(warped_final_imgs, final_corners, warped_final_masks)
cameraMask = (cameras, seamMask)
以及创建全景图的函数 getPanorama。
def getPanorama(frameLeft, frameRight):
cam = cameraMask[0]
seammask = cameraMask[1]
images = Images.of([frameLeft, frameRight])
final_sizes = images.get_scaled_img_sizes(Images.Resolution.FINAL)
camera_aspect = images.get_ratio(Images.Resolution.MEDIUM, Images.Resolution.FINAL)
warped_final_imgs = list(WARPER.warp_images([frameLeft,frameRight], cam, camera_aspect))
final_corners, final_sizes = WARPER.warp_rois(final_sizes, cam, camera_aspect)
BLENDER.prepare(final_corners, final_sizes)
for img, mask, corner in zip(warped_final_imgs, seammask, final_corners):
BLENDER.feed(img, mask, corner)
panorama,_ = BLENDER.blend()
return panorama
我正在使用 Python 中的 OpenStitching 库,它构建在 OpenCV 之上。