這個範例分成兩個版本
gstdsexample.cpp 和 gstdsexample_optimized.cpp
版本的區分要在 Makefile 的 USE_OPTIMIZED_DSEXAMPLE 設定
要存檔測試時,需打開下列開關,執行時加上 sudo
//#define DSEXAMPLE_DEBUG
在 Jetson 機器上執行時,要在 nvdsosd 和 nveglglessink 中間加上 nvegltransform
在 Tesla 機器上 nvvideoconvert 要加上 nvbuf-memory-type=nvbuf-mem-cuda-unified
gstdsexample.cpp 有 full-frame 和 blur-objects 參數
gstdsexample_optimized.cpp 有 full-frame 和 batch-size 參數
範例如下
$ gst-launch-1.0 filesrc location=/opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_720p.mp4 \
! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 height=720 ! \
nvinfer config-file-path=/opt/nvidia/deepstream/deepstream-5.0/samples/configs/deepstream-app/config_infer_primary.txt ! \
nvvideoconvert nvbuf-memory-type=nvbuf-mem-cuda-unified ! 'video/x-raw(memory:NVMM), format=RGBA' ! \
dsexample full-frame=0 blur-objects=1 ! nvdsosd ! nveglglessink
gstdsexample.cpp 說明
gst_dsexample_transform_ip()
gstdsexample_optimized.cpp 說明
gst_dsexample_start()
建立兩組 queue
dsexample->process_queue = g_queue_new ();
dsexample->cvmat_queue = g_queue_new ();
並預先放入兩組 cvmat array 到 cvmat_queue
for (int i = 0; i < 2; i++) {
cvmat = new cv::Mat[dsexample->max_batch_size];
g_queue_push_tail (dsexample->cvmat_queue, cvmat);
}
啟動 gst_dsexample_output_loop thread
dsexample->process_thread =
g_thread_new ("dsexample-process-thread", gst_dsexample_output_loop,
dsexample);
gst_dsexample_submit_input_buffer()
啟動於每次資料由 sink 進入
一次的資料會包含多個 frame, 一的 frame 有多個 object
透過 scale_and_fill_data() 將資料放入 dsexample->batch_insurf
當 dsexample->batch_insurf 滿了(或是最後一次未滿) 透過
convert_batch_and_push_to_process_thread() 轉換到 dsexample->inter_buf
batch->cvmat = (cv::Mat *) g_queue_pop_head (dsexample->cvmat_queue);
由 dsexample->inter_buf 產生 batch->cvmat
g_queue_push_tail (dsexample->process_queue, batch);
要離開 gst_dsexample_submit_input_buffer() 時,
多 push 一次輸出訊號(batch->push_buffer = TRUE)
g_queue_push_tail (dsexample->process_queue, buf_push_batch);
gst_dsexample_output_loop()
輸出的 thread, 一直 loop, 直到結束
batch = g_queue_pop_head (dsexample->process_queue));
if (batch->push_buffer) {
gst_pad_push (GST_BASE_TRANSFORM_SRC_PAD (dsexample), batch->inbuf);
}
g_queue_push_tail (dsexample->cvmat_queue, batch->cvmat);
生活紀錄: Deepstream 之 Gst-Dsexample 研究 >>>>> Download Now
回覆刪除>>>>> Download Full
生活紀錄: Deepstream 之 Gst-Dsexample 研究 >>>>> Download LINK
>>>>> Download Now
生活紀錄: Deepstream 之 Gst-Dsexample 研究 >>>>> Download Full
>>>>> Download LINK iq