2016-04-06 2 views
0

Я пытаюсь удалить тень с порогом и обнаружить движение на живой камере. вот моя программа:обнаружение с контуром и показать его Ошибка

import cv2 
import numpy as np 

cam = cv2.VideoCapture(0) 

while True: 

    t=cam.read()[1] 
    t0=cv2.cvtColor(cam.read()[1],cv2.COLOR_RGB2GRAY) 
    t1=cv2.cvtColor(cam.read()[1],cv2.COLOR_RGB2GRAY) 
    t2=cv2.cvtColor(cam.read()[1],cv2.COLOR_RGB2GRAY) 

    a1=cv2.absdiff(t0,t1) 
    a2=cv2.absdiff(t1,t2) 
    b=cv2.bitwise_and(a1,a2) 

    ret,thresh0=cv2.threshold(b,30,255,cv2.THRESH_BINARY) 
    thresh1=cv2.bitwise_and(t1,thresh0) 
    contours,hierarchy=cv2.findContours(thresh0,1,2) 
    cnt=contours[0] 
    x,y,w,h=cv2.boundingRect(cnt) 
    img=cv2.rectangle(t1,(x,y),(x+w,y+h),(0,255,0),2) 

    cv2.imshow("winName",t1) 
    cv2.imshow("detect",img) 


    key=cv2.waitKey(10) 
    if key==27: 
     cv2.destroyAllwindow() 
     break 
print "End" 

Но возникают следующие ошибки:

in line (cv2.imshow("detect",img)) which stop with this error : 
    cv2.imshow("thresh",img) 

error: /home/rayannik/opencv-2.4.10/modules/highgui/src/window.cpp:261:  
error: (-215) size.width>0 && size.height>0 in function imshow 

Если мы будем игнорировать эту линию, это будет работать только тогда, когда что-то двигаться всегда на передней части камеры в противном случае остановки с этой ошибкой :

cnt=contours[0] 
IndexError: list index out of range 

ответ

0

проблема заключается с линией:

img=cv2.rectangle(t1,(x,y),(x+w,y+h),(0,255,0),2) 

В основном метод cv2.rectangle() изменяет входной коврик на месте и возвращает None, поэтому параметр t1 изменяется на месте и так как возвращаемый тип None, так что переменная img которые вы используете в imshow() является None.

Удалить все cv2.imshow("detect",img), так как изменения уже отражены в окне cv2.imshow("winName",t1).

Во-вторых, cnt=contours[0] поднимает IndexOutOfBounds ошибка, потому что, cv2.findCountours() не нашёл никаких контуров во входных матах. Вы всегда должны проходить только BinaryImage методу cv2.findCountours, а также проверить перед обращением к countours как:

if (len(contours) > 0): # this condition would prevent the IndexOutOfBounds error 
    cnt=contours[0]