我正在尝试为matlab的bwselect
创建一个等效函数。因此,我想显示斑点(包含要提供的点)并掩盖其余部分。
这是我尝试过的。
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计算默认情况下包含整数值的标签图像。