c++ - opencv 如何以高性能方式可视化非矩形区域(roi)

标签 c++ opencv mask roi visualize

我有一个图像 (cv::Mat) 和一个可以视为掩模的 ROI。我想显示原始图像,并在其上混合了 ROI。

我的蒙版比原始图像小:每个元素代表图像中的一个 block 。假设我的面具是这样的(注意我的面具不是矩形)

0  0  1
1  1  1
0  0  0

然后我想让 (mask == 1) 的部分保持不变,其余部分与颜色混合。这是我的代码

cv::Mat blocks = image.clone;
uint npixcol = 32;
uint npixrow = 32;
for (uint ri = 0; ri < 480; ++ri)
    for (uint ci = 0; ci < 640; ++ci)
        {
        if (mask[ri * 640 + ci])
            cv::rectangle(blocks, cv::Rect(ci * npixcol, ri * npixrow, npixcol, npixrow), cv::Scalar(0, 0, 0), CV_FILLED, 8, 0);
        }
cv::addWeighted(image, 0.5, blocks, 0.5, 0, image, -1);

如何在没有额外的“克隆”命令的情况下执行此操作,因为这不是很高效......

使其更清晰;这是我想要的一个例子(颜色并不重要)! enter image description here

最佳答案

您的面具颜色恒定吗?假设蒙版与图像尺寸相同(您可以轻松缩放它):-

//Manually instead of addWeighted()
for (uint ri = 0; ri < 480; ++ri)
    for (uint ci = 0; ci < 640; ++ci)
        {
        if (mask[ri * 640 + ci])
        {
            image.at<uchar>(ri,ci) [0] = image.at<uchar>(ri,ci) [0] * weight_blue;
            image.at<uchar>(ri,ci) [1] = image.at<uchar>(ri,ci) [1] * weight_green;
            image.at<uchar>(ri,ci) [2] = image.at<uchar>(ri,ci) [2] * weight_red;
        }

        }    

关于c++ - opencv 如何以高性能方式可视化非矩形区域(roi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22472762/

相关文章:

c++ - Google Code Jam 最小标量积

c++ - 似乎无法理解 c++ shared_ptr 和指向其代表对象的可靠指针

c++ - 多线程中的临界区用法?

java - 分水岭分割算法无法在 opencv android 中正常工作

eclipse - 如何在Eclipse中构建PCL + OpenCV + OpenNI项目

c++ - 如何将对整数视为分隔变量?

python-3.x - 如何在 mac Os 中将 openCv 与 Python3 链接起来

opencv - 生成单 channel 掩码

javascript - 在 KonvaJS 上使用带有 globalCompositeOperation 的图像掩码?

css - 如何在 IE 和 Mozilla 中使用 CSS Mask