17

I am trying to recognize text from an image to then have the text outputted; however, this error spits out:

Traceback (most recent call last): File "C:/Users/Benji's Beast/AppData/Local/Programs/Python/Python37-32/imageDet.py", line 41, in print(get_string(src_path + "cont.jpg") ) File "C:/Users/Benji's Beast/AppData/Local/Programs/Python/Python37-32/imageDet.py", line 15, in get_string img = 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'

The image resolution is 1371x51. I have tried changing the "/" on src_path to "\" but that didn't work. Any ideas?

Here is my code:

import cv2
import numpy as np
import pytesseract
from PIL import Image
from pytesseract import image_to_string

# Path of working folder on Disk
src_path = "C:/Users/Benji's Beast/Desktop/image.PNG"

def get_string(img_path):
    # Read image with opencv
    img = cv2.imread(img_path)

    # Convert to gray
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # Apply dilation and erosion to remove some noise
    kernel = np.ones((1, 1), np.uint8)
    img = cv2.dilate(img, kernel, iterations=1)
    img = cv2.erode(img, kernel, iterations=1)

    # Write image after removed noise
    cv2.imwrite(src_path + "removed_noise.png", img)

    #  Apply threshold to get image with only black and white
    #img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)

    # Write the image after apply opencv to do some ...
    cv2.imwrite(src_path + "thres.png", img)

    # Recognize text with tesseract for python
    result = pytesseract.image_to_string(Image.open(src_path + "thres.png"))

    # Remove template file
    #os.remove(temp)

    return result


print('--- Start recognize text from image ---')
print(get_string(src_path + "cont.jpg") )

print("------ Done -------")

I have no idea how to fix this, thanks.

Christoph Rackwitz
  • 11,317
  • 4
  • 27
  • 36
Benji
  • 197
  • 1
  • 1
  • 5
  • 1
    You have a whitespace in your absolute path. Try copying this image in the same directory as your code and remove the absolute part – Saransh Kejriwal Dec 26 '18 at 04:44

12 Answers12

20

This means you are passing a Uninitialized variable to

> cv2.cvtColor()

After this statement:

# Read image with opencv
img = cv2.imread(img_path)

Can you try to print the img variable before passing to cv2.cvtColor() function

> print(img) or print(img.shape)

to make sure function call to read the image is successful

rahul4data
  • 261
  • 2
  • 5
  • Right. And in my case I used a wrong filename, here png instead of jpg. Thx for your hint. – Semo Nov 24 '20 at 07:52
  • while True: success, img = cap.read() if img is None: break cv2.imshow("Video", img) if cv2.waitKey(10) & 0xFF == ord('q'): break – Nipun David Sep 13 '21 at 18:40
8

Error: !_src.empty() in function 'cv::cvtColor means the object passed to function cvtColor is empty or say none. Here, in the following line img is none

cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

and img is result of following function -

img = cv2.imread(img_path)

The possible reasons, why img can be empty object are -

  1. The image path is not correct, try absolute path and check image file extension.
  2. The image file is not accessible. There could be permission issue.

To avoid this error check if img object is None, if it is not none then only pass it to cvtColor function.

img = cv2.imread(img_path)
if(img is not None):
    cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Namrata
  • 81
  • 1
  • 3
4

If anyone came here searching this error message on Google but this error for you is for a video rather than an image, one possible reason might be you just ran out of frames to read from the video. reference

while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # Our operations on the frame come here
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

Using ret to check the end of the video is common practice but you may have forgotten to mention it or do the operations on the frame before checking if the frame is available or not (ret == True) like me. Cheers.

greysou1
  • 346
  • 3
  • 8
3

This error occurs when the image is in one format and in the python program you specify other format.

Example:

File Path= /home/user/image.jpg

but in the python program you read the image as jpeg

img = cv.imread("image.jpeg")

Then you will be facing this error. Change the file format to .jpg in imread() method as well

2

I think your source path should be:

src_path = "C:/Users/Benji's Beast/Desktop/"

Because in here get_string(src_path + "cont.jpg") you've concatenated the image name.

Ishara Madhawa
  • 3,549
  • 5
  • 24
  • 42
1

The problems are this one

src_path = "C:/Users/Benji's Beast/Desktop/image.PNG"

and this one

print(get_string(src_path + "cont.jpg") )

You are appending the image input file name from image.PNG to image.PNG.cont.jpg

If your input image filename is cont.jpg and it is located on your Desktop, then try to replace your code with :

src_path = "C:\Users\Benji's Beast\Desktop\"

and

print(get_string(src_path + "cont.jpg") )
gameon67
  • 3,981
  • 5
  • 35
  • 61
1

This error occurs when the image is in one format and in the python program you specify other format.

So while importing and exporting do keep the file extension same and specifiy it. This worked for me

1

Also this error could be caused because of diacritics in path/file name if you are using Windows

Qwedon
  • 23
  • 5
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community May 23 '22 at 14:57
0

if path and image name is verified and correct then just close the jupyter notebook (or whatever platform you are using) and restart it. It worked for me.

init-22
  • 66
  • 2
  • 6
0

What worked under windows 10 , 64 bit, using Python 3.7.5 :

This didnt work : image = cv2.imread('C:\ML\test.jpg')

This worked : image = cv2.imread('C:\\ML\\test.jpg')

steve
  • 395
  • 2
  • 11
  • This case is a simple duplicate of the extremely common FAQ https://stackoverflow.com/questions/2953834/windows-path-in-python – tripleee Aug 30 '22 at 06:47
  • I added my comment to help people in the future.... – steve Sep 08 '22 at 06:35
  • It seems that your problem was unrelated to this particular question; but similarly, the comment I added should hopefully help someone who actually experiences your problem. – tripleee Sep 08 '22 at 06:37
  • Actually it was related, as it references "C:/..." etc. which is windows related. Anyway, if it helps someone, all good. – steve Sep 08 '22 at 06:39
  • But the code in the question has forward slashes, so they are not experiencing this particular problem. The linked question explains why forward slashes are preferable, but it's not the reason for the traceback in the question you are posting this as an answer to. – tripleee Sep 08 '22 at 06:40
  • I think youre missing my point, but thats fine. Have a nice day.... – steve Sep 08 '22 at 06:52
-1
new_img = 'Correct_path/Sample.png'

Please check the image path. This error usually occurs when the image is not loaded correctly in any way by giving the wrong image location.

Try to assign a different path.

Try by giving full path.

Am_official
  • 467
  • 4
  • 5
  • Maybe see also [What exactly is current working directory?](https://stackoverflow.com/questions/45591428/what-exactly-is-current-working-directory) – tripleee Sep 08 '22 at 07:04
-4

Replace your this sub code:

    # Read image with opencv
    img = cv2.imread(img_path)

with below code adding if condition for ret:

    # Read image with opencv
    ret,img = cv2.imread(img_path)
    if ret == True:
        <your code>