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()