как остановить программу, когда видео заканчивается на opencv python - PullRequest
0 голосов
/ 05 мая 2020

привет, у меня небольшая проблема. прямо сейчас я делаю проект, который обнаруживает велосипеды, когда они останавливаются на кресте зебры с opencv python. программа работает очень хорошо. но когда я запускаю его до тех пор, пока видео не закончится, появляется сообщение об ошибке: «frame_ROI = frame [point1 [1]: point2 [1], point1 [0]: point2 [0]] TypeError: объект 'NoneType' не может быть подписан»

Я предполагаю, что, поскольку, когда я запускаю видео до его конца, в области ROI нечего обнаруживать, потому что видео больше не доступно, а затем появляется ошибка. когда я пытаюсь остановить видео с помощью 'q', ошибка не появляется.

, а затем у меня есть идея, что, если я просто остановлю видео до его окончания. но я не знаю, как это сделать

import cv2
import numpy as np
import pygame
import datetime as dt
from pygame import mixer
import time

#=============== Variable Mouse ==================#
drawing = False
point1 = ()
point2 = ()

drawingTwo = False
pointTwo_1 = ()
pointTwo_2 = ()
Mouse_count = False
#================================================#
def mouse_drawing(event, x, y, flags, params):
    global point1, point2, drawing
    global pointTwo_1, pointTwo_2, drawingTwo, Mouse_count

    #----------Mouse 1-------
    if Mouse_count == False:
        if event == cv2.EVENT_LBUTTONDOWN:
            if drawing is False:
                drawing = True
                point1 = (x, y)
            #else:
                #drawing = False

        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing is True:
                point2 = (x, y)
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            Mouse_count = True


            
#================================================#
lastTime = dt.datetime.now()
currentTime = dt.datetime.now()

#Make Sound
pygame.mixer.init()


#create VideoCapture object and read from video file


cap = cv2.VideoCapture('test13.mp4')

cv2.namedWindow("Detecion motor")
cv2.setMouseCallback("Detecion motor", mouse_drawing)

while True:
    ret, frame = cap.read()
    car_cascade = cv2.CascadeClassifier('cascade11.xml')

    #============================== ROI One ============================#
    if point1 and point2:

        #Rectangle marker
        r = cv2.rectangle(frame, point1, point2, (200, 100, 400), 5)
        frame_ROI = frame[point1[1]:point2[1],point1[0]:point2[0]]

        #------------------Detect car ROI-------------------#
        if drawing is False:
            #convert video into gray scale of each frames
            ROI_grayscale = cv2.cvtColor(frame_ROI, cv2.COLOR_BGR2GRAY)
            #detect cars in the video
            cars_ROI = car_cascade.detectMultiScale(ROI_grayscale, 1.1, 3)
            if len(cars_ROI) > 0:
                if (currentTime - lastTime).seconds > 20:
                    lastTime = dt.datetime.now()
                    sound = mixer.Sound('sirine2.wav')
                    sound.play()

            for (x, y, w, h) in cars_ROI:
                cv2.rectangle(frame_ROI, (x, y), (x + w, y + h), (0, 255, 0), 2)
                currentTime = dt.datetime.now()
                # cv2.putText(frame_ROI, "Jumlah Motor : " + str(cars_ROI.shape[0]), (10,frame_ROI.shape[0] -25), cv2.FONT_HERSHEY_TRIPLEX, 0.5,(0,255,0), 1)
            # -------------------------------------------------#

    #============================== ROI Two ============================#

    #==================================================================#
    cv2.imshow("Detecion motor", frame)

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

cap.release()
cv2.destroyAllWindows()


!!!and the error is

Traceback (most recent call last):
  File "D:/Skripsi/CarDetection-master/DeteksiMotor.py", line 65, in <module>
    frame_ROI = frame[point1[1]:point2[1],point1[0]:point2[0]]
TypeError: 'NoneType' object is not subscriptable

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Используйте ret из этой строки

ret, frame = cap.read() # ret denotes whether frame obtained or not

Введите al oop while(ret): и поместите весь свой код из car_cascade в оператор break в этом l oop. После этого, пока l oop заканчивается, поставьте оператор break. Прочтите рамки в конце l oop. Я внес необходимые изменения в ваш код. Проверьте это.

import cv2
import numpy as np
import pygame
import datetime as dt
from pygame import mixer
import time

#=============== Variable Mouse ==================#
drawing = False
point1 = ()
point2 = ()

drawingTwo = False
pointTwo_1 = ()
pointTwo_2 = ()
Mouse_count = False
#================================================#
def mouse_drawing(event, x, y, flags, params):
    global point1, point2, drawing
    global pointTwo_1, pointTwo_2, drawingTwo, Mouse_count

    #----------Mouse 1-------
    if Mouse_count == False:
        if event == cv2.EVENT_LBUTTONDOWN:
            if drawing is False:
                drawing = True
                point1 = (x, y)
            #else:
                #drawing = False

        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing is True:
                point2 = (x, y)
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            Mouse_count = True


            
#================================================#
lastTime = dt.datetime.now()
currentTime = dt.datetime.now()

#Make Sound
pygame.mixer.init()


#create VideoCapture object and read from video file


cap = cv2.VideoCapture('test13.mp4')

cv2.namedWindow("Detecion motor")
cv2.setMouseCallback("Detecion motor", mouse_drawing)
while True:
    ret, frame = cap.read()
    while(ret):
        
        car_cascade = cv2.CascadeClassifier('cascade11.xml')

        #============================== ROI One ============================#
        if point1 and point2:

            #Rectangle marker
            r = cv2.rectangle(frame, point1, point2, (200, 100, 400), 5)
            frame_ROI = frame[point1[1]:point2[1],point1[0]:point2[0]]

            #------------------Detect car ROI-------------------#
            if drawing is False:
                #convert video into gray scale of each frames
                ROI_grayscale = cv2.cvtColor(frame_ROI, cv2.COLOR_BGR2GRAY)
                #detect cars in the video
                cars_ROI = car_cascade.detectMultiScale(ROI_grayscale, 1.1, 3)
                if len(cars_ROI) > 0:
                    if (currentTime - lastTime).seconds > 20:
                        lastTime = dt.datetime.now()
                        sound = mixer.Sound('sirine2.wav')
                        sound.play()

                for (x, y, w, h) in cars_ROI:
                    cv2.rectangle(frame_ROI, (x, y), (x + w, y + h), (0, 255, 0), 2)
                    currentTime = dt.datetime.now()
                    # cv2.putText(frame_ROI, "Jumlah Motor : " + str(cars_ROI.shape[0]), (10,frame_ROI.shape[0] -25), cv2.FONT_HERSHEY_TRIPLEX, 0.5,(0,255,0), 1)
                # -------------------------------------------------#

        #============================== ROI Two ============================#

        #==================================================================#
        cv2.imshow("Detecion motor", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
             break
        ret, frame = cap.read()
    break

    cap.release()
    cv2.destroyAllWindows()
0 голосов
/ 05 мая 2020

Вы ищете raise SystemExit? Он немедленно завершает вашу программу при запуске

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...