Следующий код работает безупречно в Mac Os X, но выдает ошибку в windows и raspberry os - PullRequest
0 голосов
/ 08 апреля 2019

Мы используем следующий код, чтобы обработать изображение, снятое видеокамерой, и классифицировать его как знак вперед, влево или вправо. Они все о трафике. При первом обнаружении вперед используется каскад. Каскад пытается найти стрелку вправо или влево. Если он не классифицирует его, то это прямое направление. Если он возвращает true, мы вызываем функцию decider deciderfun. Каждый раз, когда deciderfunc работает медленно (снова в Windows и Pi). Это решает, является ли это левым или правым. Теперь, когда я запускаю его под Mac OS X, он работает отлично. Но в windows это выдает следующую ошибку. Я думаю, что ошибка связана с захватом видео и чтением шапки. Как я могу исправить эту проблему? Заранее спасибо ..:

[ WARN:1] videoio(MSMF): OnReadSample() is called with error status: -1072873821
[ WARN:1] videoio(MSMF): async ReadSample() call is failed with error status: -1072873821
0 31
F
[ WARN:0] videoio(MSMF): can't grab frame. Error: -1072873821
Traceback (most recent call last):
File "C:/Users/merts/Desktop/the3r4yslayer-master/combiner.py", line 15, in <module>
\gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

[ WARN:0] terminating async callback

Process finished with exit code 1 

главный:

import cv2
import numpy as np
from forward import firstdetection
from decider import deciderfunc

cameraCapture = cv2.VideoCapture(1)
cv2.namedWindow('camera')
success, frame = cameraCapture.read()
forwardcounter = leftcounter = rightcounter = total = 0

while success:
    success, frame = cameraCapture.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    img = cv2.medianBlur(gray, 37)
    circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=160, param2=40)
    cv2.imshow('camera', frame)



    try:
        if circles is not None:
            flag = firstdetection()

            if flag:
                if deciderfunc():  # it gives answer about left or right
                    print('L')
                else:
                    print('R')
            else:
                print('F')  # will be replaced according to pi

    except:
        continue

решающая:

import cv2
import numpy as np


def deciderfunc():
    cap = cv2.VideoCapture(1)
    success, camera = cap.read()
    left = right = total = 0
    while success and total < 15:
        value_0 = value_1 = 0

        gray = cv2.cvtColor(camera, cv2.COLOR_BGR2GRAY)
        img = cv2.medianBlur(gray, 37)
        circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=160, param2=40)
        circles = np.uint16(np.around(circles))
        max_r, max_i = 0, 0
        for i in range(len(circles[:, :, 2][0])):
            if circles[:, :, 2][0][i] > 50 and circles[:, :, 2][0][i] > max_r:
                max_i = i
                max_r = circles[:, :, 2][0][i]
        x, y, r = circles[:, :, :][0][max_i]


        square = camera[y - r:y + r, x - r:x + r]
        zone_0 = square[square.shape[0] * 2 // 8:square.shape[0] * 6 // 8, square.shape[1] * 3 // 8:square.shape[1] * 4 // 8]
        gray_0 = cv2.cvtColor(zone_0, cv2.COLOR_BGR2GRAY)
        img_0 = cv2.medianBlur(gray_0, 37)
        zone_1 = square[square.shape[0] * 2 // 8:square.shape[0] * 6 // 8, square.shape[1] * 4 // 8:square.shape[1] * 5 // 8]
        gray_1 = cv2.cvtColor(zone_1, cv2.COLOR_BGR2GRAY)
        img_1 = cv2.medianBlur(gray_1, 37)
        image_data_0 = np.asarray(img_0)

        for i in range(len(image_data_0)):
            for j in range(len(image_data_0[0])):
                value_0 = value_0 + image_data_0[i][j]
        image_data_1 = np.asarray(img_1)

        for i in range(len(image_data_1)):
            for j in range(len(image_data_1[0])):
                value_1 = value_1 + image_data_1[i][j]

        if value_0 < value_1:
            left+=1
            total+=1
        else:
            right+=1
            total+=1

    if left>right:
        return 1

    else:
        return 0

вперед:

import cv2
def firstdetection():


    cameraCapture = cv2.VideoCapture(1)


    success, cap = cameraCapture.read()
    ok_cascade = cv2.CascadeClassifier('new_kocum.xml')      # this is the cascade we just made. Call what you want
    flag=0
    true_counter = 0
    false_counter = 0
    while success and flag<31:

        flag+=1
        img = cap
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        oks = ok_cascade.detectMultiScale(gray, 3, 4)
        if len(oks)!=0:
            true_counter+=1
            continue
        else:
            false_counter+=1
            continue
    if(true_counter>false_counter):
        cameraCapture.release()
        print(true_counter,false_counter)
        return True
    else:
        cameraCapture.release()
        print(true_counter,false_counter)
        return False

1 Ответ

0 голосов
/ 11 мая 2019

Скорее всего, вы читаете с несуществующего устройства.Вызов VideoCapture(1) инструктирует OoenCV читать с устройства № 1, но завершается неудачей, если его нет.Сначала попробуйте VideoCapture(0), так как веб-камера, скорее всего, появится там первой (если только в 0 нет другого устройства, в этом случае это может быть 1)

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