opencv之获取图片的width和height以及矩形框标注

本文介绍如何使用Python和OpenCV获取图片的宽度和高度,并根据归一化的标注信息绘制矩形框。通过具体示例展示了如何从文本文件中读取标注数据并将其应用于图片上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的贝塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值