Browse Source

功能添加保存图片/视频,解决选择不保存视频时osd插件报错

lishengyin 3 years ago
parent
commit
f7fd25d82d

+ 5 - 1
.vscode/settings.json

@@ -73,7 +73,11 @@
         "future": "cpp",
         "queue": "cpp",
         "filesystem": "cpp",
-        "__nullptr": "cpp"
+        "__nullptr": "cpp",
+        "__bit_reference": "cpp",
+        "__hash_table": "cpp",
+        "__split_buffer": "cpp",
+        "__tree": "cpp"
     },
     "C_Cpp.errorSquiggles": "Disabled",
     "commentTranslate.targetLanguage": "en"

BIN
lib/libmodules.so


+ 1 - 2
modules/inference/include/inference.h

@@ -4,7 +4,7 @@
  * @Autor: lishengyin
  * @Date: 2021-10-13 09:37:51
  * @LastEditors: lishengyin
- * @LastEditTime: 2022-01-04 14:16:41
+ * @LastEditTime: 2022-01-05 09:17:44
  */
 #pragma once
 #include <iostream>
@@ -44,7 +44,6 @@
 #include <queue>
 #include <vector>
 
-
 // opencv
 #include <opencv2/core.hpp>
 #include <opencv2/videoio.hpp>

+ 9 - 12
modules/inference/src/inference.cpp

@@ -4,7 +4,7 @@
  * @Autor: lishengyin
  * @Date: 2021-10-13 09:35:37
  * @LastEditors: lishengyin
- * @LastEditTime: 2022-01-04 16:12:54
+ * @LastEditTime: 2022-01-05 09:23:06
  */
 #include "inference.h"
 
@@ -55,8 +55,6 @@ std::shared_ptr<InferInfo> g_InferInfo = NULL;
 
 map<string, map<int, queue<std::shared_ptr<cv::Mat>>>> m_frames;
 
