单张图片多ROI裁剪区域RGB值写入CSV的代码问题求助
问题原因
代码中将CSV文件写入逻辑放在了ROI遍历循环内部,且使用了w(覆盖写入)模式打开文件,每一轮循环都会清空文件之前的所有内容,最终只会保留最后一轮循环写入的裁剪区域数据。同时重复写入表头也会导致CSV格式错乱。
调整方案
将CSV文件初始化、表头写入逻辑移到循环外部,循环内仅追加写入当前裁剪区域的RGB数据即可,修改后的完整代码如下:
from __future__ import with_statement import cv2 import numpy as np import csv # 图像路径 img_path="gr.jpg" # 读取图像 img_raw = cv2.imread(img_path) # 框选多个ROI,选完一个按空格/回车确认下一个,全部选完按ESC结束 ROIs = cv2.selectROIs("Select Rois",img_raw) # 打印选中的ROI坐标参数 print(ROIs) # 打开CSV文件,一次性完成表头写入和所有数据写入 with open('output_file.csv', 'w', newline='') as f_output: csv_output = csv.writer(f_output) # 写入表头 csv_output.writerow(["img_name", "R", "G", "B"]) crop_number=0 # 遍历所有选中的ROI for rect in ROIs: x1=rect[0] y1=rect[1] w=rect[2] h=rect[3] # 裁剪对应区域 img_crop=img_raw[y1:y1+h, x1:x1+w] b,g,r = cv2.split(img_crop) # 计算RGB平均值 B = b.mean() G = g.mean() R = r.mean() # 显示裁剪结果 cv2.imshow("crop"+str(crop_number),img_crop) # 保存裁剪图片 cv2.imwrite("crop"+str(crop_number)+".jpg",img_crop) # 写入当前ROI的RGB数据 csv_output.writerow(["crop"+str(crop_number), R, G, B]) crop_number+=1 # 等待按键后关闭所有窗口 cv2.waitKey(0) cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Rakesh Sharbidre
相关产品推荐
相关产品推荐

