如何使用reinterpret_cast将compute :: vector <uchar4_>复制到std :: vector <unsigned char>

时间:2019-08-08 02:43:39

标签: c++ opencl boost-compute

我正在尝试使用带有boost :: compute的OPENCL将RGBA数组转换为灰度。转换发生,一切正常。问题是我必须将设备向量复制到主机上,并且在主机再次转换为数组之后。

我想直接从设备复制到主机,而无需两个复制功能(这使算法非常慢)

遵循我创建的功能:

void ToGreyScale(vector<unsigned char>& data) {
        using compute::uchar4_;
        // create vector for points
        compute::vector<uchar4_> vector(data.size() / 4,context);
    // copy point data to the device
    compute::copy(
            reinterpret_cast<uchar4_*>(&data[0]),
        reinterpret_cast<uchar4_*>(&data[0]) + data.size()/4,
        vector.begin(),
        queue
    );

    BOOST_COMPUTE_FUNCTION(uchar4_, to_grey, (uchar4_ x),
        {
        int grey = x.x * 0.114 + x.y * 0.587 + x.z * 0.299;
            x.x = grey;
        x.y = grey ;
            x.z = grey;
            return x;
        });
    boost::compute::transform(vector.begin(), vector.end(), vector.begin(), to_grey, queue);
        ///////////////////////////////////////
        ///I want to optimize this part
        ///////////////////////////////////////
    std::vector<uchar4_> out(vector.size());
    compute::copy(
    vector.begin(),
    vector.end(),
    out.begin(),
    queue
    );
    copy(
    reinterpret_cast<unsigned char*>(&out.front()),
    reinterpret_cast<unsigned char*>(&out.front()) + data.size(),
    data.begin()
    );
        /////////////////////////////////////////////////////
}

如果有任何方法不需要我知道的uchar4_转换为灰度(会更容易)

0 个答案:

没有答案