Deepstream保存一帧图像

hello:
I can save a frame of image using the following method
GstMapInfo in_map_info;
NvBufSurface *surface = NULL;

   struct timeval start, start1, start2,start3,start4,start5;
   memset (&in_map_info, 0, sizeof (in_map_info));
   if (!gst_buffer_map (buf, &in_map_info, GST_MAP_READ)) {
     g_print ("Error: Failed to map gst buffer\n");
     gst_buffer_unmap (buf, &in_map_info);
     return -1;
   }
  // cudaError_t cuda_err;

   gettimeofday(&start, NULL);
   NvBufSurfTransformRect src_rect, dst_rect;
   surface = (NvBufSurface *) in_map_info.data;  
 
   int batch_size= surface->batchSize;
//   printf("\nBatch Size : %d, resolution : %dx%d \n",batch_size,
//       surface->surfaceList[0].width, surface->surfaceList[0].height);

       scale_height = surface->surfaceList[0].height;
       scale_width = src_rect.width;
   src_rect.top   = 0;
   src_rect.left  = 0;
   src_rect.width = (guint) surface->surfaceList[0].width;
   src_rect.height= (guint) surface->surfaceList[0].height;
   dst_rect.top   = 0;
   dst_rect.left  = 0;
  // dst_rect.width = (guint) surface->surfaceList[0].width;
  // dst_rect.height= (guint) surface->surfaceList[0].height;
   dst_rect.width = 1920;
   dst_rect.height= 1080;

   NvBufSurfTransformParams nvbufsurface_params;
   nvbufsurface_params.src_rect = &src_rect;
   nvbufsurface_params.dst_rect = &dst_rect;
   nvbufsurface_params.transform_flag =  NVBUFSURF_TRANSFORM_CROP_SRC | NVBUFSURF_TRANSFORM_CROP_DST;
   nvbufsurface_params.transform_filter = NvBufSurfTransformInter_Default;
 
   NvBufSurface *dst_surface = NULL;
   NvBufSurfaceCreateParams nvbufsurface_create_params;

   /* An intermediate buffer for NV12/RGBA to BGR conversion  will be
    * required. Can be skipped if custom algorithm can work directly on NV12/RGBA. */
   nvbufsurface_create_params.gpuId  = surface->gpuId;
   nvbufsurface_create_params.width  = (gint) surface->surfaceList[0].width;
   nvbufsurface_create_params.height = (gint) surface->surfaceList[0].height;
   nvbufsurface_create_params.size = 0;
   nvbufsurface_create_params.colorFormat = NVBUF_COLOR_FORMAT_RGBA;
   nvbufsurface_create_params.layout = NVBUF_LAYOUT_PITCH;
   nvbufsurface_create_params.memType = NVBUF_MEM_DEFAULT;
    cudaSetDevice (surface->gpuId);

   cudaStream_t cuda_stream;
    cudaStreamCreate (&cuda_stream);

    gettimeofday(&start1, NULL);
   int create_result = NvBufSurfaceCreate(&dst_surface,batch_size,&nvbufsurface_create_params);    

   NvBufSurfTransformConfigParams transform_config_params;
   NvBufSurfTransform_Error err;

   transform_config_params.compute_mode = NvBufSurfTransformCompute_Default;
   transform_config_params.gpu_id = surface->gpuId;

err = NvBufSurfTransformSetSessionParams (&transform_config_params);

   NvBufSurfaceMemSet (dst_surface, 0, 0, 0);
   err = NvBufSurfTransform (surface, dst_surface, &nvbufsurface_params);
   if (err != NvBufSurfTransformError_Success) {
     g_print ("NvBufSurfTransform failed with error %d while converting buffer\n", err);
   }
   gettimeofday(&start2, NULL);
   NvBufSurfaceMap (dst_surface, 0, 0, NVBUF_MAP_READ);
   NvBufSurfaceSyncForCpu (dst_surface, 0, 0);
   gettimeofday(&start3, NULL);
   cv::Mat bgr_frame = cv::Mat (cv::Size(nvbufsurface_create_params.width, nvbufsurface_create_params.height), CV_8UC3);

   cv::Mat in_mat =
       cv::Mat (nvbufsurface_create_params.height, nvbufsurface_create_params.width,
       CV_8UC4, dst_surface->surfaceList[0].mappedAddr.addr[0],
       dst_surface->surfaceList[0].pitch);//矩阵一行占用的字节数       cv::Mat in_mat =
   cv::cvtColor (in_mat, bgr_frame, CV_RGBA2BGR);

   char* filename = new char[64];
   snprintf(filename, 64, "./img/image%03d_%u.jpg", frame_meta->frame_num,dst_surface->surfaceList[0].pitch);
   cv::imwrite(filename,bgr_frame);

,but when I use NvBufSurfaceMap (dst_surface, 0, 0, NVBUF_MAP_READ);
NvBufSurfaceSyncForCpu (dst_surface, 0, 0);
These two functions take 40ms, which is too slow. Can you provide me with a method that is not so slow? Thank you

Hi,
This is the solution. It should be fine if you don’t save every frame. You may try sudo jetson_clocks to get performance improvement.

For saving frames continuously, we would suggest use h264 or h265 encoding.