获取图片的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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