# 从“def main(args):”开始 GObject.threads_init() # 标准GStreamer初始化 Gst.init(None) # 创建Gst物件与初始化 pipeline = Gst.Pipeline() # 创建与其他元素相连接的管道元素2. 创建所有需要的元件(element) :用Gst.ElementFactory.make() 创建所需要的元素,每个元素内指定插件类别(粗体部分)并给定名称(自行设定):
# 阶段1-处理输入源的插件: # 建立“源”元素负责从文件读入数据 source = Gst.ElementFactory.make("filesrc", "file-source") # 解析文件是否为要求的h264格式 h264parser = Gst.ElementFactory.make("h264parse", "h264-parser") # 调用NVIDIA的nvdec_h264硬件解码器 decoder = Gst.ElementFactory.make("nvv4l2decoder", "nvv4l2-decoder") # 创建nvstreammux实例,将单个或多个源数据,复用成一个“批(batch)” streammux = Gst.ElementFactory.make("nvstreammux", "Stream-muxer") # 阶段2-执行推理的插件: # 使用NVINFERE对解码器的输出执行推理,推理行为是通过配置文件设置 pgie = Gst.ElementFactory.make("nvinfer", "primary-inference") # 阶段3-处理输出的插件: # 根据nvosd的要求,使用转换器将NV12转换为RGBA nvvidconv = Gst.ElementFactory.make("nvvideoconvert", "convertor") # 创建OSD以在转换的RGBA缓冲区上绘制 nvosd = Gst.ElementFactory.make("nvdsosd", "onscreendisplay") # 最后将osd的绘制,进行渲染后在屏幕上显示结果 transform=Gst.ElementFactory.make("nvegltransform", "egltransform") sink = Gst.ElementFactory.make("nveglglessink", "nvvideo-renderer")3. 配置元件的参数 :
# 以args[1]给定的文件名为输入源视频文件 source.set_property('location', args[1]) # 设定流复用器的尺寸、数量 streammux.set_property('width', 1920) streammux.set_property('height', 1080) streammux.set_property('batch-size', 1) streammux.set_property('batched-push-timeout', 4000000) # 设定pgie的配置文件 pgie.set_property('config-file-path', "dstest1_pgie_config.txt")
pipeline.add(source) pipeline.add(h264parser) pipeline.add(decoder) pipeline.add(streammux) pipeline.add(pgie) pipeline.add(nvvidconv) pipeline.add(nvosd) pipeline.add(sink) if is_aarch64(): pipeline.add(transform)
loop = GObject.MainLoop() bus = pipeline.get_bus() bus.add_signal_watch() bus.connect ("message", bus_call, loop) # 用osdsinkpad来确认nvosd插件是否获得输入 osdsinkpad = nvosd.get_static_pad("sink") # 添加探针(probe)以获得生成的元数据的通知,我们将probe添加到osd元素的接收器板中,因为到那时,缓冲区将具有已经得到了所有的元数据。 osdsinkpad.add_probe(Gst.PadProbeType.BUFFER, \ osd_sink_pad_buffer_probe, 0)注意“ osd_sink_pad_buffer_probe ”部分,这是代码中另一个重点,需要自行撰写代码去执行的部分,就是代码中第41~126行的内容,这里面的处理以“帧”为单位(在“ while l_frame is not None: ”里面),将该帧所检测到的物件种类进行加总,并且将物件根据种类的颜色画出框框。
cd<deepstream< span="">根目录>/sources/deepstream_python_apps/apps cd deepstream-test1下面有执行文件deepstream_test_1.py、配置文件dstest1_pgie_config.txt与说明文件README,这个配置文件就是步骤3最后“pgie.set_property”里面指定的文件,在执行文件里看不到任何与推理模型相关的内容,原来都放在设定文件里面去指定了。
python3 deepstream_test_1.py ../../../../samples/streams/sample_720p.h264就能跑出我们熟悉的结果,
乐高42177奔驰G500套装共有2891个零件,套装分为20个步骤,拼装时间大约需要6个小时。
SPIKE 科创套装 45678零件清单
拥有一个私人的云计算平台是一件很酷的事情。
本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。
M5Stack产品快速上手指南
工程思维是以解决问题为导向的,实施该思维的前几步都是围绕问题,展开的调研和策划,最终得出设计成果。它非常注重迭代意识,设计出的成果将根据需求不断改进,而非一劳永逸。
由台湾崇倫國中开发,專給WRO競賽組使用,包含「PD控制器」、「同步移動控制器」、「非線性緩加減速控制器」等。
本文对 Python 中的函数式编程技术进行了简单的入门介绍。
本文是一篇最全最良心却也最接地气的《火星救援》大科普,文科生也看得懂!
Jetson Nano 推出 2GB 内存版本,不仅承袭了 Jetson Nano 所有 AI 开发环境与 IOT 控制功能,也能学习或开发 Python、OpenCV 与 AI 深度学习、ROS 自动控制等应用。