Please provide complete information as applicable to your setup.
• Hardware Platform (Jetson / GPU) jetson and dgpu
• DeepStream Version deepstream6.2
• JetPack Version (valid for Jetson only) jetpack5.1.1
• TensorRT Version
• NVIDIA GPU Driver Version (valid for GPU only)
• Issue Type( questions, new requirements, bugs)
hello:
I am using opencv preprocess frame, example for rotate is work well Deepstream sample code snippet,
but cv::warpPerspective output is black, input nv12(layout is linear)—>inter_buf(nv12 layout pitch)–>opencv(undistort test ok)---->new inter_buf2—>opencv(warpPerspective test ok)---->get finall reuslt(fail).
void updateInput(NvBufSurface surface){
for (unsigned int bs = 0; bs < surface->batchSize; bs++) {
NvBufSurfaceMap(surface, 0, 0, NVBUF_MAP_READ);
/ Cache the mapped data for CPU access */
NvBufSurfaceSyncForCpu(surface, 0, 0);
guint height = surface->surfaceList[bs].height;
guint width = surface->surfaceList[bs].width;
NvBufSurfaceUnMap(surface, 0, 0);
NvBufSurface *inter_buf = nullptr;
NvBufSurfaceCreateParams create_params;
create_params.gpuId = surface->gpuId;
create_params.width = width;
create_params.height = height;
create_params.size = 0;
create_params.colorFormat = NVBUF_COLOR_FORMAT_RGBA;
create_params.layout = NVBUF_LAYOUT_PITCH;
create_params.memType = NVBUF_MEM_DEFAULT;
// Create another scratch RGBA NvBufSurface
if (NvBufSurfaceCreate(&inter_buf, 1, &create_params) != 0)
{
GST_ERROR("Error: Could not allocate internal buffer ");
return ;
}
inter_buf->numFilled = 1;
NvBufSurfTransformConfigParams transform_config_params;
NvBufSurfTransformParams transform_params;
NvBufSurfTransformRect src_rect;
NvBufSurfTransformRect dst_rect;
cudaStream_t cuda_stream;
cudaStreamCreateWithFlags(&cuda_stream, cudaStreamNonBlocking);
transform_config_params.compute_mode = NvBufSurfTransformCompute_Default;
transform_config_params.gpu_id = surface->gpuId;
transform_config_params.cuda_stream = cuda_stream;
NvBufSurfTransform_Error err = NvBufSurfTransformSetSessionParams(&transform_config_params);
if (err != NvBufSurfTransformError_Success)
{
printf(“NvBufSurfTransformSetSessionParams failed with error %d\n”, err);
return ;
}
src_rect = {0, 0, width, height};
dst_rect = {0, 0, width, 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;
/ Transformation format conversion, Transform rotated RGBA mat to NV12 memory in original input surface*/
err = NvBufSurfTransform(surface, inter_buf, &transform_params);
if (err != NvBufSurfTransformError_Success)
{
printf(“NvBufSurfTransform failed with error %d while converting buffer\n”, err);
return ;
}
NvBufSurfaceMap(inter_buf, -1, -1, NVBUF_MAP_READ_WRITE);
NvBufSurfaceSyncForCpu(inter_buf, 0, 0); // will do nothing for unified memory type on dGPU
// guint height = inter_buf->surfaceList[0].height;
// guint width = inter_buf->surfaceList[0].width;
cv::Mat rgba_mat = cv::Mat(height, width, CV_8UC4,
inter_buf->surfaceList[0].mappedAddr.addr[0],
inter_buf->surfaceList[0].pitch);
cv::Mat cam = (cv::Mat_(3, 3) << 5902.8, 0, 913.09, 0, 5376.9,
653.8, 0, 0, 1);
cv::Mat coeff =
(cv::Mat_(5, 1) << -0.210, -106.76, -0.11, 0.0854, 787.9);
cv::Mat pre1;
cv::undistort(rgba_mat,pre1 , cam, coeff);
static int mid_cnt=0;
mid_cnt++;
std::string mat_name2 = “mid+undistort” + std::to_string(mid_cnt)+“.jpg”;
cv::imwrite(mat_name2, pre1);
NvBufSurface *inter_buf2 = nullptr;
NvBufSurfaceCreateParams create_params2;
create_params2.gpuId = surface->gpuId;
create_params2.width = width;
create_params2.height = height;
create_params2.size = 0;
create_params2.colorFormat = NVBUF_COLOR_FORMAT_RGBA;
create_params2.layout = NVBUF_LAYOUT_PITCH;
create_params2.memType = NVBUF_MEM_DEFAULT;
// Create another scratch RGBA NvBufSurface
if (NvBufSurfaceCreate(&inter_buf2, 1, &create_params2) != 0)
{
printf(“Error: Could not allocate internal buffer \n”);
return ;
}
inter_buf2->numFilled = 1;
if (NvBufSurfaceMap(inter_buf2, 0, 0, NVBUF_MAP_READ_WRITE) != 0)
{
printf(“in_surf map error \n”);
return;
}
NvBufSurfaceSyncForCpu(inter_buf2, 0, 0);
cv::Mat inter2_mat = cv::Mat(height, width, CV_8UC4,
inter_buf2->surfaceList[0].mappedAddr.addr[0],
inter_buf2->surfaceList[0].pitch);
cv::Mat k = (cv::Mat_(3, 3) << 0.99, 0.0468, -15.9, 0, 0.98,
0.053, 0, 0, 1);
cv::warpPerspective(pre1, inter2_mat, k, cv::Size(1902, 1080));
std::string mat_name4 = “mid+warpPerspective” + std::to_string(mid_cnt)+“.jpg”;
cv::imwrite(mat_name4, inter2_mat);//test ok
NvBufSurfaceSyncForDevice(inter_buf2, 0, 0);
NvBufSurfaceUnMap(inter_buf2, 0, 0);
if (NvBufSurfaceMap(inter_buf2, 0, 0, NVBUF_MAP_READ_WRITE) != 0)
{
printf(“map error====================\n”);
}
else
{
NvBufSurfaceSyncForCpu(inter_buf2, 0, 0);
cv::Mat input = cv::Mat(height, width, CV_8UC4,
inter_buf2->surfaceList[0].mappedAddr.addr[0],
inter_buf2->surfaceList[0].pitch);
std::string mat_name2 = “getRet” + std::to_string(mid_cnt) + “.jpg”;
cv::imwrite(mat_name2, input);//fail
// NvBufSurfaceSyncForDevice(inter_buf, 0, 0);
NvBufSurfaceUnMap(inter_buf2, 0, 0);
}
mid+undistort.jpg
mid+warpPerspective.jpg
gstRet.jpg