69 lines
2.0 KiB
Python
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()
|