0
votes

I have this code for text detection in video and it's giving this error every time I try to run it.

Here is my Code :

import cv2
import numpy as np
#from pytesser import *

def text_detection():
   cap=cv2.VideoCapture(0)
    while True:
        ret,img=cap.read()
        gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        ret1,mask= cv2.threshold(gray,180,255,cv2.THRESH_BINARY)
        image_final=cv2.bitwise_and(gray,gray,mask=mask)
        ret2,new_img= cv2.threshold(image_final,180,255,cv2.THRESH_BINARY)
        kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
        dilated=cv2.dilate(new_img,kernel,iterations=9)
        idk,contours,hierarchy=cv2.findContours(dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
        for contour in contours:
            [x,y,w,h]=cv2. boundingRect(contour)

            if w<35 and h<35:
                continue

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

         cv2.imshow('text_detect',img)
         k=cv2.waitKey(1)& 0xff
         if k==ord('q'):
            break
         cap.release()
         cv2.destroyAllWindows()



text_detection()

Error:

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.error: D:\Build\OpenCV\opencv-3.1.0\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor

Please Help me out in this.

2
Did you check if img is not None before it's used in cv2.cvtColor()? - fdelia

2 Answers

0
votes

It looks like you forgot to open() the cam.

import cv2

cam = cv2.VideoCapture(0)
cam.open(0)
results = [ cam.read()[0] for i in range(100) ]
print results

this code snippet should setup, open and verify that the capture is working for a 100 captures.

0
votes

It seems that there is no frame captured before converting it to Gray scale. You should add a check to verify whether frame has been captured or not before processing it further

import time

def text_detection():
   cap=cv2.VideoCapture(0)
    while True:
        ret,img=cap.read()

        """ adding 0.5 sec delay and verifying if the frame is captured or not.
            It will print the message if the frame is not captured. """

        time.sleep(0.5)
        if not ret:
           print('No frame is captured')
           break

        gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        ret1,mask= cv2.threshold(gray,180,255,cv2.THRESH_BINARY)

""" 
perform your normal processing

"""