代码报错'numpy.ndarray' object has no attribute 'open',求解决方法
问题分析与解决
错误原因
你遇到的AttributeError: 'numpy.ndarray' object has no attribute 'open'是因为变量名冲突:
在循环中你把cv2读取的视频帧赋值给了Image变量,而这个名字和你导入的from PIL import Image中的Image类完全重名了。当后续执行Image.open(Imagepath)时,Python会认为你要调用这个numpy数组(视频帧)的open方法,而numpy数组根本没有这个方法,所以报错。
另外你的代码还有两个逻辑问题:
camera.release()和cv2.destroyAllWindows()被放在了while循环内部,这会导致第一次循环就释放相机资源,程序直接终止,无法正常进行视频预览和按键操作。tesseract函数定义在while循环内部,每次循环都会重复定义函数,完全没必要,而且未保存图片时就调用函数会因为test1.jpg不存在报错。
修复后的代码
import cv2 from PIL import Image from pytesseract import pytesseract def tesseract(): path_to_tesseract = "C:\\Program Files\\Tesseract-OCR\\tesseract.exe" Imagepath='test1.jpg' pytesseract.tesseract_cmd=path_to_tesseract text = pytesseract.image_to_string(Image.open(Imagepath)) print(text[:-1]) camera=cv2.VideoCapture(0) while True: _, frame = camera.read() # 重命名变量,避免和PIL.Image冲突 cv2.imshow('Text detection', frame) if cv2.waitKey(1) & 0xFF == ord('s'): cv2.imwrite('test1.jpg', frame) break # 释放资源和销毁窗口移到循环外 camera.release() cv2.destroyAllWindows() # 保存图片后再调用识别函数 tesseract()
关键修改点
- 将cv2读取的帧变量从
Image改为frame,彻底避免和PIL的Image类重名。 - 把
tesseract函数移到while循环外,只定义一次。 - 将
camera.release()和cv2.destroyAllWindows()移到while循环结束后,确保完成预览和保存操作后再释放资源。 - 仅在按下's'键保存图片并退出循环后,才调用
tesseract函数进行文字识别,避免文件未生成时的报错。
内容的提问来源于stack exchange,提问作者jhilmil agrawal
相关产品推荐
相关产品推荐

