有条件的开启CV汽车检测
Open CV Car Detection with conditions
我正在尝试创建一个程序,在该程序中我的代码可以分析来自我的安全摄像头的视频并定位已被发现的汽车。我已经想出如何找到汽车并在它们周围绘制红色矩形,但我想添加一个条件,如果检测到超过 5 辆汽车,则只绘制框。但是,由于存在数组,我无法这样做。我将如何修复此代码?
import cv2
classifier_file = 'cars.xml'
car_tracker = cv2.CascadeClassifier(classifier_file)
video = cv2.VideoCapture("footage.mp4")
while True:
(read_successful, frame) = video.read()
if read_successful:
grayscaled_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
break
cars = car_tracker.detectMultiScale(grayscaled_frame)
if cars > 4:
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('Car Detector', frame)
cv2.waitKey(0)
顺便说一下,我正在使用 anaconda 环境以及 python 3.8.8
这是一个使用不同技术的示例,在这种情况下,您可以使用 cvlib 它有一个 class object_detection
来检测多个 classes。这使用 yolov4 权重,您将能够检测到道路上的任何汽车,或者在这种情况下通过一个网络摄像头检测到任何汽车,只需确保汽车在摄像头前面而不是在 2d 位置。
import cv2
import matplotlib.pyplot as plt
# pip install cvlib
import cvlib as cv
from cvlib.object_detection import draw_bbox
im = cv2.imread('cars3.jpg')
#cv2.imshow("cars", im)
#cv2.waitKey(0)
bbox, label, conf = cv.detect_common_objects(im)
#yolov4 weights will be downloaded. Check: C:\Users\USER_NAME\.cvlib\object_detection\yolo
# if the download was not successful delete yolo folder and try again, it will be downloaded again
# after download the weights keep running the script it will say 0 cars, then close Anaconda spyder anda reopen it and try again.
#get bbox
output_image_with_bbox = draw_bbox(im, bbox, label, conf)
number_cars = label.count('car')
if number_cars > 5:
print('Number of cars in the image is: '+ str(number_cars))
plt.imshow(output_image_with_bbox)
plt.show()
else:
print('Number of cars in the image is: '+ str(number_cars))
plt.imshow(im)
plt.show()
输出:
你好。
您有一组检测结果。
您只需对数组调用 len()
即可获取元素数。这是Python.
的内置函数
cars = car_tracker.detectMultiScale(grayscaled_frame)
if len(cars) >= 5:
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
不需要任何其他库。
我正在尝试创建一个程序,在该程序中我的代码可以分析来自我的安全摄像头的视频并定位已被发现的汽车。我已经想出如何找到汽车并在它们周围绘制红色矩形,但我想添加一个条件,如果检测到超过 5 辆汽车,则只绘制框。但是,由于存在数组,我无法这样做。我将如何修复此代码?
import cv2
classifier_file = 'cars.xml'
car_tracker = cv2.CascadeClassifier(classifier_file)
video = cv2.VideoCapture("footage.mp4")
while True:
(read_successful, frame) = video.read()
if read_successful:
grayscaled_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
break
cars = car_tracker.detectMultiScale(grayscaled_frame)
if cars > 4:
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('Car Detector', frame)
cv2.waitKey(0)
顺便说一下,我正在使用 anaconda 环境以及 python 3.8.8
这是一个使用不同技术的示例,在这种情况下,您可以使用 cvlib 它有一个 class object_detection
来检测多个 classes。这使用 yolov4 权重,您将能够检测到道路上的任何汽车,或者在这种情况下通过一个网络摄像头检测到任何汽车,只需确保汽车在摄像头前面而不是在 2d 位置。
import cv2
import matplotlib.pyplot as plt
# pip install cvlib
import cvlib as cv
from cvlib.object_detection import draw_bbox
im = cv2.imread('cars3.jpg')
#cv2.imshow("cars", im)
#cv2.waitKey(0)
bbox, label, conf = cv.detect_common_objects(im)
#yolov4 weights will be downloaded. Check: C:\Users\USER_NAME\.cvlib\object_detection\yolo
# if the download was not successful delete yolo folder and try again, it will be downloaded again
# after download the weights keep running the script it will say 0 cars, then close Anaconda spyder anda reopen it and try again.
#get bbox
output_image_with_bbox = draw_bbox(im, bbox, label, conf)
number_cars = label.count('car')
if number_cars > 5:
print('Number of cars in the image is: '+ str(number_cars))
plt.imshow(output_image_with_bbox)
plt.show()
else:
print('Number of cars in the image is: '+ str(number_cars))
plt.imshow(im)
plt.show()
输出:
你好。
您有一组检测结果。
您只需对数组调用 len()
即可获取元素数。这是Python.
cars = car_tracker.detectMultiScale(grayscaled_frame)
if len(cars) >= 5:
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
不需要任何其他库。