PipeLine为什么会一直播放视频呢,即使我已经跳出了循环做其他的事情了,视频还是一直在播放

Viewed 72

问题描述


PipeLine为什么会一直播放视频呢,即使我已经跳出了循环做其他的事情了,视频还是一直在播放,我是想显示最后一张图片就好了,可是视频还是一直在播放,需要怎样停止呢

复现步骤


import time
import os
import sys
from libs.PipeLine import PipeLine, ScopedTiming
from media.sensor import *
from media.display import *
from media.media import *
import gc                        # 导入垃圾回收库 / Import garbage collection library
import ybUtils.YbKey as YbKey


#初始化pl
sensor = Sensor(width=640, height=480)
rgb888p_size=[640, 480]
display_mode='lcd'
display_size=[640,480]
sensor.reset()
sensor.set_framesize(width=640, height=480, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)

pl=PipeLine(rgb888p_size=rgb888p_size,display_size=display_size,display_mode=display_mode)
pl.create(sensor = sensor)
#pl.create()

#while True:
#    img = sensor.snapshot(chn=CAM_CHN_ID_1)
#    Display.show_image(img)
#    key = YbKey.YbKey()
#    # 按键检测和图片保存逻辑
#    # Button detection and image saving logic
#    if key.is_pressed() == 1:
#        break


pl.osd_img.clear()
print("afdf1")
while True:
    with ScopedTiming("total", 1):
#        frame = sensor.snapshot(chn=CAM_CHN_ID_2)
#        input_np=frame.to_numpy_ref()
#        Display.show_image(pl.osd_img, 0, 0, Display.LAYER_OSD3)
        img = pl.get_frame()
        print("afdf2")
        pl.show_image()
        key = YbKey.YbKey()
        # 按键检测和图片保存逻辑
        # Button detection and image saving logic
        if key.is_pressed() == 1:
            break

pl.osd_img.clear()
while True:
    print("afdf3")
2 Answers

你好,AIDemo中的摄像头是分两路的,一路是绑定到屏幕,显示没有延迟,另一路是dump给AI模型做推理,计算框的位置,这部分是通过一个透明图层贴上去的。两个显示层叠加是最后的显示效果,只改AI这一路不会影响另一个绑定显示层。

如果我想显示视频的时候暂停下来呢,类似我已经识别到人脸了,我想暂停下来显示这张人脸就好,不想继续视频显示着,要使用哪个代码呢

可以改成单路的

请问可以在我代码的基础上给一些建议吗,我这个问题卡好久了,麻烦啦,具体要怎么改呢,实在不是很懂

看一下这个,这个是以YOLOv8为例子,取消了绑定这种方式,不适用pipeline,只用sensor

from libs.AIBase import AIBase
from libs.AI2D import Ai2d
from libs.Utils import *
import os,sys,ujson,gc,math
from media.media import *
from media.sensor import *
from media.display import *
import nncase_runtime as nn
import ulab.numpy as np
import image
import aidemo

# 自定义YOLOv8检测类
class ObjectDetectionApp(AIBase):
    def __init__(self,kmodel_path,labels,model_input_size,max_boxes_num,confidence_threshold=0.5,nms_threshold=0.2,rgb888p_size=[224,224],display_size=[1920,1080],debug_mode=0):
        super().__init__(kmodel_path,model_input_size,rgb888p_size,debug_mode)
        self.kmodel_path=kmodel_path
        self.labels=labels
        # 模型输入分辨率
        self.model_input_size=model_input_size
        # 阈值设置
        self.confidence_threshold=confidence_threshold
        self.nms_threshold=nms_threshold
        self.max_boxes_num=max_boxes_num
        # sensor给到AI的图像分辨率
        self.rgb888p_size=[ALIGN_UP(rgb888p_size[0],16),rgb888p_size[1]]
        # 显示分辨率
        self.display_size=[ALIGN_UP(display_size[0],16),display_size[1]]
        self.debug_mode=debug_mode
        # 检测框预置颜色值
        self.color_four=get_colors(len(self.labels))
        # 宽高缩放比例
        self.x_factor = float(self.rgb888p_size[0])/self.model_input_size[0]
        self.y_factor = float(self.rgb888p_size[1])/self.model_input_size[1]
        # Ai2d实例,用于实现模型预处理
        self.ai2d=Ai2d(debug_mode)
        # 设置Ai2d的输入输出格式和类型
        self.ai2d.set_ai2d_dtype(nn.ai2d_format.NCHW_FMT,nn.ai2d_format.NCHW_FMT,np.uint8, np.uint8)

    # 配置预处理操作,这里使用了resize,Ai2d支持crop/shift/pad/resize/affine,具体代码请打开/sdcard/app/libs/AI2D.py查看
    def config_preprocess(self,input_image_size=None):
        with ScopedTiming("set preprocess config",self.debug_mode > 0):
            # 初始化ai2d预处理配置,默认为sensor给到AI的尺寸,您可以通过设置input_image_size自行修改输入尺寸
            ai2d_input_size=input_image_size if input_image_size else self.rgb888p_size
            top,bottom,left,right,self.scale=letterbox_pad_param(self.rgb888p_size,self.model_input_size)
            # 配置padding预处理
            self.ai2d.pad([0,0,0,0,top,bottom,left,right], 0, [128,128,128])
            self.ai2d.resize(nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel)
            self.ai2d.build([1,3,ai2d_input_size[1],ai2d_input_size[0]],[1,3,self.model_input_size[1],self.model_input_size[0]])

    def preprocess(self,input_np):
        with ScopedTiming("preprocess",self.debug_mode > 0):
            return [nn.from_numpy(input_np)]

    # 自定义当前任务的后处理
    def postprocess(self,results):
        with ScopedTiming("postprocess",self.debug_mode > 0):
            new_result=results[0][0].transpose()
            det_res = aidemo.yolov8_det_postprocess(new_result.copy(),[self.rgb888p_size[1],self.rgb888p_size[0]],[self.model_input_size[1],self.model_input_size[0]],[self.display_size[1],self.display_size[0]],len(self.labels),self.confidence_threshold,self.nms_threshold,self.max_boxes_num)
            return det_res

    # 绘制结果
    def draw_result(self,osd_img,dets):
        with ScopedTiming("display_draw",self.debug_mode >0):
            if dets:
                for i in range(len(dets[0])):
                    x, y, w, h = map(lambda x: int(round(x, 0)), dets[0][i])
                    osd_img.draw_rectangle(x,y, w, h, color=self.color_four[dets[1][i]],thickness=4)
                    osd_img.draw_string_advanced( x , y-50,32," " + self.labels[dets[1][i]] + " " + str(round(dets[2][i],2)) , color=self.color_four[dets[1][i]])

