一个到vx_image的数组

时间:2017-07-20 05:46:35

标签: openvx

我想从数组中创建一个vx_image。让我们说我有二维数组:

unsigned char img_array[720][1280]={{..},{..}, ... }   // filled with values

我想成功

vx_image

这样我就可以执行各种像素级操作。做同样事情的任何其他想法也没关系。

1 个答案:

答案 0 :(得分:0)

我认为互操作的最佳方式是:从VX(CUDA)到CUDA(本机)或OpenCV(CUDA),反之亦然。其中一个很好的方法是here。另一种可能的方式如下(此片段取自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()中的操作也应该维护此规则。