gpt4 book ai didi

python - OpenCV与Python——如何通过指定坐标实现图像叠加?

转载 作者:太空宇宙 更新时间:2023-11-03 22:23:59 25 4
gpt4 key购买 nike

<分区>

简而言之,我的问题是如何通过为添加的图像指定特定坐标将图像放在另一个图像之上?我需要根据需要扩展基本图像的“ Canvas ”,这样添加的图像就不会被裁剪。

这是扩展版:

我的项目是拍摄从无人机视频中提取的照片,并通过将一张照片与最后一张照片对齐来制作一张粗略的 map 。我知道我可以使用 Agisoft Photoscan 等软件来执行此操作,但我的目标是创建一个更轻巧、粗略的解决方案。

这是我的计划,我打算对每一帧进行:

  1. 使用estimateRigidTransform,生成变换矩阵以将curr_photo 与最后一张照片base 对齐
  2. 计算包围结果图像所需的边界矩形(使用四个角的变换)
  3. 修改变换矩阵,使边界框的左上角在原点
  4. 将转换应用到当前照片,使用边界矩形的宽度和高度来确保生成的图像没有被裁剪
  5. 通过在适当的坐标处将 curr_image 添加到 base,将当前图像与上一张图像叠加在一起(确保不会裁剪任何图像)。这一步就是我要问的。

这是执行步骤 1 到 4 的代码。

import numpy as np
import cv2


base = cv2.imread("images/frame_03563.jpg")
curr_photo = cv2.imread("images/frame_03564.jpg")

height, width = curr_photo.shape[:2]

# Step 1
# which transformation is required to go from curr_photo to base?
transformation = cv2.estimateRigidTransform(curr_photo, base, True)

# Step 2
# add a line to the affine transformation matrix so it can be used by
# perspectiveTransform
three_by_three = np.array([
transformation[0],
transformation[1],
[0, 0, 1]], dtype="float32")

# get corners of curr_photo (to be transformed)
corners = np.array([
[0, 0],
[width - 1, 0],
[width - 1, height - 1],
[0, height - 1]
])

# where do the corners of the image go
trans_corners = cv2.perspectiveTransform(np.float32([corners]), three_by_three)

# get the bounding rectangle for the four corner points (and thus, the transformed image)
bx, by, bwidth, bheight = cv2.boundingRect(trans_corners)

# Step 3
# modify transformation matrix so that the top left of the bounding box is at the origin
transformation[0][2] = transformation[0][2] - bx
transformation[1][2] = transformation[1][2] - by

# Step 4
# transform the image in a window the size of its bounding rectangle (so no cropping)
mod_curr_photo = cv2.warpAffine(curr_photo, transformation, (bwidth, bheight))

# for viewing
cv2.imshow("base", base)
cv2.imshow("current photo", curr_photo)
cv2.imshow("image2 transformed to image 1", mod_curr_photo)

cv2.waitKey()

我还附上了两张示例图片。我使用第一个作为基础,但无论哪种方式都有效。

Base

Current

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com