Hi
By default, deepstream SDK suggest to use NvInfer as object detector/classifier and NvDsOds as for adding boundingBox/label information (before final render sink).
Pipeline: (some src) → nvInfer → nvdsOds → (some sink) (i took out all video converters, queue etc just to avoid extra space usage, cause anyway question are not related to it)
For example, i need some bbox/object_class information not for visual presentation only. One of the option i found is to use buffer probe:
We just add some buffer probe to nvinfer “src” or nvdsosd “sink” pad and get required data from *Meta objects.
Here the source (from Deepstream-app):
GstPad * pOsdSinkPad = gst_element_get_static_pad(bin->nvosd, “sink”);
gst_pad_add_probe(pOsdSinkPad, GST_PAD_PROBE_TYPE_BUFFER, osd_buffer_probe, NULL, NULL);
And corresponsing function to get/parse meta data:
[i]static GstPadProbeReturn osd_buffer_probe(GstPad * pPad, GstPadProbeInfo * pInfo, gpointer pData) {
GstBuffer * pBuffer = (GstBuffer *)pInfo->data;
NvDsMetaList * pMetaList = NULL;
NvDsBatchMeta * pBatchMeta = gst_buffer_get_nvds_batch_meta(pBuffer);
NvDsObjectMetaList * pMetaObjList;
NvDsObjectMeta * pMetaObj;
for (pMetaList = pBatchMeta->frame_meta_list; pMetaList != NULL ; pMetaList = pMetaList->next) {
NvDsFrameMeta * pFrameMeta = (NvDsFrameMeta *) (pMetaList->data);
for (pMetaObjList = pFrameMeta->obj_meta_list; pMetaObjList != NULL; pMetaObjList = pMetaObjList->next) {
pMetaObj = (NvDsObjectMeta*)pMetaObjList;
guint uClass = pMetaObj->class_id;
guint uLeft = pMetaObj->rect_params.left;
guint uTop = pMetaObj->rect_params.top;
guint uWidth = pMetaObj->rect_params.width;
guint uHeight = pMetaObj->rect_params.height;
g_print("Class: %d Rect: x:%u y:%u w:%u h:%u\n",
uClass,
uLeft,
uTop,
uWidth,
uHeight);
}
}
return GST_PAD_PROBE_OK;
}[/i]
Meta objects are available for frames with detected objects BUT all information i get is incorrect (x, y, width, height, class). Is there any example of meta object parsing (some logger, serialiser for meta objects f.e. to JSON or etc)? or maybe my approach is not correct? Tnx for any advice.