python - 带有 cv2.rectangle() 的多个边界框
问题描述
我目前有边界框的坐标数据,包含在嵌套数据结构中,如下所示:
defaultdict(list,
{'giraffe': [{'conf': 0.9869,
'coords': {'center_x': 0.360333,
'center_y': 0.532274,
'height': 0.596343,
'width': 0.144651}},
{'conf': 0.253321,
'coords': {'center_x': 0.016296,
'center_y': 0.565007,
'height': 0.580526,
'width': 0.03498}}],
'zebra': [{'conf': 0.998863,
'coords': {'center_x': 0.545974,
'center_y': 0.693267,
'height': 0.301859,
'width': 0.257102}}]})
我想遍历数据结构 ( img_obj_data
) 并为每个 object_class 的每个对象绘制矩形。
然后我想保存图像(绘制框),以便稍后打开它。
我的第一次尝试如下:
import cv2
img = cv2.imread(img_path)
img_h, img_w = img.shape[:2]
for obj_class in img_obj_data.keys():
for sub_dict in img_obj_data[obj_class]:
x, y, w, h = sub_dict['coords'].values()
# coords cannot be floats
x = int(x*img_w)
y = int(y*img_h)
x_max = int(w*img_w)
y_max = int(y*img_h)
cv2.rectangle(img, (x, y), (x_max, y_max), color=(0, 255, 0), thickness=2)
cv2.imwrite('/content/foobar.jpg', img)
我现在遇到了两个问题:
问题 1) 边界框未与对象正确对齐并从图像中裁剪出来。(坐标最初是浮动的,我将它们乘以图像的宽度和高度,但我有一种预感,这是不正确的做法?)
问题2)
我的代码目前所有框的颜色都相同。我怎样才能做到这一点,以便每个对象类的颜色不同?
解决方案
示例之一如下。h
*如有必要,请根据您的环境切换w
。
import cv2
from random import randint
img = cv2.imread(img_path)
img_h, img_w = img.shape[:2]
colors = {}
for obj_class in img_obj_data.keys():
if obj_class not in colors:
colors[obj_class] = [randint(0, 255), randint(0, 255), randint(0, 255)]
for sub_dict in img_obj_data[obj_class]:
x, y, h, w = sub_dict['coords'].values()
# coords cannot be floats
x_min = int((x-w/2)*img_w)
y_min = int((y-h/2)*img_h)
x_max = int((x+w/2)*img_w)
y_max = int((y+h/2)*img_h)
cv2.rectangle(img, (x_min, y_min), (x_max, y_max), color=colors[obj_class], thickness=2)
cv2.imwrite('/content/foobar.jpg', img)
此示例通过类名随机更改颜色,但如果您知道类名,则可以colors
提前定义。
推荐阅读
- swift - 如何在 Swift 中使用 Google Map 中的集群对标记进行分组?
- python - 如何在 Python 中以编程方式传递密码
- angular - Angular 6,AOT 编译版本抛出 TypeError: o.ngOnDestroy is not a function only when hosting on Amazon S3
- java - 在java中压缩/缩小图像文件
- java - 如何在android上以编程方式自动接听来电
- db2 - DBeaver 是否支持 IDAA 查询加速?
- jquery - 在函数中将 jquery 添加到 wordpress?
- c++ - 两种情况下的输出不应该相同吗?
- oracle - 是什么原因导致“如果绑定大于请求或支持 bean 范围,则可能导致不一致。” ADF 中的警告
- ionic-framework - ionic3 pro包android:应用启动慢