(-215:断言失败)函数'cv :: cvtColor'中的!_src.empty()

时间:2018-12-26 01:18:16

标签: python ocr tesseract cv2 python-tesseract

我正在尝试从图像中识别文本,然后输出文本; 但是,出现此错误:

  

回溯(最近通话最近):         文件“ C:/ Users / Benji's Beast / AppData / Local / Programs / Python / Python37-32 / imageDet.py”,第41行,在           打印(get_string(src_path +“ cont.jpg”))         文件“ C:/ Users / Benji's Beast / AppData / Local / Programs / Python / Python37-32 / imageDet.py”,第15行,位于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:错误:(-215:断言失败)!_src.empty()在函数中'cv :: cvtColor'

图像分辨率为1371x51。 我尝试将src_path上的“ /”更改为“ \”,但这没有用。 有什么想法吗?

这是我的代码:

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 -------")

我不知道如何解决这个问题, 谢谢。

9 个答案:

答案 0 :(得分:3)

错误:!_src.empty() 在函数 'cv::cvtColor 中意味着传递给函数 cvtColor 的对象是空的或者说没有。 在这里,在以下行中 img 为 none

cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

和 img 是以下函数的结果 -

img = cv2.imread(img_path)

img可以为空对象的可能原因是-

  1. 图片路径不正确,尝试绝对路径并检查图片文件扩展名。
  2. 无法访问图像文件。可能存在权限问题。

为了避免这个错误,检查img对象是否为None,如果不是none,则只将其传递给cvtColor函数。

img = cv2.imread(img_path)
if(img is not None):
    cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

答案 1 :(得分:1)

当图像采用一种格式并且在python程序中指定其他格式时,会发生此错误。

示例

File Path= /home/user/image.jpg

但是在python程序中,您将图像读取为jpeg

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

然后您将遇到此错误

答案 2 :(得分:0)

我认为您的来源路径应为:

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

因为在这里get_string(src_path + "cont.jpg"),您已经连接了图像名称。

答案 3 :(得分:0)

问题就是这个

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

还有这个

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

您要将图像输入文件名从 image.PNG 附加到 image.PNG.cont.jpg

如果您输入的图像文件名是cont.jpg且位于桌面上,请尝试将代码替换为:

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

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

答案 4 :(得分:0)

这意味着您要将未初始化的变量传递给

> cv2.cvtColor()

在此声明之后:

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

在传递给cv2.cvtColor()函数之前,您是否可以尝试打印img变量

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

确保读取图像的函数调用成功

答案 5 :(得分:0)

如果路径和图像名称已验证且正确,则只需关闭jupyter笔记本(或正在使用的任何平台),然后重新启动即可。它为我工作。

答案 6 :(得分:0)

当图像为一种格式而在python程序中指定另一种格式时会发生此错误。

因此,在导入和导出时,请保持文件扩展名相同并指定它。 这对我有用

答案 7 :(得分:0)

如果有人来到这里在 Google 上搜索此错误消息,但对您而言,此错误是针对视频而不是图像,一个可能的原因可能是您刚刚从视频中读取帧数不足。 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)

使用 ret 检查视频的结尾是常见的做法,但您可能已经忘记提及它或在检查帧是否可用之前对帧进行操作(ret == True)(ret == True)。干杯。

答案 8 :(得分:0)

替换你的这个子代码:

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

使用下面的代码添加 ret 的 if 条件:

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