opencv之获取图片的width和height以及矩形框标注
opencv获取图片宽和高,矩形框的标注,coco数据集矩形框标注的应用。
·
获取图片的width和height
imread函数读取一张图片时,其返回值为一个矩阵,矩阵的行数代表height,矩阵的列数代表width,不要搞混,也就是shape[0]代表height,shape[1]代表width
import cv2
img = cv2.imread(fname)
width = img.shape[1]
height = img.shape[0]
矩形框标注
下面解释一下,这个地方img就是读取的图像,pt1表示矩形框的左上角的点,pt2时矩形框的右下角的点,以(x,y)这种点的形式来表示。color参数表示矩形框的颜色设置,thickness参数表示矩形框线条的粗细。
如果你的bbox是归一化后的[x_center, y_center, width, height]下面提供了转换为[x_min, y_min],[x_max, y_max]的代码。
img = cv2.imread(fname)
width = img.shape[1]
height = img.shape[0]
# 其中的bbox对应的内容
bbox = {'x': x, 'y':y, 'width':width, 'height':height}
wid = int(float(bbox['width']) * width)
hei = int(float(bbox['height']) * height)
x = int(float(bbox['x']) * width - wid / 2)
y = int(float(bbox['y']) * height - hei / 2)
# print(x, y, x + wid, y + hei)
cv2.rectangle(img, (x, y), (x + wid, y + hei), (0, 255, 0), 1)
标注好之后,可以保存一下带标注框的图片:
cv2.imwrite('001.jpg', img)
应用
下面针对某个场景,这个场景对应的是:将coco数据集中的某个图片的标注信息进行显示,其中标注信息我解析到txt文件中了,每行表示:类别id, bbox[x_center, y_center, width, height ]。其中bbox内容进行了归一化。我要做的是将.txt中的标注信息以矩形框的形式添加到图片上,然后保存添加矩形框的图片。
.txt文件中的内容如下:
2 0.767109 0.472167 0.076906 0.082125
2 0.871102 0.460646 0.081266 0.084792
2 0.701187 0.315125 0.172812 0.060583
2 0.767820 0.760073 0.094109 0.080563
2 0.530031 0.756875 0.084094 0.086500
2 0.683602 0.759635 0.086109 0.079729
2 0.163766 0.679760 0.053438 0.061771
2 0.299398 0.559937 0.058234 0.065292
2 0.466242 0.713615 0.048766 0.068312
2 0.625523 0.748135 0.103172 0.102813
2 0.164477 0.749219 0.079766 0.085812
2 0.551383 0.721135 0.056578 0.066146
2 0.931406 0.447979 0.072906 0.068042
2 0.346875 0.760417 0.287500 0.079167
图片内容:
提供我的一份代码:
def test_true(img_name, ant_name):
# 验证解析是否正确
# img_name = 'data/val2017/000000001532.jpg' 图片路径
# ant_name = 'data/labels/val/000000001532.txt' 。txt文件路径
img = cv2.imread(img_name)
width = img.shape[1]
height = img.shape[0]
print(width, height)
with open(ant_name, 'r') as f:
for line in f.readlines():
line = line.strip()
a = line.split(' ')
print(a)
wid = int(float(a[3]) * width)
hei = int(float(a[4]) * height)
x = int(float(a[1]) * width - wid / 2)
y = int(float(a[2]) * height - hei / 2)
# print(x, y, x + wid, y + hei)
cv2.rectangle(img, (x, y), (x + wid, y + hei), (0, 255, 0), 1)
# cv2.putText(img, fname, ())
cv2.imwrite('001.jpg', img) # 将图片保存为001.jpg
最终的结果
参考:
https://docs.opencv.org/4.x/d6/d6e/group__imgproc__draw.html#ga07d2f74cadcf8e305e810ce8eed13bc9
更多推荐
已为社区贡献8条内容
所有评论(0)