if __name__=="__main__":
    # 添加显示模式,默认hdmi,可选hdmi/lcd/lt9611/st7701/hx8399/nt35516,其中hdmi默认置为lt9611,分辨率1920*1080;lcd默认置为st7701,分辨率800*480
    rgb888p_size=[224,224]
    display_size=[800,480]
    # 模型路径
    kmodel_path="/sdcard/examples/kmodel/yolov8n_224.kmodel"
    labels = ["person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"]
    # 其它参数设置
    confidence_threshold = 0.3
    nms_threshold = 0.4
    max_boxes_num = 30
    # 初始化自定义目标检测实例
    ob_det=ObjectDetectionApp(kmodel_path,labels=labels,model_input_size=[224,224],max_boxes_num=max_boxes_num,confidence_threshold=confidence_threshold,nms_threshold=nms_threshold,rgb888p_size=rgb888p_size,display_size=display_size,debug_mode=0)
    ob_det.config_preprocess()

    sensor = Sensor(id=2)
    sensor.reset()
    # 设置水平镜像和垂直翻转,不同板子的方向不同,通过配置这两个参数使画面转正
    #sensor.set_hmirror(False)
    #sensor.set_vflip(False)
    # 配置sensor的多通道出图,每个通道的出图格式和分辨率可以不同,最多可以出三路图,参考sensor API文档
    # 通道0直接给到显示VO,格式为YUV420
    sensor.set_framesize(width = display_size[0], height = display_size[1],chn=CAM_CHN_ID_0)
    sensor.set_pixformat(Sensor.RGB888,chn=CAM_CHN_ID_0)
    # 通道1给到AI做算法处理,格式为RGB888P
    sensor.set_framesize(width = rgb888p_size[0] , height = rgb888p_size[1], chn=CAM_CHN_ID_1)
    sensor.set_pixformat(Sensor.RGBP888, chn=CAM_CHN_ID_1)

    Display.init(Display.ST7701,width=display_size[0],height=display_size[1],osd_num=1, to_ide = True)

    # media初始化
    MediaManager.init()
    # 启动sensor
    sensor.run()

    while True:
        with ScopedTiming("total",1):
            # 获取当前帧数据
            img_draw=sensor.snapshot(chn=CAM_CHN_ID_0)
            img_ori=sensor.snapshot(chn=CAM_CHN_ID_1)
            img=img_ori.to_numpy_ref()
            # 推理当前帧
            res=ob_det.run(img)
            # 绘制结果到PipeLine的osd图像
            ob_det.draw_result(img_draw,res)
            # 显示当前的绘制结果
            Display.show_image(img_draw)
            gc.collect()
    ob_det.deinit()
    sensor.stop()
    Display.deinit()
    time.sleep_ms(50)
    MediaManager.deinit()
    nn.shrink_memory_pool()


好的,谢谢你帮忙啦,我今晚复现一下

还是不行,我用的是亚博的板子,识别不了,我在重新开个新的帖子把代码贴上去