在OpenCV中应用alpha通道到图像的最快方式



我目前使用以下函数将alpha通道(存储为单独的GRAY cv::Mats)应用于图像:

void percepUnit::applyAlpha() {
    int x,y,w,h;
    /*vector<cv::Mat> channels;
    if (image.rows == mask.rows and image.cols == mask.cols) {
        cv::split(image,channels); // break image into channels
        channels.push_back(mask); // append alpha channel
        cv::merge(channels,alphaImage); // combine channels
    }*/
    // Avoid merge
    cv::Mat src[] = {this->image, this->mask};
    int from_to[] = {0,0, 1,1, 2,2, 3,3};
    this->alphaImage = Mat(image.rows, image.cols, CV_8UC4);
    cv::mixChannels(src, 2, &(this->alphaImage), 1, from_to, 4); // &(*alphaImage)?
}

我不得不将cv::Mats的分辨率提高到1280x720(由于:如何通过指针将实例替换为另一个实例?),现在这个函数运行得相当慢,使用了几乎50%的已经是一个沉重的meanshift分割应用程序。

关于如何更快地应用这些alpha通道,有什么建议吗?我正在运行OpenCV与GPU,如果你有任何基于GPU的解决方案)

我最终在GPU上做了拆分/合并:

void percepUnit::applyAlpha() {
    cv::gpu::GpuMat tmpImage, tmpMask, tmpAlphaImage;
    std::vector<cv::gpu::GpuMat> channels;
    tmpImage.upload(this->image);
    tmpMask.upload(this->mask);
    cv::gpu::split(tmpImage,channels); // break image into channels
    channels.push_back(tmpMask); // append alpha channel
    cv::gpu::merge(channels,tmpAlphaImage); // combine channels
    tmpAlphaImage.download(this->alphaImage);
    tmpAlphaImage.release();
    tmpImage.release();
    tmpMask.release();
    channels[0].release();
    channels[1].release();
    channels[2].release();
}

相关内容

  • 没有找到相关文章

最新更新