Gstreamer v4l2src上的nvidia deepstream(c应用程序)

Gstreamer v4l2src上的nvidia deepstream(c应用程序),gstreamer,nvidia,Gstreamer,Nvidia,我很难将管道转换为应用程序。我是个新手,所以请容忍我。我有这样的管道 gst-launch-1.0 v4l2src ! capsfilter caps= 'video/x-raw,format=(string)YUY2' ! nvvidconv ! capsfilter caps= 'video/x-raw(memory:NVMM),format=(string)NV12' ! nvvidconv ! capsfilter caps= 'video/x-raw,format=(string)NV

我很难将管道转换为应用程序。我是个新手,所以请容忍我。我有这样的管道

gst-launch-1.0 v4l2src ! capsfilter caps= 'video/x-raw,format=(string)YUY2' ! nvvidconv ! capsfilter caps= 'video/x-raw(memory:NVMM),format=(string)NV12' ! nvvidconv ! capsfilter caps= 'video/x-raw,format=(string)NV12' ! nvvideoconvert ! capsfilter caps='video/x-raw(memory:NVMM),format=(string)NV12' ! mux.sink_0 nvstreammux live-source=1 name=mux batch-size=1 width=1280 height=720 ! nvinfer config-file-path=/opt/nvidia/deepstream/deepstream-4.0/sources/apps/sample_apps/deepstream-test1/dstest1_pgie_config.txt batch-size=1 ! nvmultistreamtiler rows=1 columns=1 width=1280 height=720 ! nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink
我正在尝试直接从我直接连接到nvidia的相机源获取视频源。我为上述管道编写了一个c应用程序,如下所示

#include <gst/gst.h>
#include <glib.h>
#include <stdio.h>
#include "gstnvdsmeta.h"


#define MAX_DISPLAY_LEN 64

#define PGIE_CLASS_ID_VEHICLE 0
#define PGIE_CLASS_ID_PERSON 2

gint frame_number = 0;
gchar pgie_classes_str[4][32] = { "Vehicle", "TwoWheeler", "Person",
"Roadsign"
};


static GstPadProbeReturn osd_sink_pad_buffer_probe(GstPad *pad, GstPadProbeInfo *info, gpointer u_data)
{
GstBuffer *buf=(GstBuffer *)info->data;
guint num_rects =0;
NvDsObjectMeta *obj_meta = NULL;
guint vehicle_count = 0;
guint person_count = 0;
NvDsMetaList * l_frame = NULL;
NvDsMetaList * l_obj = NULL;
NvDsDisplayMeta *display_meta = NULL;

NvDsBatchMeta *batch_meta = gst_buffer_get_nvds_batch_meta (buf);

for (l_frame = batch_meta->frame_meta_list; l_frame != NULL;
l_frame = l_frame->next) {
NvDsFrameMeta *frame_meta = (NvDsFrameMeta *) (l_frame->data);
int offset = 0;
for (l_obj = frame_meta->obj_meta_list; l_obj != NULL;
l_obj = l_obj->next) {
obj_meta = (NvDsObjectMeta *) (l_obj->data);
if (obj_meta->class_id == PGIE_CLASS_ID_VEHICLE) {
vehicle_count++;
num_rects++;
}
if (obj_meta->class_id == PGIE_CLASS_ID_PERSON) {
person_count++;
num_rects++;
}
}
display_meta = nvds_acquire_display_meta_from_pool(batch_meta);
NvOSD_TextParams *txt_params = &display_meta->text_params[0];
display_meta->num_labels = 1;
txt_params->display_text = g_malloc0 (MAX_DISPLAY_LEN);
offset = snprintf(txt_params->display_text, MAX_DISPLAY_LEN, "Person = %d ", person_count);
offset = snprintf(txt_params->display_text + offset , MAX_DISPLAY_LEN, "Vehicle = %d ", vehicle_count);

/* Now set the offsets where the string should appear */
txt_params->x_offset = 10;
txt_params->y_offset = 12;

/* Font , font-color and font-size */
txt_params->font_params.font_name = "Serif";
txt_params->font_params.font_size = 10;
txt_params->font_params.font_color.red = 1.0;
txt_params->font_params.font_color.green = 1.0;
txt_params->font_params.font_color.blue = 1.0;
txt_params->font_params.font_color.alpha = 1.0;

/* Text background color */
txt_params->set_bg_clr = 1;
txt_params->text_bg_clr.red = 0.0;
txt_params->text_bg_clr.green = 0.0;
txt_params->text_bg_clr.blue = 0.0;
txt_params->text_bg_clr.alpha = 1.0;

nvds_add_display_meta_to_frame(frame_meta, display_meta);
}

g_print ("Frame Number = %d Number of objects = %d "
"Vehicle Count = %d Person Count = %d\n",
frame_number, num_rects, vehicle_count, person_count);
frame_number++;
return GST_PAD_PROBE_OK;

}

