deepstream 预处理结果保存(进入模型前的图片)

x33g5p2x  于2022-07-10 转载在 其他  
字(4.7k)|赞(0)|评价(0)|浏览(541)

首先,你需要知道模块插件是gstnvinfer ,所以你需要在这个模块增加打印代码

模块路径:/opt/nvidia/deepstream/deepstream-6.0/sources/gst-plugins/gst-nvinfer/gstnvinfer.cpp

此方法是DGPU方式,如果需要jetson方式,按照上篇后处理图片保存修改即可

首先是保存图片的方法:

我的printf("all_bbox_generated called! colorformat =%d\n", surface->surfaceList[frameIndex].colorFormat);

打印的结果是: 27 所以我的是RGB模式。

//zwh start

  1. static void save_transformed_plate_images(NvBufSurface * surface) {
  2.  
  3.   for (uint frameIndex = 0; frameIndex < surface->numFilled;
  4.       frameIndex++) {
  5.     void *src_data = NULL;
  6.     src_data = (char *)malloc(surface->surfaceList[frameIndex].dataSize);
  7.     if (src_data == NULL) {
  8.     g_print("Error: failed to malloc src_data \n");
  9.     }
  10.     cudaMemcpy((void *)src_data,
  11.         (void *)surface->surfaceList[frameIndex].dataPtr,
  12.         surface->surfaceList[frameIndex].dataSize,
  13.         cudaMemcpyDeviceToHost);
  14.     gint frame_width = (gint)surface->surfaceList[frameIndex].width;
  15.     gint frame_height = (gint)surface->surfaceList[frameIndex].height;
  16.     size_t frame_step = surface->surfaceList[frameIndex].pitch;
  17.     printf("all_bbox_generated called! colorformat =%d\n", surface->surfaceList[frameIndex].colorFormat);
  18.     cv::Mat frame = cv::Mat(frame_height, frame_width, CV_8UC3, src_data, frame_step);
  19.     cv::Mat out_mat = cv::Mat(cv::Size(frame_width, frame_height), CV_8UC3);
  20.     cv::cvtColor(frame, out_mat, CV_RGB2BGR);
  21.     char yuv_name[100] = "";
  22.     sprintf(yuv_name, "yuv_%ld.png", appCtx->kafka_last_send_time);
  23.     cv::imwrite(yuv_name, out_mat);
  24.   }
  25.   return;
  26. }

调用位置在convert_batch_and_push_to_input_thread方法中完成Transform后:

save_transformed_plate_images(mem->surf);
  printf(
        "\n---------------->saved transformed plate images to disk prior to sgie "
        "detection");
即可打印出来图片。

另外还有其他小的注意点:

#include <opencv2/opencv.hpp>

#include <opencv2/imgproc/types_c.h>

头文件及makefile配置,就不过多赘述了。

CFLAGS+=-I/usr/local/include/opencv4/

整个代码段展示:

//zwh start

  1. static void save_transformed_plate_images(NvBufSurface * surface) {
  2.  
  3.   for (uint frameIndex = 0; frameIndex < surface->numFilled;
  4.       frameIndex++) {
  5.     void *src_data = NULL;
  6.     src_data = (char *)malloc(surface->surfaceList[frameIndex].dataSize);
  7.     if (src_data == NULL) {
  8.     g_print("Error: failed to malloc src_data \n");
  9.     }
  10.     cudaMemcpy((void *)src_data,
  11.         (void *)surface->surfaceList[frameIndex].dataPtr,
  12.         surface->surfaceList[frameIndex].dataSize,
  13.         cudaMemcpyDeviceToHost);
  14.     gint frame_width = (gint)surface->surfaceList[frameIndex].width;
  15.     gint frame_height = (gint)surface->surfaceList[frameIndex].height;
  16.     size_t frame_step = surface->surfaceList[frameIndex].pitch;
  17.     printf("all_bbox_generated called! colorformat =%d\n", surface->surfaceList[frameIndex].colorFormat);
  18.     cv::Mat frame = cv::Mat(frame_height, frame_width, CV_8UC3, src_data, frame_step);
  19.     cv::Mat out_mat = cv::Mat(cv::Size(frame_width, frame_height), CV_8UC3);
  20.     cv::cvtColor(frame, out_mat, CV_RGB2BGR);
  21.     char yuv_name[100] = "";
  22.     sprintf(yuv_name, "yuv_%ld.png", appCtx->kafka_last_send_time);
  23.     cv::imwrite(yuv_name, out_mat);
  24.   }
  25.   return;
  26. }
  27.  
  28.  
  29. static gboolean
  30. convert_batch_and_push_to_input_thread (GstNvInfer *nvinfer,
  31.     GstNvInferBatch *batch, GstNvInferMemory *mem)
  32. {
  33.   NvBufSurfTransform_Error err = NvBufSurfTransformError_Success;
  34.   std::string nvtx_str;
  35.  
  36.   /* Set the transform session parameters for the conversions executed in this
  37.    * thread. */
  38.   err = NvBufSurfTransformSetSessionParams (&nvinfer->transform_config_params);
  39.   if (err != NvBufSurfTransformError_Success) {
  40.     GST_ELEMENT_ERROR (nvinfer, STREAM, FAILED,
  41.         ("NvBufSurfTransformSetSessionParams failed with error %d", err), (NULL));
  42.     return FALSE;
  43.   }
  44.  
  45.   nvtxEventAttributes_t eventAttrib = {0};
  46.   eventAttrib.version = NVTX_VERSION;
  47.   eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
  48.   eventAttrib.colorType = NVTX_COLOR_ARGB;
  49.   eventAttrib.color = 0xFFFF0000;
  50.   eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII;
  51.   nvtx_str = "convert_buf batch_num=" + std::to_string(nvinfer->current_batch_num);
  52.   eventAttrib.message.ascii = nvtx_str.c_str();
  53.  
  54.   nvtxDomainRangePushEx(nvinfer->nvtx_domain, &eventAttrib);
  55.  
  56.   if (batch->frames.size() > 0) {
  57.     /* Batched tranformation. */
  58.     err = NvBufSurfTransform (&nvinfer->tmp_surf, mem->surf,
  59.               &nvinfer->transform_params);
  60.   }
  61.  
  62.   nvtxDomainRangePop (nvinfer->nvtx_domain);
  63.  
  64.   if (err != NvBufSurfTransformError_Success) {
  65.     GST_ELEMENT_ERROR (nvinfer, STREAM, FAILED,
  66.         ("NvBufSurfTransform failed with error %d while converting buffer", err),
  67.         (NULL));
  68.     return FALSE;
  69.   }
  70.   save_transformed_plate_images(mem->surf);
  71.   printf(
  72.         "\n---------------->saved transformed plate images to disk prior to sgie "
  73.         "detection");
  74.   LockGMutex locker (nvinfer->process_lock);
  75.   /* Push the batch info structure in the processing queue and notify the output
  76.    * thread that a new batch has been queued. */
  77.   g_queue_push_tail (nvinfer->input_queue, batch);
  78.   g_cond_broadcast (&nvinfer->process_cond);
  79.  
  80.   return TRUE;
  81. }

————————————————
版权声明:本文为CSDN博主「zhang-wen-han」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35377454/article/details/123797606

相关文章