You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码报错'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:35:19