21xrx.com
2024-12-22 10:07:47 Sunday
登录
文章检索 我的文章 写文章
使用OpenCV调用YOLO模型
2023-10-11 13:51:55 深夜i     --     --
OpenCV YOLO 模型调用 计算机视觉 目标检测

OpenCV是一种经典的计算机视觉库,广泛应用于图像处理和机器视觉任务。而YOLO(You Only Look Once)则是一种流行的目标检测模型,以其高效的速度和准确性而闻名。在本文中,我们将探讨如何使用OpenCV来调用YOLO模型,以实现目标检测的功能。

首先,我们需要准备YOLO模型文件和对应的类别标签。YOLO模型由两个文件组成:一个是模型结构文件(.cfg),另一个是模型权重文件(.weights)。这两个文件可以从YOLO官方网站下载,或者从开源社区获取。类别标签文件(.names)包含了我们希望模型能够检测的物体类别,例如人、汽车、猫等。

接下来,我们需要在代码中加载YOLO模型和类别标签。使用OpenCV的`dnn`模块,我们可以通过`readNetFromDarknet`函数来加载模型。该函数需要模型结构文件和权重文件作为参数。类别标签可以通过`readLabelNames`函数读取。

 python

import cv2

# Load YOLO model

net = cv2.dnn.readNetFromDarknet("yolo.cfg", "yolo.weights")

# Load class labels

with open("yolo.names", "r") as f:

  classes = [line.strip() for line in f.readlines()]

# Set up the input/output layer names

layer_names = net.getLayerNames()

output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

现在我们已经加载了YOLO模型和类别标签,接下来我们可以使用摄像头或者视频文件作为输入,进行目标检测。我们可以使用OpenCV的`VideoCapture`类来读取摄像头或者视频文件,然后使用YOLO模型来检测目标。

 python

# Open the video capture

cap = cv2.VideoCapture(0)

while True:

  # Read frame from camera

  ret, frame = cap.read()

  # Resize frame to fit the model input size

  resized = cv2.resize(frame, (416, 416))

  # Normalize and expand dimensions

  blob = cv2.dnn.blobFromImage(resized, 1 / 255.0, (416, 416), swapRB=True, crop=False)

  # Pass the blob through the network

  net.setInput(blob)

  outs = net.forward(output_layers)

  # Process the detections

  # ...

在上述代码中,我们首先从摄像头或者视频文件中读取一帧图像。然后,我们将图像调整为与模型输入大小一致的尺寸,并进行归一化和维度扩展。接下来,我们将图像数据传递给YOLO模型,并通过`forward`函数获取模型输出。

接下来的步骤是处理模型输出,提取目标检测结果并在图像上进行绘制。通过解析模型输出,我们可以获取检测到的物体的边界框坐标、置信度和类别标签。然后,我们可以使用OpenCV的绘图函数,在图像上绘制出矩形框和类别标签。

 python

  # Process the detections

  for out in outs:

    for detection in out:

      scores = detection[5:] # Confidence scores for each class

      class_id = np.argmax(scores)

      confidence = scores[class_id]

      if confidence > 0.5:

        # Extract object bounding box coordinates

        center_x = int(detection[0] * frame.shape[1])

        center_y = int(detection[1] * frame.shape[0])

        width = int(detection[2] * frame.shape[1])

        height = int(detection[3] * frame.shape[0])

        x = int(center_x - width / 2)

        y = int(center_y - height / 2)

        # Draw rectangle and label

        cv2.rectangle(frame, (x, y), (x + width, y + height), (0, 255, 0), 2)

        cv2.putText(frame, classes[class_id], (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

  # Show the frame with detections

  cv2.imshow("YOLO", frame)

  # Break the loop on 'q' key press

  if cv2.waitKey(1) & 0xFF == ord('q'):

    break

# Release the video capture

cap.release()

cv2.destroyAllWindows()

最后,我们通过在循环中不断读取并处理图像帧,在图像上绘制出检测结果。我们还添加了一个键盘监听事件,当用户按下`q`键时,程序将退出。

使用OpenCV调用YOLO模型可以实现高效的目标检测,而不需要依赖复杂的深度学习框架。通过加载模型文件和类别标签,处理图像输入,并绘制目标检测结果,我们可以轻松地应用YOLO模型来解决各种计算机视觉任务。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复