Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将Yolo格式的边界框坐标转换为OpenCV格式_Python_Opencv_Yolo - Fatal编程技术网

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

Python 如何将Yolo格式的边界框坐标转换为OpenCV格式,python,opencv,yolo,Python,Opencv,Yolo,我将对象的Yolo格式边界框注释保存在.txt文件中。现在我想加载这些坐标并使用OpenCV在图像上绘制,但我不知道如何将这些浮点值转换为OpenCV格式坐标值 我试过了,但没用,下面是我尝试做的一个示例 编码和输出 import matplotlib.pyplot as plt import cv2 img = cv2.imread(<image_path>) dh, dw, _ = img.shape fl = open(<label_path>,

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

我试过了,但没用,下面是我尝试做的一个示例

编码和输出

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,0,255), 1)
            
plt.imshow(img)

关于这个话题还有一个问答,在接受的答案下面有一条有趣的评论。底线是,YOLO坐标与图像的中心w.r.t.不同。不幸的是,评论员没有提供Python端口,所以我在这里这样做了:

导入cv2
将matplotlib.pyplot作为plt导入
img=cv2.imread()
dh,dw,ug=img.shape
fl=打开(,'r')
数据=fl.读线()
fl.关闭()
对于数据中的dt:
#将字符串拆分为浮动
_,x,y,w,h=映射(浮点,dt.分割(“”))
#取自https://github.com/pjreddie/darknet/blob/810d7f797bdb2f021dbe65d2524c2ff6b8ab5c8b/src/image.c#L283-L291
#通过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)
如果l<0:
l=0
如果r>dw-1:
r=dw-1
如果t<0:
t=0
如果b>dh-1:
b=dh-1
cv2.矩形(img,(l,t),(r,b),(0,0,255),1)
plt.imshow(img)
plt.show()
对于一些Lenna图像,这就是输出,我认为它显示了正确的坐标w.r.t.你的图像:

----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.8.5
Matplotlib:3.3.2
OpenCV:4.4.0
----------------------------------------

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

nx=int(浮动(x-w/2)*dw)和ny=int(浮动(y-h/2)*dh)
0 0.286972 0.647157 0.404930 0.371237 
0 0.681338 0.366221 0.454225 0.418060