1. 程序源码

#include <iostream>
#include <VX/vx.h>

void print_convolution(vx_convolution convolution, const char *message)
{
    std::cout << "===============================" << std::endl;
    std::cout << message << std::endl;

    vx_size rows;
    vxQueryConvolution(convolution, (vx_enum)VX_CONVOLUTION_ROWS, &rows, sizeof(rows));

    vx_size cols;
    vxQueryConvolution(convolution, (vx_enum)VX_CONVOLUTION_COLUMNS, &cols, sizeof(cols));

    vx_uint32 scale;
    vxQueryConvolution(convolution, (vx_enum)VX_CONVOLUTION_SCALE, &scale, sizeof(scale));

    vx_size size;
    vxQueryConvolution(convolution, (vx_enum)VX_CONVOLUTION_SIZE, &size, sizeof(size));

    std::cout << "rows      : " << rows << std::endl;
    std::cout << "cols      : " << cols << std::endl;
    std::cout << "scale     : " << scale << std::endl;
    std::cout << "size      : " << size << std::endl;
    std::cout << "item size : " << size / (rows * cols) << std::endl;

    void* buffer = malloc(size);
    // 在用户内存中,卷积系数以行主轴的方式进行存储
    vxCopyConvolutionCoefficients(convolution, buffer, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
    std::cout << "convolution coefficients" << std::endl;
    for (int row = 0; row < rows; ++row) {
        std::cout << "\t";
        for (int col = 0; col < cols; ++col) {
            std::cout << ((vx_int16*)buffer)[row * cols + col] << "\t";
        }
        std::cout << std::endl;
    }
    free(buffer);
}

int main(int argc, char *argv[])
{
    (void) argc;
    (void) argv;

    vx_status status;
    vx_context context = vxCreateContext();

    // 参数 columns 与 rows 必须为基数,且要在范围 [3, VX_CONTEXT_CONVOLUTION_MAX_DIMENSION)
    vx_size cols = 7U;
    vx_size rows = 5U;
    vx_convolution convolution = vxCreateConvolution(context, cols, rows);
    print_convolution(convolution, "create");

    // 更新元素
    vx_int16 *coefficients = (vx_int16*)malloc(rows * cols * sizeof (vx_int16));
    for (int i = 0; i < rows * cols; ++i) {
        coefficients[i] = i;
    }
    vxCopyConvolutionCoefficients(convolution, coefficients, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
    print_convolution(convolution, "update items");

    // 设置属性
    vx_uint32 scale = 2;
    vxSetConvolutionAttribute(convolution, (vx_enum)VX_CONVOLUTION_SCALE, &scale, sizeof (scale));
    print_convolution(convolution, "update scale");

    free(coefficients);
    vxReleaseConvolution(&convolution);

    vxReleaseContext(&context);
    return EXIT_SUCCESS;
}

2. 运行结果

07-25 17:53