-bool RecordEnable = false;
-
 namespace MIVA{
     std::shared_ptr<Inference> infer = NULL;
     ThreadPool pool(2,ThreadPool::PRIORITY_HIGHEST, false);
@@ -81,7 +79,6 @@ namespace MIVA{
         GstState state;
         gst_element_get_state(this->pipeline,&state,NULL, GST_CLOCK_TIME_NONE);
         if(state == GST_STATE_PLAYING)  gst_element_set_state(this->pipeline, GST_STATE_PAUSED);
-        this->m_InferInfo = NULL;
         gst_element_set_state(this->pipeline, GST_STATE_NULL);
         g_main_loop_quit (this->loop);
         DebugL << "Deleting pipeline";
@@ -89,6 +86,7 @@ namespace MIVA{
         g_source_remove(this->bus_watch_id);
         g_main_loop_unref(this->loop);
         g_mutex_clear (&eos_lock);
+        this->m_InferInfo = NULL;
     } 
     /**
      * @description: 推理模块初始化
@@ -195,13 +193,11 @@ namespace MIVA{
         // g_object_set (G_OBJECT (this->tiler), "rows", this->tiler_rows, "columns", this->tiler_columns,
         //     "width", TILED_OUTPUT_WIDTH, "height", TILED_OUTPUT_HEIGHT, NULL);
 
-
         g_object_set (G_OBJECT (this->nvosd), "process-mode", OSD_PROCESS_MODE,
             "display-text", OSD_DISPLAY_TEXT, NULL);
-
+        g_object_set (G_OBJECT (this->nvosd), "display-bbox", 0, NULL);
         g_object_set (G_OBJECT (this->sink), "qos", 0, NULL);
 
-
         this->bus = gst_pipeline_get_bus (GST_PIPELINE (this->pipeline));
         this->bus_watch_id = gst_bus_add_watch (this->bus, bus_call, this->loop);
         gst_object_unref (this->bus);
@@ -432,14 +428,15 @@ namespace MIVA{
                     }
                 }
             }
-            
-            if(RecordEnable){
+            recorder::Ptr m_recorder = recorder::CreateNew();
+
+            if(m_recorder->RecordEnable){
                 if(src_data == NULL) {
                     src_data = (char*) malloc(surface->surfaceList[frame_meta->batch_id].dataSize);
                 }
             }
             #ifdef PLATFORM_TEGRA
-                if(src_data != NULL && RecordEnable){
+                if(src_data != NULL && m_recorder->RecordEnable){
                     NvBufSurfaceMap(surface, -1, -1, NVBUF_MAP_READ);
                     unsigned int offset = 0;
                     for (unsigned int num_planes = 0; num_planes < pParams->num_planes; num_planes++)
@@ -468,8 +465,8 @@ namespace MIVA{
             gint frame_step = surface->surfaceList[frame_meta->batch_id].pitch;
 
             int flag = 1;
-            if(!RecordEnable || src_data == NULL) flag = 0;
-            if(RecordEnable){
+            if(!m_recorder->RecordEnable || src_data == NULL) flag = 0;
+            if(m_recorder->RecordEnable){
                 if(m_frames[g_InferInfo->DataSources[frame_meta->source_id].Pid][frame_meta->source_id].size() != 0) flag = 0;
             }
             

+ 3 - 5
modules/recorder/include/recorder.h

@@ -26,7 +26,6 @@ namespace MIVA
 {
     class recorder
     {
-        using Ptr = std::shared_ptr<recorder>;
     public:
         recorder() {}
         ~recorder() {}
@@ -41,19 +40,18 @@ namespace MIVA
 
         std::string GetFileName(std::string Pid);
 
-        std::shared_ptr<cv::VideoWriter> GetVideoWriter(std::string Pid);
-
-
     private:
         struct Writer{
             std::string fileName = "";
             std::shared_ptr<cv::VideoWriter> videoWriter = nullptr;
         };
         map<std::string, Writer> videoWriters;
-
     public:
         bool enable = true;
+        bool RecordEnable = true;
+        int outType = 0;  // 0  图片 1视频
         std::string outDir = "";
         std::string Dir = "./video/";
+        using Ptr = std::shared_ptr<recorder>;
     };
 } // namespace name

+ 21 - 24
modules/recorder/src/recorder.cpp

@@ -26,7 +26,7 @@ namespace MIVA
         //if(!enable) return;
         auto iter = this->videoWriters.find(Pid);
         if(iter != this->videoWriters.end()){
-            if(iter->second.videoWriter == nullptr || iter->second.fileName == ""){
+            if( !outType || iter->second.fileName == ""){
                 time_t rawtime;
                 char ctime[80];
                 struct tm *info;
@@ -35,9 +35,14 @@ namespace MIVA
                 strftime(ctime, 80, "%Y-%m-%d_%H:%M:%S", info);
                 string fileName = this->outDir;
                 string time1 = ctime;
-                fileName += time1 + "_" + Pid + ".mp4";
-                // ErrorL << fileName << endl;
-                iter->second.videoWriter = std::make_shared<cv::VideoWriter>("appsrc ! autovideoconvert ! omxh264enc  ! matroskamux ! filesink location=" + fileName + " sync=false", 0, (double)2, cv::Size(1920, 1080), true);
+                if(outType){
+                    fileName += time1 + "_" + Pid + ".mp4";
+                    iter->second.videoWriter = std::make_shared<cv::VideoWriter>("appsrc ! autovideoconvert ! omxh264enc  ! matroskamux ! filesink location=" + fileName + " sync=false", 0, (double)2, cv::Size(1920, 1080), true);
+                }else{
+                    fileName += time1 + "_" + Pid + ".jpg";
+                    cv::imwrite(fileName, frame);
+                    iter->second.videoWriter = nullptr;
+                }
                 iter->second.fileName = fileName;
             }
         }
@@ -52,13 +57,18 @@ namespace MIVA
             strftime(ctime, 80, "%Y-%m-%d_%H:%M:%S", info);
             string fileName = this->outDir;
             string time1 = ctime;
-            fileName += time1 + "_" + Pid + ".mp4";
-            // ErrorL << fileName << endl;
+            if(outType){
+                fileName += time1 + "_" + Pid + ".mp4";
+                writer.videoWriter = std::make_shared<cv::VideoWriter>("appsrc ! autovideoconvert ! omxh264enc  ! matroskamux ! filesink location=" + fileName + " sync=false", 0, (double)2, cv::Size(1920, 1080), true);
+            }else{
+                fileName += time1 + "_" + Pid + ".jpg";
+                cv::imwrite(fileName, frame);
+                writer.videoWriter = nullptr;
+            }
             writer.fileName = fileName;
-            writer.videoWriter = std::make_shared<cv::VideoWriter>("appsrc ! autovideoconvert ! omxh264enc  ! matroskamux ! filesink location=" + fileName + " sync=false", 0, (double)2, cv::Size(1920, 1080), true);
             this->videoWriters[Pid] = writer;
         }
-        this->videoWriters[Pid].videoWriter->write(frame);
+        if(outType) this->videoWriters[Pid].videoWriter->write(frame);
     }
 
     /**
@@ -68,6 +78,8 @@ namespace MIVA
      */    
     void recorder::Start()
     {
+        if(!this->RecordEnable) return;
+
         time_t rawtime;
         char ctime[80];
         struct tm *info;
@@ -84,7 +96,6 @@ namespace MIVA
         if(opendir(this ->outDir.c_str()) == NULL){
             mkdir((this->outDir).c_str(),S_IRWXU|S_IRWXG|S_IRWXO);
         }
-
         m_recorder->enable = true;
     }
 
@@ -95,6 +106,7 @@ namespace MIVA
      */    
     void recorder::Finish()
     {
+        if(!outType) return;
         for(auto videowriter = this->videoWriters.begin(); videowriter != this->videoWriters.end(); videowriter++){
             if(videowriter->second.videoWriter != nullptr){
                 videowriter->second.videoWriter->release();
@@ -119,19 +131,4 @@ namespace MIVA
         }
         return fileName;
     }
-
-    /**
-     * @description: 获取VideoWriter
-     * @param {int} sourceId
-     * @return {*}
-     */    
-    std::shared_ptr<cv::VideoWriter> recorder::GetVideoWriter(std::string Pid)
-    {
-        std::shared_ptr<cv::VideoWriter> videoWriter = nullptr;
-        auto iter = this->videoWriters.find(Pid);
-        if(iter != this->videoWriters.end()){
-            videoWriter = iter->second.videoWriter;
-        }
-        return videoWriter;
-    }
 };

BIN
source/bin/main