|
|
硬件主板型号: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()
|
|