如何使用cv2.imread读取多张图像并绘制边界框(无需重复写路径)
批量读取图像并绘制边界框(无需重复写路径)
嘿,这个需求其实很容易实现,你已经找对了核心思路——把图像路径和对应的边界框数据打包在一起,这样遍历的时候就能一次性获取所有需要的信息,不用重复写路径啦。我帮你把代码补全并解释清楚:
首先,我们需要导入必要的库:
import cv2 import numpy as np
然后定义你的图像路径与边界框的对应列表(你已经写好这部分啦):
# 列表中的每个元素是(图像路径, 该图像对应的边界框数组) images = [ ("images/audrey.jpg", np.array([ (12, 84, 140, 212), (24, 84, 152, 212), (36, 84, 164, 212), (12, 96, 140, 224), (24, 96, 152, 224), (24, 108, 152, 236) ])), ("images/bksomels.jpg", np.array([ (114, 60, 178, 124), (120, 60, 184, 124), (114, 66, 178, 130) ])), ("images/gpripe.jpg", np.array([ (12, 30, 76, 94), (12, 36, 76, 100), (72, 36, 200, 164), (84, 48, 212, 176) ])) ]
接下来是核心的遍历与绘制逻辑:
# 遍历每张图像及其边界框 for (imagePath, boundingBoxes) in images: # 加载图像并创建副本(保留原图,避免绘制时修改原图) print(f"[x] {len(boundingBoxes)} initial bounding boxes") image = cv2.imread(imagePath) orig = image.copy() # 原图副本,可选保留 # 遍历当前图像的所有边界框 for (x1, y1, x2, y2) in boundingBoxes: # 在图像上绘制红色边界框(OpenCV中颜色是BGR格式,所以红色是(0,0,255)) # 参数:图像、左上角坐标、右下角坐标、颜色、线条粗细 cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 2) # 显示处理后的图像(可选) cv2.imshow(f"Processed: {imagePath}", image) # 等待用户按下任意键后关闭窗口 cv2.waitKey(0) # 保存处理后的图像到指定路径(可选,比如在原路径后加"_boxed") outputPath = imagePath.replace(".jpg", "_boxed.jpg") cv2.imwrite(outputPath, image) # 所有窗口处理完成后,销毁所有OpenCV窗口 cv2.destroyAllWindows()
关键细节说明:
- 避免重复写路径:通过把路径和边界框打包成元组存入列表,遍历的时候直接取出路径,不需要在代码里多次写
cv2.imread("xxx.jpg") - 边界框绘制:
cv2.rectangle的参数要注意:图像对象、左上角(x1,y1)、右下角(x2,y2)、BGR颜色、线条粗细。这里用红色(0,0,255)是因为OpenCV默认用BGR色彩空间 - 保留原图:
orig = image.copy()可以保留原始图像,如果你需要对比原图和绘制后的图像,这个步骤很有用 - 可选操作:代码里的显示图像和保存图像都是可选的,你可以根据需求选择保留哪部分
内容的提问来源于stack exchange,提问作者Gian Feliciano
相关产品推荐
相关产品推荐

