diff --git a/.vscode/settings.json b/.vscode/settings.json index abf842f..d0275ab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,70 @@ "C_Cpp.default.intelliSenseMode": "linux-gcc-x64", "C_Cpp.default.cppStandard": "c++17", "C_Cpp.intelliSenseEngine": "default", - "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools" + "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", + "files.associations": { + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "forward_list": "cpp", + "map": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp", + "valarray": "cpp" + } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 2663501..cd20db0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,10 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Disable compiler-specific extensions +# set(CMAKE_BUILD_TYPE Debug) # Automatically adds -g +# OR +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") + # Configure where binaries will be placed set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) diff --git a/src/gstds_example_manager.cpp b/src/gstds_example_manager.cpp index d04a58a..725f4a4 100644 --- a/src/gstds_example_manager.cpp +++ b/src/gstds_example_manager.cpp @@ -63,14 +63,14 @@ GstPadProbeReturn GstdsExampleManager::gstds_example_src_pad_buffer_probe( if (obj_meta->class_id == PGIE_CLASS_ID_PERSON) { person_count++; num_rects++; - std::cout << "In GstdsExample src " - << "x = " << obj_meta->rect_params.left - << " y = " << obj_meta->rect_params.top - << " w = " << obj_meta->rect_params.width - << " h = " << obj_meta->rect_params.height - << " score = " << obj_meta->confidence - << " Object ID: " << obj_meta->object_id - << std::endl; + // std::cout << "In GstdsExample src " + // << "x = " << obj_meta->rect_params.left + // << " y = " << obj_meta->rect_params.top + // << " w = " << obj_meta->rect_params.width + // << " h = " << obj_meta->rect_params.height + // << " score = " << obj_meta->confidence + // << " Object ID: " << obj_meta->object_id + // << std::endl; } NvDsUserMeta *user_meta = NULL; @@ -88,10 +88,12 @@ GstPadProbeReturn GstdsExampleManager::gstds_example_src_pad_buffer_probe( // (like your float* user_meta_data) to an object // (NvDsObjectMeta) using DeepStream APIs. + (void)user_meta_data; if (user_meta->base_meta.meta_type == NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID) { - for (int jkl = 0; jkl < 52; jkl++) - std::cout << user_meta_data[jkl] << std::endl; + // std::cout << "In GstdsExample src "<Increment(); // simulate updating a metric my_gauge->Set(static_cast(rand() % 100)); diff --git a/src/nv_infer_server_manager.cpp b/src/nv_infer_server_manager.cpp index 18168e1..dce1d00 100644 --- a/src/nv_infer_server_manager.cpp +++ b/src/nv_infer_server_manager.cpp @@ -235,7 +235,7 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( (void)stream_height; (void)stream_width; - float source_id = (float)frame_meta->source_id; + // float source_id = (float)frame_meta->source_id; /* Iterate user metadata in frames to search PGIE's tensor metadata */ for (NvDsMetaList *l_user = frame_meta->frame_user_meta_list; l_user != NULL; l_user = l_user->next) { @@ -308,12 +308,13 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( jkl += 4) { // 100 persons for each frame if (data[jkl * 57 + 4] > threshold_body_detection) { detected_persons++; - std::cout - << "nvinferserver first for x = " << data[jkl * 57 + 0] - << " y = " << data[jkl * 57 + 1] - << " w = " << data[jkl * 57 + 2] - << " h = " << data[jkl * 57 + 3] - << " score = " << data[jkl * 57 + 4] << std::endl; + // std::cout + // << "nvinferserver first for x = " << data[jkl * 57 + + // 0] + // << " y = " << data[jkl * 57 + 1] + // << " w = " << data[jkl * 57 + 2] + // << " h = " << data[jkl * 57 + 3] + // << " score = " << data[jkl * 57 + 4] << std::endl; for (unsigned int mno = 0; mno < 57; ++mno) { float value = data[jkl * 57 + mno]; (void)value; @@ -344,11 +345,13 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( int((data[index * 57 + 3] - data[index * 57 + 1]) * MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); - std::cout << "nvinferserver second for x = " << rect_params.left - << " y = " << rect_params.top - << " w = " << rect_params.width - << " h = " << rect_params.height - << " score = " << obj_meta->confidence << std::endl; + // std::cout << "nvinferserver second for x = " << + // rect_params.left + // << " y = " << rect_params.top + // << " w = " << rect_params.width + // << " h = " << rect_params.height + // << " score = " << obj_meta->confidence << + // std::endl; /* Border of width 3. */ rect_params.border_width = 3; @@ -370,9 +373,8 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( // adding landmarks to obj_meta as user_meta NvDsUserMeta *um1 = nvds_acquire_user_meta_from_pool(batch_meta); - um1->user_meta_data = - set_metadata_ptr(&(data[index * 57 + 6]), - source_id); // Add landmarks here + um1->user_meta_data = set_metadata_ptr( + &(data[index * 57])); // Add landmarks here um1->base_meta.meta_type = NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID; um1->base_meta.copy_func = (NvDsMetaCopyFunc)copy_user_meta; @@ -389,15 +391,14 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( // add custom infromation to metadata by: set_metadata_ptr, copy_user_meta, // release_user_meta -void *NvInferServerManager::set_metadata_ptr(float *arr, float source_id) { +void *NvInferServerManager::set_metadata_ptr(float *arr) { int i = 0; - float *user_metadata = - (float *)g_malloc0(17 * 3 * sizeof(float) + 1 * sizeof(float)); + float *user_metadata = (float *)g_malloc0(57 * sizeof(float)); - for (i = 0; i < 51; i++) { + for (i = 0; i < 57; i++) { user_metadata[i] = arr[i]; } - user_metadata[51] = source_id; + // user_metadata[51] = source_id; return (void *)user_metadata; } @@ -406,10 +407,8 @@ gpointer NvInferServerManager::copy_user_meta(gpointer data, (void)user_data; NvDsUserMeta *user_meta = (NvDsUserMeta *)data; gfloat *src_user_metadata = (gfloat *)user_meta->user_meta_data; - gfloat *dst_user_metadata = - (gfloat *)g_malloc0(17 * 3 * sizeof(gfloat) + 1 * sizeof(gfloat)); - memcpy(dst_user_metadata, src_user_metadata, - 17 * 3 * sizeof(gfloat) + 1 * sizeof(gfloat)); + gfloat *dst_user_metadata = (gfloat *)g_malloc0(57 * sizeof(gfloat)); + memcpy(dst_user_metadata, src_user_metadata, 57 * sizeof(gfloat)); return (gpointer)dst_user_metadata; } diff --git a/src/nv_infer_server_manager.hpp b/src/nv_infer_server_manager.hpp index 054e183..01936bb 100644 --- a/src/nv_infer_server_manager.hpp +++ b/src/nv_infer_server_manager.hpp @@ -35,7 +35,7 @@ class NvInferServerManager { // static GstPadProbeReturn osd_sink_pad_buffer_probe_new(GstPad *, // GstPadProbeInfo // *, gpointer); - static void *set_metadata_ptr(float *, float); + static void *set_metadata_ptr(float *); static gpointer copy_user_meta(gpointer, gpointer); static void release_user_meta(gpointer, gpointer); }; \ No newline at end of file diff --git a/src/nv_osd_manager.cpp b/src/nv_osd_manager.cpp index 17c82ee..ba0d384 100644 --- a/src/nv_osd_manager.cpp +++ b/src/nv_osd_manager.cpp @@ -71,14 +71,14 @@ GstPadProbeReturn NvOsdManager::osd_src_pad_buffer_probe(GstPad *pad, if (obj_meta->class_id == PGIE_CLASS_ID_PERSON) { person_count++; num_rects++; - std::cout << "In OSD sink " - << "x = " << obj_meta->rect_params.left - << " y = " << obj_meta->rect_params.top - << " w = " << obj_meta->rect_params.width - << " h = " << obj_meta->rect_params.height - << " score = " << obj_meta->confidence - << " Object ID: " << obj_meta->object_id - << std::endl; + // std::cout << "In OSD sink " + // << "x = " << obj_meta->rect_params.left + // << " y = " << obj_meta->rect_params.top + // << " w = " << obj_meta->rect_params.width + // << " h = " << obj_meta->rect_params.height + // << " score = " << obj_meta->confidence + // << " Object ID: " << obj_meta->object_id + // << std::endl; } } display_meta = nvds_acquire_display_meta_from_pool(batch_meta); @@ -110,11 +110,11 @@ GstPadProbeReturn NvOsdManager::osd_src_pad_buffer_probe(GstPad *pad, nvds_add_display_meta_to_frame(frame_meta, display_meta); } - g_print( - "In OSD sink " - "Frame Number = %d " - "Person Count = %d\n", - frame_number, person_count); + // g_print( + // "In OSD sink " + // "Frame Number = %d " + // "Person Count = %d\n", + // frame_number, person_count); frame_number++; return GST_PAD_PROBE_OK; diff --git a/src/nv_tracker_manager.cpp b/src/nv_tracker_manager.cpp index 18ad201..ae0e784 100644 --- a/src/nv_tracker_manager.cpp +++ b/src/nv_tracker_manager.cpp @@ -1,10 +1,21 @@ #include "nv_tracker_manager.hpp" +#define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID \ + (nvds_get_user_meta_type(const_cast("NVIDIA.NVINFER.USER_META"))) #define SET_GPU_ID(object, gpu_id) \ g_object_set(G_OBJECT(object), "gpu-id", gpu_id, NULL); #define GPU_ID 0 #define MAX_DISPLAY_LEN 64 #define PGIE_CLASS_ID_PERSON 0 +#define FACE_COMPONENT_ID 2 +#define FACE_CLASS_ID 42 +#define THRESHOLD_LANDMARKS 0.1 + +unsigned int NvTrackerManager::PGIE_NET_WIDTH = 1; +unsigned int NvTrackerManager::PGIE_NET_HEIGHT = 1; +unsigned int NvTrackerManager::MUXER_OUTPUT_WIDTH = 1; +unsigned int NvTrackerManager::MUXER_OUTPUT_HEIGHT = 1; +std::vector NvTrackerManager::body_face_list; gint NvTrackerManager::frame_number = 0; @@ -12,6 +23,10 @@ NvTrackerManager::NvTrackerManager() { const auto &config = ConfigManager::get_instance().get_config(); ll_config_file = config["ll-config-file"].get(); ll_lib_file = config["ll-lib-file"].get(); + PGIE_NET_WIDTH = config["PGIE_NET_WIDTH"]; + PGIE_NET_HEIGHT = config["PGIE_NET_HEIGHT"]; + MUXER_OUTPUT_WIDTH = config["MUXER_OUTPUT_WIDTH"]; + MUXER_OUTPUT_HEIGHT = config["MUXER_OUTPUT_HEIGHT"]; } bool NvTrackerManager::create_nv_tracker() { @@ -30,6 +45,27 @@ bool NvTrackerManager::create_nv_tracker() { return true; } +bool NvTrackerManager::check_existence(int object_id, int source_id, float area, + bool *is_area_updated) { + for (std::vector::iterator iter = body_face_list.begin(); + iter != body_face_list.end(); iter++) { + if (((*iter).object_id == object_id) && + ((*iter).source_id == source_id)) { + if (area > (*iter).largest_area) { + (*iter).largest_area = area; + *is_area_updated = true; + } + (*iter).num_frames++; + std::cout << "source_id = " << source_id + << " object_id = " << object_id + << " face num_frames = " << (*iter).num_frames + << std::endl; + return true; + } + } + return false; +} + // Attach probe to a pad in the pipeline void NvTrackerManager::attach_probe_to_element() { GstPad *src_pad = gst_element_get_static_pad(tracker, "src"); @@ -71,16 +107,226 @@ GstPadProbeReturn NvTrackerManager::tracker_src_pad_buffer_probe( if (obj_meta->class_id == PGIE_CLASS_ID_PERSON) { person_count++; num_rects++; - std::cout << "In Tracker sink " - << "x = " << obj_meta->rect_params.left - << " y = " << obj_meta->rect_params.top - << " w = " << obj_meta->rect_params.width - << " h = " << obj_meta->rect_params.height - << " score = " << obj_meta->confidence - << " object_id = " << obj_meta->object_id - << std::endl; + // std::cout << "In Tracker sink " + // << " source_id " << frame_meta->source_id + // << " x = " << obj_meta->rect_params.left + // << " y = " << obj_meta->rect_params.top + // << " w = " << obj_meta->rect_params.width + // << " h = " << obj_meta->rect_params.height + // << " score = " << obj_meta->confidence + // << " object_id = " << obj_meta->object_id + // << std::endl; + } + // else{ + // std::cout << "obj_meta->class_id = " + // << obj_meta->class_id << std::endl; + // std::quick_exit(0); + // } + + NvDsUserMeta *user_meta = NULL; + NvDsMetaList *l_user_meta = NULL; + float *user_meta_data = NULL; + uint index = 0; + for (l_user_meta = obj_meta->obj_user_meta_list; + l_user_meta != NULL; l_user_meta = l_user_meta->next) { + user_meta = (NvDsUserMeta *)(l_user_meta->data); + user_meta_data = (float *)user_meta->user_meta_data; + // std::cout << " source_id " << frame_meta->source_id + // << " object_id = " << obj_meta->object_id + // << std::endl; + + // user_meta->base_meta.meta_type == 7 means it is user-defined + // metadata (NVDS_USER_META). + + // This is typically used when you attach custom metadata + // (like your float* user_meta_data) to an object + // (NvDsObjectMeta) using DeepStream APIs. + + if (user_meta->base_meta.meta_type == + NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID) { + // std::cout << "In Tracker sink "<object_id == 0) { + continue; + } + + // ??????????????????????????????????????????????????????????????????? + // NvDsObjectMeta *obj_meta = + // nvds_acquire_obj_meta_from_pool(batch_meta); + // obj_meta->unique_component_id = meta->unique_id; + // obj_meta->confidence = user_meta_data[index * 57 + 4]; + // obj_meta->object_id = UNTRACKED_OBJECT_ID; + // obj_meta->class_id = 0; + + if (!(user_meta_data[index * 57 + 8] > + THRESHOLD_LANDMARKS && + user_meta_data[index * 57 + 11] > + THRESHOLD_LANDMARKS && + user_meta_data[index * 57 + 14] > + THRESHOLD_LANDMARKS && + user_meta_data[index * 57 + 17] > + THRESHOLD_LANDMARKS && + user_meta_data[index * 57 + 20] > + THRESHOLD_LANDMARKS && + user_meta_data[index * 57 + 23] > + THRESHOLD_LANDMARKS && + user_meta_data[index * 57 + 26] > + THRESHOLD_LANDMARKS)) { + continue; + } + + // NvOSD_RectParams &face_rect_params; + // NvOSD_RectParams *face_rect_params = nullptr; // Fill + // face_rect_params.top, .left, .width, .height + NvOSD_RectParams *face_rect_params = new NvOSD_RectParams(); + + /* Assign bounding box coordinates. */ + // Right Shoulder - Left Shoulder + if (user_meta_data[index * 57 + 24] > + user_meta_data[index * 57 + 21]) { + face_rect_params->width = + abs((user_meta_data[index * 57 + 24] - + user_meta_data[index * 57 + 0]) * + MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + } else { + face_rect_params->width = + abs((user_meta_data[index * 57 + 21] - + user_meta_data[index * 57 + 0]) * + MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + } + + if (user_meta_data[index * 57 + 25] > + user_meta_data[index * 57 + 22]) { + face_rect_params->height = + abs((user_meta_data[index * 57 + 25] - + user_meta_data[index * 57 + 1]) * + MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + } else { + face_rect_params->height = + abs((user_meta_data[index * 57 + 22] - + user_meta_data[index * 57 + 1]) * + MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + } + + NvDsObjectMeta *face_obj = + nvds_acquire_obj_meta_from_pool(batch_meta); + face_obj->unique_component_id = + FACE_COMPONENT_ID; // Use a new component ID + face_obj->confidence = 1.0; + + face_obj->rect_params = *face_rect_params; + face_obj->rect_params.has_bg_color = 0; + face_obj->rect_params.border_width = 2; + face_obj->rect_params.border_color = + NvOSD_ColorParams{1.0, 0.0, 0.0, 1.0}; // Red box + // std::quick_exit(0); + + // std::cout << "In Tracker sink " + // << " source_id = " << frame_meta->source_id + // << " object_id = " << obj_meta->object_id + // << " x = " << obj_meta->rect_params.left + // << " y = " << obj_meta->rect_params.top + // << " w = " << obj_meta->rect_params.width + // << " h = " << obj_meta->rect_params.height + // << " score = " << obj_meta->confidence + // << std::endl; + bool is_area_updated = false; + FaceBody current_face; + current_face.largest_area = face_obj->rect_params.height * + face_obj->rect_params.width; + current_face.object_id = obj_meta->object_id; + current_face.source_id = frame_meta->source_id; + if (!check_existence( + obj_meta->object_id, current_face.source_id, + current_face.largest_area, &is_area_updated)) { + current_face.num_frames = 1; + body_face_list.push_back(current_face); + std::cout << "source_id = " << current_face.source_id + << " frame_num = " << frame_meta->frame_num + << " object_id = " << obj_meta->object_id + << " size body_face_list = " + << body_face_list.size() << std::endl; + face_obj->class_id = FACE_CLASS_ID; + } + if (is_area_updated) { + face_obj->class_id = FACE_CLASS_ID; + std::cout << "source_id = " << current_face.source_id + << " frame_num = " << frame_meta->frame_num + << " object_id = " << obj_meta->object_id + << " area is updated" << std::endl; + // std::quick_exit(0); + } else { + face_obj->class_id = 41; + // std::cout<<"not is_area_updated "<< std::endl; + } + + // NvOSD_RectParams &rect_params = obj_meta->rect_params; + // NvOSD_TextParams &text_params = obj_meta->text_params; + /* Assign bounding box coordinates. */ + // rect_params.left = int(data[index * 57 + 0] * + // MUXER_OUTPUT_WIDTH / + // PGIE_NET_WIDTH); + // rect_params.top = int(data[index * 57 + 1] * + // MUXER_OUTPUT_HEIGHT / + // PGIE_NET_HEIGHT); + // rect_params.width = + // int((data[index * 57 + 2] - data[index * 57 + 0]) * + // MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + // rect_params.height = + // int((data[index * 57 + 3] - data[index * 57 + 1]) * + // MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); + + // std::cout << "nvinferserver second for x = " << + // rect_params.left + // << " y = " << rect_params.top + // << " w = " << rect_params.width + // << " h = " << rect_params.height + // << " score = " << obj_meta->confidence << + // std::endl; + + // /* Border of width 3. */ + // rect_params.border_width = 3; + // rect_params.has_bg_color = 0; + // rect_params.border_color = NvOSD_ColorParams{1, 0, 0, 1}; + // /* display_text requires heap allocated memory. */ + // text_params.display_text = g_strdup(pgie_class_str[0]); + // /* Display text above the left top corner of the object. + // */ text_params.x_offset = rect_params.left; + // text_params.y_offset = rect_params.top - 10; + // /* Set black background for the text. */ + // text_params.set_bg_clr = 1; + // text_params.text_bg_clr = NvOSD_ColorParams{0, 0, 0, 1}; + // /* Font face, size and color. */ + // text_params.font_params.font_name = (gchar *)"Serif"; + // text_params.font_params.font_size = 11; + // text_params.font_params.font_color = + // NvOSD_ColorParams{1, 1, 1, 1}; + // adding landmarks to obj_meta as user_meta + // nvds_add_child_object(obj_meta, face_obj); + // nvds_attach_obj_meta(obj_meta, face_obj, NULL); + + // NvDsUserMeta *um1 = + // nvds_acquire_user_meta_from_pool(batch_meta); + // um1->user_meta_data = + // set_metadata_ptr(&(data[index * 57 + 6]), + // source_id); // Add landmarks + // here + // um1->base_meta.meta_type = + // NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID; + // um1->base_meta.copy_func = + // (NvDsMetaCopyFunc)copy_user_meta; + // um1->base_meta.release_func = + // (NvDsMetaReleaseFunc)release_user_meta; + // nvds_add_user_meta_to_obj(obj_meta, um1); + // nvds_add_obj_meta_to_frame(frame_meta, obj_meta, NULL); + nvds_add_obj_meta_to_frame(frame_meta, face_obj, obj_meta); + } + // index++; } } + display_meta = nvds_acquire_display_meta_from_pool(batch_meta); NvOSD_TextParams *txt_params = &display_meta->text_params[0]; display_meta->num_labels = 1; @@ -110,12 +356,12 @@ GstPadProbeReturn NvTrackerManager::tracker_src_pad_buffer_probe( nvds_add_display_meta_to_frame(frame_meta, display_meta); } - g_print( - "In Tracker sink " - "Frame Number = %d " - "Person Count = %d\n", - frame_number, person_count); + // g_print( + // "In Tracker sink " + // "Frame Number = %d " + // "Person Count = %d\n", + // frame_number, person_count); frame_number++; return GST_PAD_PROBE_OK; -} +} \ No newline at end of file diff --git a/src/nv_tracker_manager.hpp b/src/nv_tracker_manager.hpp index 0fc6499..4ec84d2 100644 --- a/src/nv_tracker_manager.hpp +++ b/src/nv_tracker_manager.hpp @@ -1,14 +1,32 @@ #include +#include #include #include +#include +#include #include "config_manager.hpp" #include "gstnvdsmeta.h" +#include "nvdsmeta.h" +#include "nvdsmeta_schema.h" class NvTrackerManager { private: + struct FaceBody { + int object_id = 0; + int source_id = 0; + int num_frames = 0; + float largest_area = -1; + }; + + static std::vector body_face_list; + public: + static unsigned int PGIE_NET_WIDTH; + static unsigned int PGIE_NET_HEIGHT; + static unsigned int MUXER_OUTPUT_WIDTH; + static unsigned int MUXER_OUTPUT_HEIGHT; GstElement *tracker = NULL; static gint frame_number; std::string ll_config_file; @@ -20,4 +38,5 @@ class NvTrackerManager { static GstPadProbeReturn tracker_src_pad_buffer_probe(GstPad *, GstPadProbeInfo *, gpointer); + static bool check_existence(int, int, float, bool *); }; \ No newline at end of file diff --git a/src/pipeline_manager.cpp b/src/pipeline_manager.cpp index 37c3312..9eb08e5 100644 --- a/src/pipeline_manager.cpp +++ b/src/pipeline_manager.cpp @@ -74,7 +74,7 @@ void PipelineManager::set_row_csv_fps(const std::string& name, double fps) { return; } else { csv_fp << name << "," << fps << "\n"; - std::cout << "Wrote: " << name << " = " << fps << "\n"; + // std::cout << "Wrote: " << name << " = " << fps << "\n"; } } @@ -97,8 +97,8 @@ GstPadProbeReturn PipelineManager::osd_sink_pad_buffer_probe( .count(); fps_osd = 60000.0 / ms; self->set_row_csv_fps("fps_osd", fps_osd); - std::cout << "Writing fps_osd...\n"; - g_print("FPS_osd_sink: %.2f\n", fps_osd); + // std::cout << "Writing fps_osd...\n"; + // g_print("FPS_osd_sink: %.2f\n", fps_osd); last_time_osd_sink = now; } return GST_PAD_PROBE_OK; @@ -130,10 +130,10 @@ GstPadProbeReturn PipelineManager::probe_fps(GstPad* pad, GstPadProbeInfo* info, current_time_fps_probe - last_time_fps_probe) .count(); fps_probe = 30000.0 / duration; - g_print("fps_probe FPS: %.2f\n", fps_probe); + // g_print("fps_probe FPS: %.2f\n", fps_probe); last_time_fps_probe = current_time_fps_probe; self->set_row_csv_fps("fps_probe", fps_probe); - std::cout << "Writing fps_probe...\n"; + // std::cout << "Writing fps_probe...\n"; } } return GST_PAD_PROBE_OK; @@ -166,12 +166,12 @@ GstPadProbeReturn PipelineManager::buffer_probe(GstPad* pad, fps_buffer_probe = (double)(frame_count_buffer_probe * 1000 / (double)elapsed); if (elapsed >= 1000) { // Update every second - g_print("FPS_buffer_probe: %.2f\n", fps_buffer_probe); + // g_print("FPS_buffer_probe: %.2f\n", fps_buffer_probe); frame_count_buffer_probe = 0; last_time_buffer_probe = current_time_buffer_probe; } self->set_row_csv_fps("fps_buffer_probe", fps_buffer_probe); - std::cout << "Writing fps_buffer_probe...\n"; + // std::cout << "Writing fps_buffer_probe...\n"; return GST_PAD_PROBE_OK; } @@ -216,8 +216,9 @@ bool PipelineManager::check_playing_pipeline() { g_printerr("Failed to start pipeline!\n"); return false; } else { - g_print("Pipeline state: %d (1=NULL, 2=READY, 3=PAUSED, 4=PLAYING)\n", - state); + // g_print("Pipeline state: %d (1=NULL, 2=READY, 3=PAUSED, + // 4=PLAYING)\n", + // state); return true; } } @@ -283,7 +284,7 @@ gboolean PipelineManager::check_pipeline_state(gpointer user_data) { GstElement* pipeline = (GstElement*)user_data; GstState state; gst_element_get_state(pipeline, &state, NULL, GST_CLOCK_TIME_NONE); - g_print("Pipeline state (periodic check): %d\n", state); + // g_print("Pipeline state (periodic check): %d\n", state); return G_SOURCE_CONTINUE; // Keep timer active }