【问题标题】:(-215:Assertion failed) !_src.empty() in function 'cv::cvtColor' with cv::imread(-215:Assertion failed) !_src.empty() in function 'cv::cvtColor' with cv::imread
【发布时间】:2019-05-24 09:32:39
【问题描述】:

我正在尝试从图像中识别文本,然后输出文本; 然而,这个错误吐了出来:

Traceback(最近一次调用最后一次): 文件“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: error: (-215:Assertion failed) !_src.empty() in function '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 -------")

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

【问题讨论】:

  • 您的绝对路径中有一个空格。尝试将此图像复制到与您的代码相同的目录中并删除绝对部分

标签: python ocr tesseract cv2 python-tesseract


【解决方案1】:

这意味着你将一个未初始化的变量传递给

> cv2.cvtColor()

在此声明之后:

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

你可以在传递给 cv2.cvtColor() 函数之前尝试打印 img 变量吗

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

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

【讨论】:

  • 对。在我的情况下,我使用了错误的文件名,这里是 png 而不是 jpg。谢谢你的提示。
  • while True: 成功, img = cap.read() if img is None: break cv2.imshow("Video", img) if cv2.waitKey(10) & 0xFF == ord(' q'): 中断
【解决方案2】:

错误:函数 'cv::cvtColor 中的 !_src.empty() 表示传递给函数 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)

【讨论】:

    【解决方案3】:

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

    示例

    File Path= /home/user/image.jpg
    

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

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

    那么你将面临这个错误

    【讨论】:

    • 这对我有用,谢谢 Murali。我习惯使用.jpg 而不是.jpeg :p
    【解决方案4】:

    如果有人来到这里在 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),就像我一样。干杯。

    【讨论】:

      【解决方案5】:

      问题是这个

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

      【讨论】:

        【解决方案6】:

        我认为你的源路径应该是:

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

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

        【讨论】:

          【解决方案7】:

          如果路径和图像名称已验证且正确,则只需关闭 jupyter notebook(或您正在使用的任何平台)并重新启动它。它对我有用。

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              我在处理视频帧时遇到了这个问题。我解决了这个问题 这边。

              while True:
              
                success,img = cap.read()
              
                if not success:
                   break
              
                #Convert to gray
                img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
              

              【讨论】:

                【解决方案10】:

                替换你的这个子代码:

                    # 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>
                

                【讨论】:

                • 那个答案是完全错误的。 imread 不返回元组
                猜你喜欢
                • 2019-08-30
                • 2019-06-26
                • 2021-04-19
                • 2021-07-30
                • 2023-04-01
                • 1970-01-01
                • 2019-11-12
                • 2021-02-08
                • 1970-01-01
                相关资源
                最近更新 更多