2015-06-06 3 views
0

Я пытаюсь обнаружить объекты с использованием OpenCV и python. Это мой код, который я пытался запустить.Ошибка Python OpenCV: утверждение не выполнено (scn == 3 || scn == 4)

import cv2 

def diffImg(t0, t1, t2): 
    d1 = cv2.absdiff(t2, t1) 
    d2 = cv2.absdiff(t1, t0) 
    return cv2.bitwise_and(d1, d2) 

cam = cv2.VideoCapture(1) 

winName = "Movement Indicator" 
cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE) 

# Read three images first: 
t_minus = cv2.cvtColor(cam.read()[1], cv2.COLOR_BGR2GRAY) 
t = cv2.cvtColor(cam.read()[1], cv2.COLOR_BGR2GRAY) 
t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_BGR2GRAY) 

while True: 
    cv2.imshow(winName, diffImg(t_minus, t, t_plus)) 

    # Read next image 
    t_minus = t 
    t = t_plus 
    t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_GRAY2BGR) 

    key = cv2.waitKey(10) 
    if key == 27: 
    cv2.destroyWindow(winName) 
    break 

При запуске этого кода он дает следующую ошибку.

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file ..\..\..\..\opencv\modules\imgproc\src\color.cpp, line 3739 
Traceback (most recent call last): 
    File "C:/Users/Ravi/PycharmProjects/Test/thread1.py", line 14, in <module> 
    t_minus = cv2.cvtColor(cam.read()[1], cv2.COLOR_BGR2GRAY) 
cv2.error: ..\..\..\..\opencv\modules\imgproc\src\color.cpp:3739: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor 

Я попытался с изменением color.BRG2GRAY несколько способов (RGB2GRAY ... и т.д.), и я попытался с помощью моего веб-камеры по умолчанию и другие USB веб-камеры. Но в обоих случаях это дает ту же ошибку. Что я могу сделать, чтобы решить этот вопрос?

Когда я бегу же код в Ubuntu платформы, она дает следующие ошибки.

Traceback (most recent call last): 
    File "/home/ravi/PycharmProjects/Test/thread1.py", line 11, in <module> 
    cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE) 
AttributeError: 'module' object has no attribute 'CV_WINDOW_AUTOSIZE' 
+0

ошибка означает, что ваши входные изображения не имеют 3 или 4 канала, что предполагается для co lor изображения. Я не знаю о python api, но cam.read() [1] означает, что вы используете только номер канала 1? попробуйте использовать cam.read(). – Micka

+0

Я попробовал, но это дает 'src не цифровую ошибку tuple' @Micka – RYJ

+0

Вы можете прочитать изображение вместо переменной и нарисовать неизмененное изображение? и проверить, является ли захваченное изображение empzy, заранее? – Micka

ответ

0

cam.read() фактически возвращает 2 значения (вам, вероятно, не понадобится первое значение).

Так попробуйте это:

cam = cv2.VideoCapture(1) 
winName = "Movement Indicator" 
cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE) 

_,frame1 = cam.read() 
_,frame2 = cam.read() 
_,frame3 = cam.read() 

# Read three images first: 
t_minus = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) 
t = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) 
t_plus = cv2.cvtColor(frame3, cv2.COLOR_BGR2GRAY) 

И точно так же в следующем разделе:

while True: 
    cv2.imshow(winName, diffImg(t_minus, t, t_plus)) 

    # Read next image 
    t_minus = t 
    t = t_plus 
    _,frame = cam.read() 
    t_plus = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR) 

    key = cv2.waitKey(10) 
    if key == 27: 
    cv2.destroyWindow(winName) 
    break 
0

Для платформы Ubuntu: просто изменить атрибут cv2.CV_WINDOW_AUTOSIZE к cv2.WINDOW_NORMAL.This обусловлено OpenCV версия i думаю

import cv2 

def diffImg(t0, t1, t2): 
    d1 = cv2.absdiff(t2, t1) 
    d2 = cv2.absdiff(t1, t0) 
    return cv2.bitwise_and(d1, d2) 

cam = cv2.VideoCapture(0) 

winName = "Movement Indicator" 
cv2.namedWindow(winName, cv2.WINDOW_NORMAL) 

# Read three images first: 
t_minus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 
t = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 
t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 

while True: 
    cv2.imshow(winName, diffImg(t_minus, t, t_plus)) 

    # Read next image 
    t_minus = t 
    t = t_plus 
    t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 

    key = cv2.waitKey(10) 
    if key == 27: 
    cv2.destroyWindow(winName) 
    break 
Смежные вопросы