Если автомобиль распознается, сделайте снимок

Запустите этот код для Python и OpenCv. Я хочу сделать, чтобы сохранить в моем наборе данных / проверить все изображения всех автомобилей, обнаруженных инструментом. Запустите мой код с помощью

python3 car_detection y0d$ python3 build_car_dataset.py -c cars.xml -o dataset/test

Поэтому, когда я обнаруживаю лицо и помещаю прямоугольник на лицо, я создал функцию if, которая говорит, что если лицо распознано и имеет прямоугольник на изображении, то, пожалуйста, сохраните изображение этого лица до желаемого результата

if rects:
            p = os.path.sep.join([args["output"], "{}.png".format(str(total).zfill(5))])
            cv2.imwrite(p, orig)
            total += 1

Итак, я получил ошибку: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()что мне делать? Заранее спасибо!

Мой полный код:

# USAGE
# python3 build_car_dataset.py --cascade haarcascade_frontalface_default.xml --output dataset/test
#  python3 build_face_dataset.py -c haarcascade_licence_plate_rus_16stages_original.xml -o dataset/test
#python3 build_face_dataset.py -c haarcascade_licence_plate_rus_16stages_original.xml -o dataset/test
#python3 build_car_dataset.py -c cars.xml -o dataset/test
from imutils.video import VideoStream
import argparse, imutils, time, cv2, os

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--cascade", required=True,
    help = "path to where the face cascade resides")
ap.add_argument("-o", "--output", required=True,
    help="path to output directory")
args = vars(ap.parse_args())

# load OpenCV's Haar cascade for face detection from disk
detector = cv2.CascadeClassifier(args["cascade"])

# initialize the video stream, allow the camera sensor to warm up and initialize the total number of example faces written to disk  thus far
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
# vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)
total = 0
# loop over the frames from the video stream
while True:
    # grab the frame from the threaded video stream, clone it, (just in case we want to write it to disk), and then resize the frame
    # so we can apply face detection faster
    frame = vs.read()
    orig = frame.copy()
    frame = imutils.resize(frame, width=400)
    # detect faces in the grayscale frame
    rects = detector.detectMultiScale(
        cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), scaleFactor=1.1, 
        minNeighbors=5, minSize=(30, 30))
    # loop over the face detections and draw them on the frame
    for (x, y, w, h) in rects:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        if rects:
            p = os.path.sep.join([args["output"], "{}.png".format(str(total).zfill(5))])
            cv2.imwrite(p, orig)
            total += 1

    # show the output frame
    cv2.imshow("Frame", frame)

    key = cv2.waitKey(1) & 0xFF 


    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break
# do a bit of cleanup
print("[INFO] {} face images stored".format(total))
print("[INFO] cleaning up...")
cv2.destroyAllWindows()
vs.stop()

python,opencv,

0

Ответов: 2


1 принят

Заменить:

if rects:

с:

if rects is not None :

или с:

if rects != None :

и ты будешь золотой =)

Я имею в виду, вы все равно не сможете обнаружить автомобили, но, по крайней мере, ошибка исчезнет. Для обнаружения автомобиля я бы рекомендовал использовать CNN (сверточные нейронные сети), google для «YOLO CNN» или «SSD CNN» - существует много уже существующих проектов, которые обнаруживают автомобили, вы можете легко дать себе хороший старт ,


0

Допустим, rects = [[1, 2, 3, 4], [3,4, 5, 6]]

for (x, y, w, h) in rects:
    print("I got here:", x, y, w, h)

будет печатать:

I got here: 1 2 3 4
I got here: 3 4 5 6

Но если rects = Noneвы получите ошибку, 'NoneType' object is not iterable если rects = []вы не получите выход, и ничего внутри цикла не будет.

В основном, я говорю, что, поскольку ваш if rectsкод находится внутри цикла, который проходит цикл rects, вам уже гарантировано, что у rectsнего есть информация, так как ваш код должен rectsбыть непустым итерабельным, чтобы зайти так далеко.

То, что вы, вероятно, действительно хотите сделать, это проверить if rectsдо того, как зациклится на нем. Чтобы быть питоническим, мы просим прощения, а не разрешения:

rects = None
try:
    for (x, y, w, h) in rects:
        print("I got here:", x, y, w, h)
except TypeError:
    print("no rects")

# no rects

Обратите внимание, что ваша ошибка имеет мало общего с большинством вашего кода. Обязательно попробуйте уменьшить свою проблему до наименьшего возможного воспроизводимого примера, который имеет ту же проблему. Часто, делая это, он помогает решить проблему.

питон, OpenCV,
Похожие вопросы