Toybrick

RK3588+USB摄像头+HDMI显示器

弓长想学code

新手上路

积分
37
发表于 2025-12-22 17:55:12    查看: 357|回复: 0 | [复制链接]    打印 | 显示全部楼层
硬件主板型号:TB-RK3588C0-A+TB-RK3588B1
固件名称/系统版本:Debian11
自编的或固件下载地址:开发板自带


用的rknnlite_api,使用python进行推理,摄像头捕获视频帧、rknn处理,如何把推理的结果显示在HDMI屏幕上
import cv2
import time
import numpy as np
import os  # 新增:用于设置环境变量
from rknnlite.api import RKNNLite

# ================= 配置区域 =================
# 您的模型路径
RKNN_MODEL = './model_480x640_i8.rknn'

# 模型输入的尺寸 (根据您的描述 H=480, W=640)
MODEL_WIDTH = 640
MODEL_HEIGHT = 480

# 摄像头ID
DEVICE_NAME = '/dev/video35'

# GStreamer 管道配置
# 1. v4l2src: 读取设备
# 2. mppjpegdec: 使用RK3588硬件解码MJPEG流
# 3. appsink: 将数据传给OpenCV (而不是 kmssink 显示到屏幕)
# 注意:我们将格式转为 BGR,因为这是 OpenCV 的默认格式,也更适合后续处理
GST_PIPELINE = (
    f"v4l2src device={DEVICE_NAME} ! "
    "image/jpeg, width=640, height=480, framerate=10/1 ! "
    "jpegparse ! mppjpegdec ! "
    "videoconvert ! video/x-raw, format=BGR ! "
    "appsink drop=true sync=false"
)
# ===========================================

def main():
    # --- 修复 SSH 下无法显示的问题 ---
    # 如果检测到没有设置 DISPLAY 环境变量(说明可能是 SSH),强制指定为 :0 (HDMI 屏幕)
    if 'DISPLAY' not in os.environ:
        print("--> Detect SSH environment, setting DISPLAY=:0 to show on HDMI screen...")
        os.environ['DISPLAY'] = ':0'
    # ----------------------------------

    # 1. 初始化 RKNN Lite
    rknn_lite = RKNNLite()

    # 加载模型
    print("--> Loading RKNN model...")
    ret = rknn_lite.load_rknn(RKNN_MODEL)
    if ret != 0:
        print('Load RKNN model failed')
        exit(ret)

    # 初始化运行时环境
    print("--> Init runtime environment...")
    ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2)
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print("--> RKNN Init Done!")

    # 2. 使用 GStreamer 管道打开摄像头
    # 注意:必须添加 cv2.CAP_GSTREAMER 参数
    print(f"--> Opening Camera with pipeline:\n{GST_PIPELINE}")
    cap = cv2.VideoCapture(GST_PIPELINE, cv2.CAP_GSTREAMER)

    if not cap.isOpened():
        print("Error: Could not open camera with GStreamer.")
        print("Tips: Ensure your OpenCV is compiled with GStreamer support.")
        exit()

    # GStreamer 管道已经锁定了分辨率,这里不需要再 set 宽高了

    fps = 0
    frame_count = 0
    start_time = time.time()

    print("--> Starting Video Loop. Press 'q' to quit.")

    try:
        while True:
            # 读取一帧
            ret, frame = cap.read()
            if not ret:
                print("Failed to grab frame")
                break

            # 3. 预处理
            # 此时 frame 已经是解码好的 BGR 数据,且分辨率应该是 640x480
            # 为了保险起见,或者如果模型需要不同尺寸,保留 resize
            if frame.shape[1] != MODEL_WIDTH or frame.shape[0] != MODEL_HEIGHT:
                input_img = cv2.resize(frame, (MODEL_WIDTH, MODEL_HEIGHT))
            else:
                input_img = frame

            # 增加 batch 维度
            input_data = np.expand_dims(input_img, axis=0)

            # 4. 模型推理
            outputs = rknn_lite.inference(inputs=[input_data])

            # =============================================================
            # 后处理逻辑...
            # =============================================================

            # 5. 计算 FPS 并显示
            frame_count += 1
            if frame_count >= 30:
                end_time = time.time()
                fps = frame_count / (end_time - start_time)
                start_time = time.time()
                frame_count = 0

            cv2.putText(frame, f"FPS: {fps:.1f}", (10, 30),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

            # 6. 显示结果
            # ----------------------------------------------
            # ----------------------------------------------
            # ----------------------------------------------
            # 将推理结果显示到HDMI屏幕上

            # 按 'q' 退出
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

    except KeyboardInterrupt:
        pass
    finally:
        cap.release()
        cv2.destroyAllWindows()
        rknn_lite.release()
        print("\n--> Bye!")

if __name__ == '__main__':
    main()


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表