21xrx.com
2024-12-22 15:48:48 Sunday
登录
文章检索 我的文章 写文章
OpenCV调用YOLOv4模型:实现目标检测功能
2023-09-17 12:00:31 深夜i     --     --
OpenCV YOLOv4 模型调用 目标检测 功能实现

目标检测是计算机视觉领域的重要任务之一,它可以帮助计算机自动识别和定位图像或视频中的特定对象。OpenCV是一个开源的计算机视觉库,它提供了许多用于图像处理和分析的功能。而YOLOv4则是一种高性能的目标检测模型,具有快速和准确的特点。本文将介绍如何使用OpenCV调用YOLOv4模型,实现目标检测功能。

首先,我们需要下载并安装OpenCV和YOLOv4模型。可以在OpenCV的官方网站上找到最新的版本,并按照提示进行安装。同时,YOLOv4模型的代码和权重文件可以在GitHub上找到。下载完成后,将模型文件保存在正确的路径下。

接下来,我们需要编写一个Python脚本来调用OpenCV和YOLOv4模型。首先,我们需要导入必要的库:

python

import cv2

import numpy as np

然后,我们需要加载YOLOv4模型的权重文件和配置文件:

python

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

这里的"yolov4.cfg"和"yolov4.weights"分别是YOLOv4模型的配置文件和权重文件。通过使用OpenCV的dnn模块的readNetFromDarknet函数,我们可以加载这些文件并创建一个网络模型。

接下来,我们需要读取输入图像或视频,并将其转换为与模型要求的大小相同。然后,我们可以通过模型对图像或视频进行目标检测:

python

image = cv2.imread("input.jpg")

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

net.setInput(blob)

output_layers = net.getUnconnectedOutLayersNames()

outs = net.forward(output_layers)

在上面的代码中,我们首先使用cv2.imread函数读取输入图像。然后,使用cv2.dnn.blobFromImage函数将图像转换为网络模型的输入格式。参数1/255用于对图像进行归一化处理,参数(416, 416)定义了网络模型的输入大小,而参数swapRB=True和crop=False则用于交换图像的通道顺序和调整图像的大小。最后,我们使用net.setInput函数设置网络模型的输入,并使用net.forward函数对图像进行目标检测。

最后,我们可以通过迭代输出列表来获取检测到的目标的位置和类别信息,并将其显示在图像或视频上:

python

class_ids = []

confidences = []

boxes = []

width = image.shape[1]

height = image.shape[0]

for out in outs:

  for detection in out:

    scores = detection[5:]

    class_id = np.argmax(scores)

    confidence = scores[class_id]

    if confidence > 0.5:

      center_x = int(detection[0] * width)

      center_y = int(detection[1] * height)

      w = int(detection[2] * width)

      h = int(detection[3] * height)

      x = int(center_x - w/2)

      y = int(center_y - h/2)

      class_ids.append(class_id)

      confidences.append(float(confidence))

      boxes.append([x, y, w, h])

indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    

for i in indices:

  i = i[0]

  box = boxes[i]

  x = box[0]

  y = box[1]

  w = box[2]

  h = box[3]

  cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

  cv2.putText(image, str(class_ids[i]), (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

cv2.imshow("Output", image)

cv2.waitKey(0)

cv2.destroyAllWindows()

在上面的代码中,我们首先定义了一个空列表用于存储目标的类别和置信度。然后,我们计算目标的坐标,并根据置信度筛选出符合要求的目标。接下来,我们使用cv2.dnn.NMSBoxes函数对目标进行非最大抑制处理,以消除重叠的边界框。最后,在原始图像上绘制边界框和类别标签,并将结果显示出来。

通过上述步骤,我们就可以实现使用OpenCV调用YOLOv4模型进行目标检测的功能。无论是应用于静态图像还是实时视频,都可以通过相应的输入方式进行处理。这种方法不仅简单易用,而且非常高效准确,具有较好的实用性和实用性。

  
  

评论区

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