int main(int argc, char *argv[])
{
GstElement *pipeline, *source, *filter1, *convert,*filter2, *filter3, *vidconv, *filter4, *mux, *infer, *tiler, *osd, *transform , *sink, *bin, *convert2 , *vidconv2;
GMainLoop *loop;
GstCaps *caps1, *caps2, *caps3, *caps4;
GstPad *osd_sink_pad =NULL, *srcpad, *sinkpad;


loop = g_main_loop_new(NULL,FALSE);
gst_init(&argc, &argv);
pipeline = gst_pipeline_new("nv_pipeline");
gchar *string1 = "video/x-raw(memory:NVMM),format=(string)NV12";

source = gst_element_factory_make("v4l2src", "source");
filter1 = gst_element_factory_make("capsfilter", "filter1");
convert = gst_element_factory_make("nvvidconv", "convert");
filter2 = gst_element_factory_make("capsfilter", "filter2");
filter3 = gst_element_factory_make("capsfilter", "filter3");
filter4 = gst_element_factory_make("capsfilter", "filter4");
vidconv = gst_element_factory_make("nvvideoconvert", "vidconv");
mux = gst_element_factory_make("nvstreammux", "mux");
infer = gst_element_factory_make("nvinfer", "infer");
tiler = gst_element_factory_make("nvmultistreamtiler", "tiler");
osd = gst_element_factory_make("nvosd", "osd");
transform = gst_element_factory_make("nvegltransform", "transform");
sink = gst_element_factory_make("nveglglessink", "sink");
convert2 = gst_element_factory_make("nvvidconv", "convert2");
vidconv2 = gst_element_factory_make("nvvideoconvert", "vidconv2");

gst_bin_add_many(GST_BIN(pipeline), source,filter1,convert,filter2, convert2,filter3,vidconv, filter4,mux,infer, tiler,vidconv2, osd,transform,sink,NULL);

gst_element_link_many(source,filter1,convert,filter2, convert2,filter3, vidconv, filter4,mux,infer, tiler,vidconv2, osd,transform,sink,NULL);

osd_sink_pad = gst_element_get_static_pad(osd, "sink");
gst_pad_add_probe(osd_sink_pad, GST_PAD_PROBE_TYPE_BUFFER, osd_sink_pad_buffer_probe, NULL, NULL);

caps1 = gst_caps_new_simple("video/x-raw", "format",G_TYPE_STRING,"YUY2",NULL);
caps2 = gst_caps_from_string(string1);
caps3 = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING,"NV12", NULL);
caps4 = gst_caps_from_string(string1);

g_object_set(G_OBJECT(filter1), "caps", caps1, NULL);
g_object_set(G_OBJECT(filter2), "caps", caps2, NULL);
g_object_set(G_OBJECT(filter3), "caps", caps3, NULL);
g_object_set(G_OBJECT(filter4), "caps", caps4, NULL);

g_object_set(G_OBJECT(mux), "live-source", 1, "name", "mux", "batch-size", 1, "width", 1280, "height", 720, NULL);
g_object_set(G_OBJECT(infer), "config-file-path","/opt/nvidia/deepstream/deepstream-4.0/sources/apps/sample_apps/deepstream-test1/dstest1_pgie_config.txt",NULL);
g_object_set(G_OBJECT(infer), "batch-size", 1, NULL);
g_object_set(G_OBJECT(tiler), "rows", 1, "columns", 1, "width", 1280, "height", 720, NULL);

