vx_image 的数组
An array to vx_image
我想从数组中创建一个 vx_image。假设我有二维数组:
unsigned char img_array[720][1280]={{..},{..}, ... } // filled with values
我想做
vx_image
以便我可以执行各种像素级操作。任何其他做同样事情的想法也可以。
我认为最好的互操作方式是:从 VX(CUDA) 到 CUDA(native) 或 OpenCV(CUDA),反之亦然。 给出了一种很好的方法。另一种可能的方式如下(此片段摘自 VisionWorks 文档):
void processImageWithCUDA(vx_image src, vx_image dst)
{
vx_df_image format = 0;
vxQueryImage(src, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format));
assert( format == VX_DF_IMAGE_RGB );
// Get valid region
vx_rectangle_t rect;
vxGetValidRegionImage(src, &rect);
// Map VisionWorks data objects into CUDA device memory
vx_map_id src_map_id;
vx_uint8* src_ptr;
vx_imagepatch_addressing_t src_addr;
vxMapImagePatch(src, &rect, 0, &src_map_id, &src_addr, (void **)&src_ptr, VX_READ_ONLY, NVX_MEMORY_TYPE_CUDA, 0);
vx_map_id dst_map_id;
vx_uint8* dst_ptr;
vx_imagepatch_addressing_t dst_addr;
vxMapImagePatch(dst, &rect, 0, &dst_map_id, &dst_addr, (void **)&dst_ptr, VX_WRITE_ONLY, NVX_MEMORY_TYPE_CUDA, 0);
// Call CUDA function
cudaStream_t stream = NULL;
myOperations_image(src_addr.dim_x, src_addr.dim_y,
stream);
cudaStreamSynchronize(stream);
// Unmap VisionWorks data objects from CUDA device memory
vxUnmapImagePatch(src, src_map_id);
vxUnmapImagePatch(dst, dst_map_id);
}
在这两种情况下,我们都不会复制到主机内存,否则会大大降低性能,但需要注意的是 myOperations_image() 内部的操作也应遵守此规则。
您可以使用方法 vxCreateImageFromHandle
从外部分配的内存中创建一个 vx_image
:https://www.khronos.org/registry/OpenVX/specs/1.1/html/df/d09/group__group__image.html#ga5abb694617a79024621e3ba95237a109。
我想从数组中创建一个 vx_image。假设我有二维数组:
unsigned char img_array[720][1280]={{..},{..}, ... } // filled with values
我想做
vx_image
以便我可以执行各种像素级操作。任何其他做同样事情的想法也可以。
我认为最好的互操作方式是:从 VX(CUDA) 到 CUDA(native) 或 OpenCV(CUDA),反之亦然。
void processImageWithCUDA(vx_image src, vx_image dst)
{
vx_df_image format = 0;
vxQueryImage(src, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format));
assert( format == VX_DF_IMAGE_RGB );
// Get valid region
vx_rectangle_t rect;
vxGetValidRegionImage(src, &rect);
// Map VisionWorks data objects into CUDA device memory
vx_map_id src_map_id;
vx_uint8* src_ptr;
vx_imagepatch_addressing_t src_addr;
vxMapImagePatch(src, &rect, 0, &src_map_id, &src_addr, (void **)&src_ptr, VX_READ_ONLY, NVX_MEMORY_TYPE_CUDA, 0);
vx_map_id dst_map_id;
vx_uint8* dst_ptr;
vx_imagepatch_addressing_t dst_addr;
vxMapImagePatch(dst, &rect, 0, &dst_map_id, &dst_addr, (void **)&dst_ptr, VX_WRITE_ONLY, NVX_MEMORY_TYPE_CUDA, 0);
// Call CUDA function
cudaStream_t stream = NULL;
myOperations_image(src_addr.dim_x, src_addr.dim_y,
stream);
cudaStreamSynchronize(stream);
// Unmap VisionWorks data objects from CUDA device memory
vxUnmapImagePatch(src, src_map_id);
vxUnmapImagePatch(dst, dst_map_id);
}
在这两种情况下,我们都不会复制到主机内存,否则会大大降低性能,但需要注意的是 myOperations_image() 内部的操作也应遵守此规则。
您可以使用方法 vxCreateImageFromHandle
从外部分配的内存中创建一个 vx_image
:https://www.khronos.org/registry/OpenVX/specs/1.1/html/df/d09/group__group__image.html#ga5abb694617a79024621e3ba95237a109。