StitchingCodes/two-stitching-lr.py
2025-06-08 20:21:47 +08:00

69 lines
2.0 KiB
Python

import cv2
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
left_img = cv2.imread("left.jpg")
right_img = cv2.imread("right.jpg")
# 配准
left_gray = cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY)
right_gray = cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY)
h, w = left_gray.shape
print(f"图像尺寸: 宽度={w}像素, 高度={h}像素")
template = left_gray[100:h - 100, w - 100:w]
print(f"模板区域: 上边界=100, 下边界={h - 100}, 左边界={w - 100}, 右边界={w}")
search_area = right_gray[:, :200]
print(f"搜索区域: 宽度={200}, 高度={h}")
res = cv2.matchTemplate(search_area, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(f"匹配质量: {max_val:.4f} (1.0=完美匹配)")
match_x, match_y = max_loc
print(f"匹配位置: x={match_x}, y={match_y} (在搜索区域内)")
dx = w - 100 - match_x
dy = 100 - match_y
print(f"计算平移量: dx={dx}, dy={dy}")
# 拼接
new_h, new_w = h + abs(dy), w + dx
canvas = np.zeros((new_h, new_w, 3), dtype=np.uint8)
left_mask = np.zeros((new_h, new_w), dtype=np.uint8)
right_mask = np.zeros((new_h, new_w), dtype=np.uint8)
iou = np.zeros((new_h, new_w), dtype=np.uint8)
if dy >= 0:
canvas[0:h, 0:w] = left_img
canvas[dy:new_h, dx:new_w] = right_img
left_mask[0:h, 0:w] = 255
right_mask[dy:new_h, dx:new_w] = 255
iou = cv2.bitwise_and(left_mask, right_mask)
else:
dy = -dy
canvas[dy:new_h, 0:w] = left_img
canvas[0:h, dx:new_w] = right_img
left_mask[dy:new_h, 0:w] = 255
right_mask[0:h, dx:new_w] = 255
iou = cv2.bitwise_and(left_mask, right_mask)
plt.subplot(221)
plt.imshow(cv2.cvtColor(canvas, cv2.COLOR_BGR2RGB))
plt.subplot(222)
plt.imshow(iou, cmap='hot')
plt.subplot(223)
plt.imshow(left_mask, cmap='hot')
plt.subplot(224)
plt.imshow(right_mask, cmap='hot')
plt.show()