Hi I’m using VisionWorks NVX CUDA Primitives API,
I wanted to use the nvxcuRemap function to remap the input image without distortions, I have the problem of how to create the table input.
I have map_x and map_y in cv::Mat but the object nvxcu_pitch_linear_image_t is only one but comparing the pitch size nvxcu with the sum of the two cv::Mat map_x and map_y are equal. What I didn’t understand is how to write in nvxcu_pitch_linear_image_t the two vectors cv::Mat.
when I had to write an single image I did this
nvxcu_pitch_linear_image_t image = { };
image.base.format = NVXCU_DF_IMAGE_RGB;
image.base.image_type = NVXCU_PITCH_LINEAR_IMAGE;
image.base.width = frameWidth;
image.base.height = frameHeight;
size_t pitch = 0ul;
uint32_t cn = 3u;
NVXIO_CUDA_SAFE_CALL( cudaMallocPitch(&image.planes[0].dev_ptr, &pitch,
image.base.width * cn, image.base.height) );
image.planes[0].pitch_in_bytes = static_cast<uint32_t>(pitch);
cv::cvtColor(frame_left, frame_left, cv::COLOR_BGR2RGB);
cudaMemcpy2D(eventData.frame.planes[0].dev_ptr,(size_t)eventData.frame.planes[0].pitch_in_bytes,frame_left.ptr(),frameWidth*cn,frameWidth*cn,frameHeight,cudaMemcpyHostToDevice);
My problem is how to load two vectors cv::Mat in an nvxcu_pitch_linear_image_t ?
Thanks
Hi,
The table should be NVXCU_DF_IMAGE_2F32, which indicates a size=2 array of nvxcu_pitch_linear_image_t.
So instead of loading two vectors cv::Mat in an nvxcu_pitch_linear_image_t, you should create a nvxcu_pitch_linear_image_t for each cv::Mat.
Thanks.
did you mean in this way?
nvxcu_pitch_linear_image_t table_left = { };
table_left.base.format = NVXCU_DF_IMAGE_2F32;
table_left.base.image_type = NVXCU_PITCH_LINEAR_IMAGE;
table_left.base.width = frameWidth;
table_left.base.height = frameHeight;
size_t pitch = 0ul;
NVXIO_CUDA_SAFE_CALL( cudaMallocPitch(&table_left.planes[0].dev_ptr, &pitch, table_left.base.width * sizeof(float), table_left.base.height) );
table_left.planes[0].pitch_in_bytes = static_cast<uint32_t>(pitch);
NVXIO_CUDA_SAFE_CALL( cudaMallocPitch(&table_left.planes[1].dev_ptr, &pitch, table_left.base.width * sizeof(float), table_left.base.height) );
table_left.planes[1].pitch_in_bytes = static_cast<uint32_t>(pitch);
cudaMemcpy2D(table_left.planes[0].dev_ptr,(size_t)table_left.planes[0].pitch_in_bytes,mapLeft[0].ptr(),mapLeft[0].step,table_left.base.width*sizeof(float),frameHeight,cudaMemcpyHostToDevice);
cudaMemcpy2D(table_left.planes[1].dev_ptr,(size_t)table_left.planes[1].pitch_in_bytes,mapLeft[1].ptr(),mapLeft[1].step,table_left.base.width*sizeof(float),frameHeight,cudaMemcpyHostToDevice);
this is the result
Summary
my solution is wrong, in the documentation it talks about only one planes.
NVXCU_DF_IMAGE_2F32 | A single plane of float32_t[2] data (for example, motion fields).
Hi,
Please create a nvxcu_pitch_linear_image_t array with size = 2.
Thanks.
nvxcu_pitch_linear_image_t table[2];
table[0].base.format = NVXCU_DF_IMAGE_2F32;
table[0].base.image_type = NVXCU_PITCH_LINEAR_IMAGE;
table[0].base.width = frameWidth;
table[0].base.height = frameHeight;
size_t pitch = 0ul;
NVXIO_CUDA_SAFE_CALL( cudaMallocPitch(&table[0].planes[0].dev_ptr, &pitch, table[0].base.width * sizeof(float), table[0].base.height) );
table[0].planes[0].pitch_in_bytes = static_cast<uint32_t>(pitch);
table[1].base.format = NVXCU_DF_IMAGE_2F32;
table[1].base.image_type = NVXCU_PITCH_LINEAR_IMAGE;
table[1].base.width = frameWidth;
table[1].base.height = frameHeight;
pitch = 0ul;
NVXIO_CUDA_SAFE_CALL( cudaMallocPitch(&table[1].planes[0].dev_ptr, &pitch, table[1].base.width * sizeof(float), table[1].base.height) );
table[1].planes[0].pitch_in_bytes = static_cast<uint32_t>(pitch);
I’ve done it, now what should I pass to the function expects a “const nvxcu_image_t * table”. I used to get this with “&table.base”. but now I have an nvxcu_pitch_linear_image_t[2] table how do I pass it?
There is no update from you for a period, assuming this is not an issue any more.
Hence we are closing this topic. If need further support, please open a new one.
Thanks
Hi,
Could you pass the &table
to see if it works first?
Thanks.