OpenCV 透视变换
OpenCV perspective transform
我目前正在开发一个 python 软件来跟踪足球场上的球员。我使用 YoloV3 进行了玩家检测,并且能够输出相当不错的玩家质心和绘制框的结果。我现在想做的是转换球员的位置并将他们的质心投影到足球场的 png/jpg 上。为此,我打算使用两个带有参考点的阵列,一个用于足球场图像,一个用于源视频。但我现在的问题是如何将质心的坐标转换为足球场图像。
类似例子:
Example
如何绘制框和标记:
def draw_labels_and_boxes(img, boxes, confidences, classids, idxs, colors, labels):
# If there are any detections
if len(idxs) > 0:
for i in idxs.flatten():
# Get the bounding box coordinates
x, y = boxes[i][0], boxes[i][1]
w, h = boxes[i][2], boxes[i][3]
# Draw the bounding box rectangle and label on the image
cv.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)
cv.drawMarker (img, (int(x + w / 2), int(y + h / 2)), (x, y), 0, 20, 3)
return img
盒子是这样生成的:
def generate_boxes_confidences_classids(outs, height, width, tconf):
boxes = []
confidences = []
classids = []
for out in outs:
for detection in out:
# print (detection)
# a = input('GO!')
# Get the scores, classid, and the confidence of the prediction
scores = detection[5:]
classid = np.argmax(scores)
confidence = scores[classid]
# Consider only the predictions that are above a certain confidence level
if confidence > tconf:
# TODO Check detection
box = detection[0:4] * np.array([width, height, width, height])
centerX, centerY, bwidth, bheight = box.astype('int')
# Using the center x, y coordinates to derive the top
# and the left corner of the bounding box
x = int(centerX - (bwidth / 2))
y = int(centerY - (bheight / 2))
# Append to list
boxes.append([x, y, int(bwidth), int(bheight)])
confidences.append(float(confidence))
classids.append(classid)
return boxes, confidences, classids
假设有一个静止的相机,
- 找到场地四个角的坐标。
- 在要创建的俯视图图像中找到对应的四个角。
- 使用这两组点求一个单应矩阵。您可以为此使用 OpenCV 的
findHomography
。
- 使用此单应矩阵变换所有质心,这应该会为您提供新图像中的坐标 space。您可以使用
warpPerspective
来执行此操作。
最近在 COVID19 大流行期间,许多开发人员开发了“社交距离监控系统”。其中有几家还开发了“Bird's Eye View”的系统。你的问题很相似。由于此处不接受外部 link,因此我无法 post 确切的 link(s)。请在 GitHub.
中查看他们的代码
我目前正在开发一个 python 软件来跟踪足球场上的球员。我使用 YoloV3 进行了玩家检测,并且能够输出相当不错的玩家质心和绘制框的结果。我现在想做的是转换球员的位置并将他们的质心投影到足球场的 png/jpg 上。为此,我打算使用两个带有参考点的阵列,一个用于足球场图像,一个用于源视频。但我现在的问题是如何将质心的坐标转换为足球场图像。
类似例子: Example 如何绘制框和标记:
def draw_labels_and_boxes(img, boxes, confidences, classids, idxs, colors, labels):
# If there are any detections
if len(idxs) > 0:
for i in idxs.flatten():
# Get the bounding box coordinates
x, y = boxes[i][0], boxes[i][1]
w, h = boxes[i][2], boxes[i][3]
# Draw the bounding box rectangle and label on the image
cv.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)
cv.drawMarker (img, (int(x + w / 2), int(y + h / 2)), (x, y), 0, 20, 3)
return img
盒子是这样生成的:
def generate_boxes_confidences_classids(outs, height, width, tconf):
boxes = []
confidences = []
classids = []
for out in outs:
for detection in out:
# print (detection)
# a = input('GO!')
# Get the scores, classid, and the confidence of the prediction
scores = detection[5:]
classid = np.argmax(scores)
confidence = scores[classid]
# Consider only the predictions that are above a certain confidence level
if confidence > tconf:
# TODO Check detection
box = detection[0:4] * np.array([width, height, width, height])
centerX, centerY, bwidth, bheight = box.astype('int')
# Using the center x, y coordinates to derive the top
# and the left corner of the bounding box
x = int(centerX - (bwidth / 2))
y = int(centerY - (bheight / 2))
# Append to list
boxes.append([x, y, int(bwidth), int(bheight)])
confidences.append(float(confidence))
classids.append(classid)
return boxes, confidences, classids
假设有一个静止的相机,
- 找到场地四个角的坐标。
- 在要创建的俯视图图像中找到对应的四个角。
- 使用这两组点求一个单应矩阵。您可以为此使用 OpenCV 的
findHomography
。 - 使用此单应矩阵变换所有质心,这应该会为您提供新图像中的坐标 space。您可以使用
warpPerspective
来执行此操作。
最近在 COVID19 大流行期间,许多开发人员开发了“社交距离监控系统”。其中有几家还开发了“Bird's Eye View”的系统。你的问题很相似。由于此处不接受外部 link,因此我无法 post 确切的 link(s)。请在 GitHub.
中查看他们的代码