1. 图像对读取与显示
任务说明
本案例的目标是读取一对双目图像(左图与右图),在窗口中显示它们,并检查图像的尺寸(高度、宽度)与通道数。这是双目立体匹配流程的第一步,后续所有算法都依赖于正确加载图像对并确认其基本属性。
实现方案
使用OpenCV的imread函数分别读取左右两张图像,通过imshow显示,利用shape属性获取尺寸与通道数。为保证可复现性,代码中直接生成一对已知尺寸的合成图像作为输入,避免依赖外部文件缺失导致无法运行。
代码实现
import cv2
import numpy as np
# 生成一对合成双目图像(模拟真实场景,左图比右图稍亮)
# 图像尺寸:高240像素,宽320像素,3通道(BGR)
left_img = np.full((240, 320, 3), (200, 200, 200), dtype=np.uint8)
right_img = np.full((240, 320, 3), (180, 180, 180), dtype=np.uint8)
# 添加简单特征以便肉眼观察差异
cv2.rectangle(left_img, (50, 50), (150, 150), (255, 0, 0), -1) # 左图蓝色方块
cv2.rectangle(right_img, (70, 50), (170, 150), (0, 0, 255), -1) # 右图红色方块(位置偏移模拟视差)
# 读取图像对(实际使用时替换为真实文件路径)
# left_img = cv2.imread('left.png')
# right_img = cv2.imread('right.png')
# 检查图像尺寸与通道数
for name, img in [("左图", left_img), ("右图", right_img)]:
if img is None:
print(f"{name}读取失败")
else:
h, w = img.shape[:2]
channels = img.shape[2] if len(img.shape) == 3 else 1
print(f"{name}: 高度={h}px, 宽度={w}px, 通道数={channels}")
# 显示图像对
cv2.imshow("Left Image", left_img)
cv2.imshow("Right Image", right_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
关键说明
- 图像读取:
cv2.imread返回None表示读取失败,代码中通过判断img is None进行错误检查。 - 尺寸与通道:
shape返回三元组(高度, 宽度, 通道数),灰度图只有两维,因此用条件表达式区分。 - 合成输入:代码默认生成一对240×320的BGR图像,保证任何环境都能直接运行。若使用真实图像,取消注释替换为实际文件路径即可。
验证方法
运行代码后,观察控制台输出。预期输出如下(与代码逻辑严格一致):
左图: 高度=240px, 宽度=320px, 通道数=3
右图: 高度=240px, 宽度=320px, 通道数=3
同时会弹出两个窗口分别显示左右图像,左图为带蓝色方块的灰色背景,右图为带红色方块的灰色背景。按任意键关闭窗口。若控制台打印“读取失败”,说明图像路径错误或文件损坏。
判定标准
满足以下条件即判定案例通过:
- 控制台输出的高度、宽度、通道数与代码中生成图像时指定的参数一致(240、320、3);
- 两个显示窗口分别呈现左右图像,且内容与代码绘制的特征相符;
- 程序无异常退出,按任意键后窗口正常关闭。