Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV VideoCapture and error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

Tags:

python

opencv

Currently using Windows 10 with Python 3.7 I tried running with this code in order to get the webcam to function for use in number recognition

def get_img_contour_thresh(img):
   x, y, w, h = 0, 0, 300, 300
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   blur = cv2.GaussianBlur(gray, (5, 5), 0)
   ret, thresh1 = cv2.threshold(blur, 175, 255, cv2.THRESH_BINARY_INV + 
     cv2.THRESH_OTSU)
   thresh1 = thresh1[y:y + h, x:x + w]
   contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, 
     cv2.CHAIN_APPROX_SIMPLE)[-2:]
   return img, contours, thresh1

def show_webcam(mirror=False):
   # load json and create model
   json_file = open('model.json', 'r')
   loaded_model_json = json_file.read()
   json_file.close()
   model = model_from_json(loaded_model_json)
   # load weights into new model
   model.load_weights("model.h5")
   print("Loaded model from disk")

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    img, contours, thresh = get_img_contour_thresh(img)
    ans = ''


    if len(contours) > 0:
        contour = max(contours, key=cv2.contourArea)
        if cv2.contourArea(contour) > 500:
            x, y, w, h = cv2.boundingRect(contour)
            newImage = thresh[y:y + h, x:x + w]
            newImage = cv2.resize(newImage, (28, 28))
            newImage = np.array(newImage)
            newImage = newImage.astype('float32')
            newImage /= 255

            if K.image_data_format() == 'channels_first':
                newImage = newImage.reshape(1, 28, 28)
            else:
                newImage = newImage.reshape(28, 28, 1)
            newImage = np.expand_dims(newImage, axis=0)
            ans = model.predict(newImage).argmax()


    x, y, w, h = 0, 0, 300, 300
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.putText(img, "CNN : " + str(ans), (10, 320),
                cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
    cv2.imshow("Frame", img)
    cv2.imshow("Contours", thresh)     


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


def main():
   show_webcam(mirror=True)


if __name__ == '__main__':
   main()

I receive this error

 File "cam.py", line 75, in <module>
   main()
 File "cam.py", line 71, in main
   show_webcam(mirror=True)
 File "cam.py", line 34, in show_webcam
   img, contours, thresh = get_img_contour_thresh(img)
 File "cam.py", line 10, in get_img_contour_thresh
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 cv2.error: OpenCV(3.4.4) C:\projects\opencv- 
   python\opencv\modules\imgproc\src\color.cpp:181: error: (-215:Assertion 
   failed) !_src.empty() in function 'cv::cvtColor'

Iv been looking for a solution for a while but havent had any luck in figuring this out, tried looking around but just cant figure it out, what do you guys think? Appreciate the help given

like image 518
Alex3Fleming Avatar asked Jan 10 '19 02:01

Alex3Fleming


1 Answers

The error you're seeing is one that happens if None gets passed on cv2.cvtColor.

After

ret, img = cap.read()

it's a good idea to check that img is not None before proceeding. Depending on your input source, cap.read() can fail. On one my laptops, it fails at least once before starting to return valid images.

like image 64
Dave W. Smith Avatar answered Oct 24 '22 16:10

Dave W. Smith