c++ - 在给定点拾取 Blob 的更快方法

标签 c++ opencv image-processing

我正在尝试为 matlab 的 bwselect 创建一个等效函数。所以,我想显示 blob(其中包含我将提供的点)并屏蔽其余部分。 这是我尝试过的。

cv::Mat bwselect(cv::Mat matImg, int x, int y)
{
    cv::Mat img_labels, stats, centroids, mask;
    if (matImg.data)
    {
        int numOfLables = connectedComponentsWithStats(matImg, img_labels, stats, centroids, 8, CV_32S);

        if (numOfLables > 1)
        {
            for (int i = 1; i < numOfLables; i++)
            {
                mask = cv::Mat::zeros(img_labels.size(), CV_8UC1);
                mask = mask | (img_labels == i);
                if (mask.at<uchar>(y, x) > 0)
                {
                    break;
                }

            }
        }
    }
    return mask;
}

它完成了工作。但它很慢。有没有更快更有效的方法来做到这一点?

最佳答案

如果输入图像很大并且包含很多对象,则可能会出现瓶颈,因为您要多次分配/取消分配大型掩码缓冲区。

此外,如果您多次调用此函数,明智的做法是仅调用一次 connectedComponentsWithStats,然后将其结果用作函数的附加输入。

我建议您替换整个循环

for (int i = 1; i < numOfLabels; i++){/*...*/}

有了这个

 // img_labels data type is CV_32S
 int label_at_pos = img_labels.at<int>(y, x); 

 if (label_at_pos > 0)
 {
    // create mask here and return it
 }

编辑:我对上面的代码示例进行了更正。 connectedComponentsWithStats 默认计算包含整数值的标签图像。

关于c++ - 在给定点拾取 Blob 的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49193949/

相关文章:

c++ - lambda 函数中的 max_element

c++ - 为 vardiac 和 normal 模板设置 typename 默认值

OpenCV POSIT算法——坐标系

c++ - 图像c++,opencv中均匀性/同质性的测量

c++ - 什么时候将类的引用分配给其父类的实例?

c++ - 二元运算符声明的“static”关键字

c++ - OpenCV:存储鼠标左键点击的点的坐标

c++ - OPENCV 中图像具有不同模型的 2 张图像的乘法

matlab - 在 matlab 中创建一个高通滤波器

iphone - 如何在 IOS sdk 中屏蔽图像?