微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将Yolo格式的边界框坐标转换为OpenCV格式

如何解决如何将Yolo格式的边界框坐标转换为OpenCV格式

我对Yolo文件中保存的对象具有.txt格式的边框注释。现在,我想加载这些坐标并使用OpenCV将其绘制在图像上,但是我不知道如何将这些浮点值转换为OpenCV格式的坐标值

我尝试了此post,但没有帮助,下面是我尝试做的示例示例

代码输出

import matplotlib.pyplot as plt
import cv2

img = cv2.imread(<image_path>)
dh,dw,_ = img.shape
        
fl = open(<label_path>,'r')
data = fl.readlines()
fl.close()
        
for dt in data:
            
    _,x,y,w,h = dt.split(' ')
            
    nx = int(float(x)*dw)
    ny = int(float(y)*dh)
    nw = int(float(w)*dw)
    nh = int(float(h)*dh)
            
    cv2.rectangle(img,(nx,ny),(nx+nw,ny+nh),(0,255),1)
            
plt.imshow(img)

enter image description here

实际注释和图像

0 0.286972 0.647157 0.404930 0.371237 
0 0.681338 0.366221 0.454225 0.418060

enter image description here

解决方法

有关此主题的另一个问答,并且在接受的答案下方有this 1 有趣的评论。底线是YOLO坐标的重心w.r.t.图片。不幸的是,评论者没有提供Python端口,所以我在这里做了:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread(<image_path>)
dh,dw,_ = img.shape

fl = open(<label_path>,'r')
data = fl.readlines()
fl.close()

for dt in data:

    # Split string to float
    _,x,y,w,h = map(float,dt.split(' '))

    # Taken from https://github.com/pjreddie/darknet/blob/810d7f797bdb2f021dbe65d2524c2ff6b8ab5c8b/src/image.c#L283-L291
    # via https://stackoverflow.com/questions/44544471/how-to-get-the-coordinates-of-the-bounding-box-in-yolo-object-detection#comment102178409_44592380
    l = int((x - w / 2) * dw)
    r = int((x + w / 2) * dw)
    t = int((y - h / 2) * dh)
    b = int((y + h / 2) * dh)
    
    if l < 0:
        l = 0
    if r > dw - 1:
        r = dw - 1
    if t < 0:
        t = 0
    if b > dh - 1:
        b = dh - 1

    cv2.rectangle(img,(l,t),(r,b),(0,255),1)

plt.imshow(img)
plt.show()

因此,对于某些Lenna图像,这将是输出,我认为显示的是正确的坐标w.r.t.您的图片:

Output

----------------------------------------
System information
----------------------------------------
Platform:     Windows-10-10.0.16299-SP0
Python:       3.8.5
Matplotlib:   3.3.2
OpenCV:       4.4.0
----------------------------------------

1 请对链接的答案和评论进行投票。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。