Hello,
I do save crop image with opencv; when trying NvBufSurfTransform get error while converting buffer, this error happen when I set engine gpu with the second one (gpu-id = 1), It worked with the first gpu (gpu-id = 0). Maybe I do set parameter wrong so please help me check it out.
{
NvBufSurfTransform_Error err;
NvBufSurfTransformParams transform_params;
NvBufSurfTransformRect src_rect;
NvBufSurfTransformRect dst_rect;
src_rect = {(guint)src_top, (guint)src_left, (guint)src_width, (guint)src_height};
dst_rect = {0, 0, (guint)dest_width, (guint)dest_height};
// Set the transform parameters
transform_params.src_rect = &src_rect;
transform_params.dst_rect = &dst_rect;
transform_params.transform_flag =
NVBUFSURF_TRANSFORM_FILTER | NVBUFSURF_TRANSFORM_CROP_SRC |
NVBUFSURF_TRANSFORM_CROP_DST;
transform_params.transform_filter = NvBufSurfTransformInter_Default;
//Memset the memory
NvBufSurfaceMemSet (nvinfer->inter_buf, 0, 0, 0);
GST_DEBUG_OBJECT (nvinfer, "Crop input buffer\n");
// Transformation scaling+format conversion if any.
err = NvBufSurfTransform (src_surf, nvinfer->inter_buf, &transform_params);
if (err != NvBufSurfTransformError_Success) {
GST_ELEMENT_ERROR (nvinfer, STREAM, FAILED,
("NvBufSurfTransform failed with error %d while converting buffer gpu src %d to gpu dest %d", err, src_surf->gpuId, nvinfer->inter_buf->gpuId),
(NULL));
goto error;
}
// Map the buffer so that it can be accessed by CPU
//int NvBufSurfaceMap (NvBufSurface *surf, int index, int plane, NvBufSurfaceMemMapFlags type)
int e = NvBufSurfaceMap (nvinfer->inter_buf, 0, 0, NVBUF_MAP_READ);
if (e != 0){
GST_ELEMENT_ERROR (nvinfer, STREAM, FAILED,
("Map the buffer %d so that it can be accessed by CPU", e),
(NULL));
goto error;
}
// Cache the mapped data for CPU access
//int NvBufSurfaceSyncForCpu (NvBufSurface *surf, int index, int plane)
NvBufSurfaceSyncForCpu (nvinfer->inter_buf, 0, 0);
cv::Mat in_mat = cv::Mat (nvinfer->network_height, nvinfer->network_width,
CV_8UC4, nvinfer->inter_buf->surfaceList[0].mappedAddr.addr[0],
nvinfer->inter_buf->surfaceList[0].pitch);
char * name = g_strdup_printf("./debug/gie-%d-%d-%d-%d-%d.jpg", nvinfer->unique_id, (guint)src_top, (guint)src_left, (guint)src_width, (guint)src_height);
cv::cvtColor (in_mat, in_mat, CV_RGBA2BGR);
cv::imwrite(name, in_mat);
g_free(name);
//int NvBufSurfaceUnMap (NvBufSurface *surf, int index, int plane)
if (NvBufSurfaceUnMap (nvinfer->inter_buf, 0, 0)){
goto error;
}
}
Note that: source NvBufSurface and dest NvBufSurface have same gpuId is 1