[英]How to convert Yolo format bounding box coordinates into OpenCV format
I have Yolo
format bounding box annotations of objects saved in a .txt
files.我有保存在
.txt
文件中的对象的Yolo
格式边界框注释。 Now I want to load those coordinates and draw it on the image using OpenCV
, but I don't know how to convert those float values into OpenCV
format coordinates values现在我想加载这些坐标并使用
OpenCV
在图像上绘制它,但我不知道如何将这些浮点值转换为OpenCV
格式的坐标值
I tried this post but it didn't help, below is a sample example of what I am trying to do我尝试了这篇文章,但没有帮助,下面是我正在尝试做的示例示例
Code and output代码和输出
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)
Actual Annotations and Image实际注释和图像
0 0.286972 0.647157 0.404930 0.371237
0 0.681338 0.366221 0.454225 0.418060
There's another Q&A on this topic, and there's this 1 interesting comment below the accepted answer.还有另外一个Q&A关于这个主题,而且也该接受的答案低于1个有趣的评论。 The bottom line is, that the YOLO coordinates have a different centering wrt to the image.
最重要的是,YOLO 坐标与图像具有不同的居中位置。 Unfortunately, the commentator didn't provide the Python port, so I did that here:
不幸的是,评论员没有提供 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, 0, 255), 1)
plt.imshow(img)
plt.show()
So, for some Lenna image, that'd be the output, which I think shows the correct coordinates wrt your image:因此,对于某些 Lenna 图像,这将是输出,我认为它显示了您的图像的正确坐标:
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.5
Matplotlib: 3.3.2
OpenCV: 4.4.0
----------------------------------------
1 Please upvote the linked answers and comments. 1请为链接的答案和评论点赞。
@HansHirse This is really helped a lot. @HansHirse 这真的很有帮助。 Much appreciated.
非常感激。 I would like to know how we can perform reverse of this?
我想知道我们如何才能反向执行此操作? In my case i would like to convert OpenCV coordinates into a YOLO format.
就我而言,我想将 OpenCV 坐标转换为 YOLO 格式。 I tried couple of links from stack overflow nothing worked for me.... This is the same problem i have now: Converting opencv rectangle coordinate to yolo object coordinates for image labeling
我尝试了堆栈溢出中的几个链接,但对我没有任何作用......这与我现在遇到的问题相同: 将 opencv 矩形坐标转换为 yolo 对象坐标以进行图像标记
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.