簡體   English   中英

在OpenCV中將Alpha通道應用於圖像的最快方法

[英]Fastest way to apply alpha channel to image in OpenCV

我目前正在使用以下功能將我的Alpha通道(存儲為單獨的GREY 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%的體積繁重的均值漂移分割應用程序。

關於如何更快地應用這些Alpha通道的任何建議? 如果您有任何基於GPU的解決方案,那么我正在使用GPU運行OpenCV。)

我最終在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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM