如何修复OpenCV Python中“SystemError: <built-in function imshow> returned NULL...”错误
解决cv2.imshow()报错:SystemError: returned NULL without setting an error
嘿,这个问题其实一眼就能看出来——你把cv2.imshow()的参数顺序搞反啦!
OpenCV的imshow函数规则很明确:第一个参数必须是窗口名称(字符串类型),第二个参数才是要显示的图像对象。你现在写的cv2.imshow(img,'img')把图像放在了第一个位置,窗口名在后面,完全不符合函数的参数要求,这才导致了这个奇怪的返回NULL错误。
修正后的完整代码
把那行错误的代码替换掉,再加上窗口等待和销毁的语句(不然窗口会一闪而过根本看不到效果):
import pytesseract from pytesseract import Output import cv2 # 如果你还没设置Tesseract的安装路径,记得加上这行(路径根据你自己的安装位置调整) # pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files/Tesseract-OCR/tesseract.exe' img = cv2.imread('invoice.png') d = pytesseract.image_to_data(img, output_type=Output.DICT) n_boxes = len(d['level']) for i in range(n_boxes): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) # 修正参数顺序,加上窗口控制语句 cv2.imshow('img', img) cv2.waitKey(0) # 等待任意按键输入后关闭窗口 cv2.destroyAllWindows() # 销毁所有创建的OpenCV窗口
针对你的发票数据提取项目的小建议
- 图像预处理能大幅提升OCR准确率:发票图片可能存在倾斜、噪点、光照不均等问题,提取前可以做这些处理:
# 转灰度图 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应二值化,应对光照不均的情况 img_processed = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) - 正则提取日期要覆盖多格式:发票里的日期格式可能五花八门,比如
YYYY-MM-DD、DD/MM/YYYY、MM-DD-YYYY等,写正则表达式的时候尽量覆盖这些常见格式。 - 提前排查Tesseract路径问题:如果运行时提示找不到Tesseract引擎,一定要在代码开头指定它的安装路径,不然pytesseract没法正常调用OCR功能。
内容的提问来源于stack exchange,提问作者Mayur Satav
相关产品推荐
相关产品推荐