gst_caps_unref(caps1);
gst_caps_unref(caps2);
gst_caps_unref(caps3);
gst_caps_unref(caps4);

gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_print("Running ...\n");
g_main_loop_run(loop);

gst_element_set_state(pipeline,GST_STATE_NULL);
gst_object_unref(pipeline);
return 0;
}
#包括
#包括
#包括
#包括“gstnvdsmeta.h”
#定义最大显示长度64
#定义PGIE_类_ID_车辆0
#定义PGIE_类_ID_人2
gint帧_编号=0;
gchar pgie_类_str[4][32]={“车辆”、“两轮车”、“人”,
“道路标志”
};
静态GstPadProbeReturn osd_sink_pad_buffer_probe(GstPad*pad,GstPadProbeInfo*info,gpointer u_数据)
{
GstBuffer*buf=(GstBuffer*)信息->数据;
guint num_rects=0;
NvDsObjectMeta*obj_meta=NULL;
吉尼特车辆计数=0;
吉尼特人计数=0;
NvDsMetaList*l_frame=NULL;
NvDsMetaList*l_obj=NULL;
NvDsDisplayMeta*display\u meta=NULL;
NvDsBatchMeta*batch\u meta=gst\u buffer\u get\u nvds\u batch\u meta(buf);
对于(l_frame=batch_meta->frame_meta_list;l_frame!=NULL;
l_帧=l_帧->下一步){
NvDsFrameMeta*frame\u meta=(NvDsFrameMeta*)(l\u frame->data);
整数偏移=0;
对于(l_obj=frame_meta->obj_meta_list;l_obj!=NULL;
l_obj=l_obj->下一步){
obj_meta=(NvDsObjectMeta*)(l_obj->数据);
如果(obj\U meta->class\u id==PGIE\u class\u id\u车辆){
车辆计数++;
num_rects++;
}
如果(对象元->类id==PGIE类id\U人){
人员计数++;
num_rects++;
}
}
display_meta=nvds_acquire_display_meta_from_pool(批处理_meta));
NvOSD_TextParams*txt_params=&display_meta->text_params[0];
显示\u meta->num\u标签=1;
txt_参数->显示_文本=g_malloc0(最大显示长度);
偏移量=snprintf(txt参数->显示文本,最大显示长度,“人员=%d”,人员计数);
偏移量=snprintf(txt参数->显示文本+偏移量,最大显示长度,“车辆=%d”,车辆计数);
/*现在设置字符串应该出现的偏移量*/
txt_参数->x_偏移=10;
txt_参数->y_偏移=12;
/*字体、字体颜色和字体大小*/
txt_params->font_params.font_name=“Serif”;
txt_参数->font_参数。font_大小=10;
txt_参数->font_参数.font_color.red=1.0;
txt_参数->font_参数.font_color.green=1.0;
txt_params->font_params.font_color.blue=1.0;
txt_参数->font_参数.font_color.alpha=1.0;
/*文本背景色*/
txt_参数->设置_bg_clr=1;
txt_参数->text_bg_clr.red=0.0;
txt_参数->text_bg_clr.green=0.0;
txt_参数->text_bg_clr.blue=0.0;
txt_参数->text_bg_clr.alpha=1.0;
nvds将显示元添加到帧(帧元,显示元);
}
g_print(“帧号=%d对象数=%d”
“车辆计数=%d人计数=%d\n”,
帧编号、数量、车辆计数、人员计数);
帧号++;
返回GST\u焊盘\u探头\u正常;
}
int main(int argc,char*argv[])
{
GstElement*管道、*源、*过滤器1、*转换、*过滤器2、*过滤器3、*vidconv、*filter4、*mux、*推断、*tiler、*osd、*transform、*sink、*bin、*convert2、*vidconv2;
GMainLoop*循环;
GSTCAP*caps1、*caps2、*caps3、*caps4;
GstPad*osd\u sink\u pad=NULL,*srcpad,*sinkpad;
loop=g_main_loop_new(NULL,FALSE);
gst_init(&argc,&argv);
管道=gst_管道新(“nv_管道”);
gchar*string1=“视频/x-raw(内存:NVMM),格式=(字符串)NV12”;
来源=gst元素工厂制造(“v4l2src”,“来源”);
过滤器1=gst元素工厂制造(“capsfilter”、“过滤器1”);
转换=商品及服务税、要素、工厂制造(“nvvidconv”、“转换”);
过滤器2=gst元素工厂制造(“capsfilter”、“过滤器2”);
过滤器3=gst元素工厂制造(“capsfilter”、“过滤器3”);
过滤器4=gst元素工厂制造(“capsfilter”、“过滤器4”);
vidconv=gst元素工厂制造(“nvvideoconvert”、“vidconv”);
mux=gst、元件、工厂制造(“nvstreammux”、“mux”);
推断=gst元素工厂制造(“NVERE”、“推断”);
tiler=gst元素工厂制造(“nvmultistreamtiler”、“tiler”);
osd=商品及服务税、要素、工厂制造(“nvosd”、“osd”);
转换=gst元素工厂制造(“转换”、“转换”);
接收器=gst元件、工厂制造(“NVEGLSINK”、“接收器”);
convert2=商品及服务税元素工厂制造(“nvvidconv”、“convert2”);
vidconv2=gst元素工厂制造(“nvvideoconvert”、“vidconv2”);
gst_-bin_-add_-many(gst_-bin(管道)、源、筛选器1、转换、筛选器2、转换器2、筛选器3、vidconv、筛选器4、多路复用、推断、平铺、vidconv2、osd、转换、接收器、空值);
gst\u元素\u链接\u多(源、筛选器1、转换、筛选器2、转换器2、筛选器3、vidconv、筛选器4、多路复用、推断、平铺、vidconv2、osd、转换、接收器、空);
osd_sink_pad=gst_元素_get_static_pad(osd,“sink”);
gst_焊盘_添加_探头(osd_水槽_焊盘,gst_焊盘_探头_类型_缓冲区,osd_水槽_焊盘_缓冲区_探头,NULL,NULL);
caps1=gst\U caps\U new\U simple(“视频/x-raw”,“格式”,G\U类型字符串,“YUY2”,NULL);
caps2=来自字符串(字符串1)的gst\u caps\u;
caps3=gst\U caps\U new\U simple(“视频/x-raw”,“格式”,G\U类型字符串,“NV12”,NULL);
caps4=字符串(字符串1)中的gst\u caps\u;
g_对象集(g_对象(过滤器1),“caps”,caps1,NULL);
g_对象集(g_对象(过滤器2),“caps”,caps2,NULL);
g_对象集(g_对象(过滤器3),“caps”,caps3,NULL);
g_对象集(g_对象(过滤器4),“caps”,caps4,NULL);
g_对象集(g_对象(mux),“活动源”,1,“名称”,“mux”,“批量大小”,1,“宽度”,1280,“高度”,720,空);
g_对象集(g_对象(推断),“配置文件路径”,“/opt/nvidia/deepstream/deepstream-4.0/sources/apps/sample_apps/deepstream-test1/dstest1_pgie_config.txt”,NULL);
g_对象集(g_对象(推断),“批量大小”,1,空);
g_对象集(g_对象(平铺),“行”,1,“列”,1,“宽度”,1280,“高度”,720,空);
商品及服务税(caps1);
商品及服务税(caps2);
商品及服务税(caps3);
商品及服务税(第4章);
gst元素设置状态(管道、gst状态);
g_打印(“运行…\n”);
g_主循环运行(循环);
gst\元素\集合\状态(管道,gst\状态\空);
gst_对象_unref(管道);
返回0;
}
我不确定应该在当前管道中的何处应用焊盘和箱子,当我在命令行中运行此管道时,它可以工作。但是当我尝试使用上面的c程序运行时,它运行并且不显示任何内容。请帮忙