我正在尝试从图像中识别文本,然后输出文本; 但是,出现此错误:
回溯(最近通话最近): 文件“ 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 -------")
我不知道如何解决这个问题, 谢谢。
答案 0 :(得分:3)
错误:!_src.empty() 在函数 'cv::cvtColor 中意味着传递给函数 cvtColor 的对象是空的或者说没有。 在这里,在以下行中 img 为 none
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
和 img 是以下函数的结果 -
img = cv2.imread(img_path)
img可以为空对象的可能原因是-
为了避免这个错误,检查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>