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

使用Picamera2运行AI图像识别程序遇Reshape错误求解决

问题原因及解决方案

核心问题:图像通道数不匹配

你使用Picamera2配置的格式是XRGB8888,这是4通道图像(包含一个额外的填充通道),而模型需要的是3通道(RGB/BGR)图像。resize后的图像尺寸为224×224×4,总元素数为224×224×4=200704,无法直接reshape为(1,224,224,3),这就是报错的根源。

具体修复步骤

1. 修正图像通道,保留RGB通道

在捕获图像后,先剔除多余的通道,将4通道转为3通道。XRGB8888的通道顺序是[X, R, G, B],需取后3个通道并转换为cv2兼容的BGR格式:

im = picam2.capture_array()
# 从XRGB8888中提取RGB通道,转为cv2的BGR格式
im = cv2.cvtColor(im, cv2.COLOR_XRGB2BGR)

2. 调整灰度转换的作用范围

当前代码中灰度转换仅用于显示,不应影响推理用的彩色图像,需确保操作对象分离:

# 先处理通道再resize
im = cv2.resize(im, (224, 224), cv2.INTER_NEAREST)
# 灰度图仅用于窗口显示,不修改推理用的im
grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("Camera", grey)

3. 修正模型推理的变量名错误

代码中model.predict(image)是变量名错误,应使用处理后的im变量:

prediction = model.predict(im)

4. 可选:直接配置Picamera2输出3通道格式

如果不需要4通道图像,可直接将Picamera2的输出格式改为3通道的RGB888,减少后续转换步骤:

picam2.configure(picam2.create_preview_configuration(main={"format": 'RGB888', "size": (640,480)}))

配置后捕获的图像直接是3通道,后续只需转为BGR格式即可适配cv2处理。

完整修复后的代码

import numpy as np
import tensorflow as tf
from keras.models import load_model
import cv2
from picamera2 import Picamera2

cv2.startWindowThread()

picam2 = Picamera2()
# 可选:直接配置为RGB888格式,减少通道转换操作
# picam2.configure(picam2.create_preview_configuration(main={"format": 'RGB888', "size": (640,480)}))
picam2.configure(picam2.create_preview_configuration(main={"format": 'XRGB8888', "size": (640,480)}))
picam2.start()

np.set_printoptions(suppress=True)
model = load_model("keras_model.h5", compile=False)
class_names = open("labels.txt", "r").readlines()

while True:
    im = picam2.capture_array()
    
    # 处理XRGB8888格式,转为BGR
    im = cv2.cvtColor(im, cv2.COLOR_XRGB2BGR)
    
    im = cv2.resize(im, (224, 224), cv2.INTER_NEAREST)

    # 灰度图仅用于窗口显示
    grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    cv2.imshow("Camera", grey)
    
    # 转换为模型输入格式
    im = np.asarray(im, dtype=np.float32).reshape(1, 224, 224, 3)
    im = (im / 127.5) - 1

    # 模型推理,修正变量名
    prediction = model.predict(im)
    index = np.argmax(prediction)
    class_name = class_names[index]
    confidence_score = prediction[0][index]
    
    print("Class:", class_name[2:], end="")
    print("Confidence Score:", str(np.round(confidence_score * 100))[:-2], "%")
    
    # 添加退出条件,按q键终止程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 清理窗口资源
cv2.destroyAllWindows()

额外说明

  • 测试时需添加退出逻辑(如按q键),避免程序无法正常终止。
  • 若使用RGB888格式,捕获的图像通道顺序为RGB,需转换为BGR格式适配cv2:im = cv2.cvtColor(im, cv2.COLOR_RGB2BGR),否则图像颜色会失真。

内容的提问来源于stack exchange,提问作者pao___

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:37:52