OpenCV 3.0 连通部件,无法正常工作

4
我有以下代码,这只是一个简单的测试程序,用来学习如何在openCV 3.0中使用连接组件功能。
int main(int argc, char** argv) {

char* line = argv[1];

Mat image;

image = imread(line,CV_LOAD_IMAGE_GRAYSCALE);   

cv::Mat label=Mat(image.size(),CV_16U);

int la=connectedComponents(image,label, 8,CV_16U);

    //tried also: label.convertTo(label,CV_8U,255);   
   // and label.convertTo(label,CV_16U,255);

namedWindow( "input", CV_WINDOW_AUTOSIZE );
imshow( "input", image);

    namedWindow( "ouput", CV_WINDOW_AUTOSIZE );
    imshow("output", label);
    cout<<la<<"\n";

    imwrite("output.png", label);
    waitKey(0);
    return 0;
    }

输入图像是一个带有两个红色正方形的白色背景的彩色图像。将该图像正确加载并显示为灰度图像。

程序输出

问题在于,无论我做什么,输出始终是一张空白图像,只是黑色或白色取决于convertTo参数。

但是,connectedComponents返回的值为2。

我尝试了Miki提出的完整代码,结果如下:

enter image description here

我觉得问题可能是连接组件没有正常工作。
尝试使用我桌面上的一张图片,最终得到了一些结果:

enter image description here

然而,这次的源图像是一张普通的图片,有人、建筑、汽车等...但大部分输出仍然是空白。有人知道为什么吗?
在添加image = image < 200;之后。

enter image description here

使用applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);,标签图像从近乎黑色的灰度变为蓝色调。

enter image description here


那不可能是对的。你应该在黑白图像上调用connectedComponents,其中黑色为背景,白色为前景。你正在传递灰度图像。在调用connectedComponets之前尝试添加这些行:image = image < 200; - Miki
我之前不知道这个,现在它正常工作了。谢谢! - jsa
1个回答

8

结果已经存在,只是你看不到它们!


label 包含每个标签的索引。这意味着,在此情况下,在 label 中,您具有以下像素值:

0 : background
1 : first connected component
2 : second connected component

你的图片比较暗。仅为了可视化目的,你可以添加这行代码:
Mat seeMyLabels;
normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);
imshow("Labels", seeMyLabels);

这将缩放值以显示范围。

请注意,图像应为二进制图像,具有黑色背景和白色前景。

完整代码:

#include <opencv2\opencv.hpp>
using namespace cv;

int main(int argc, char** argv)
{
    if (argc != 2) return -1;

    Mat image = imread(argv[1], IMREAD_GRAYSCALE);

    if (image.empty()) return -1;

    Mat label;
    int la = connectedComponents(image, label, 8, CV_16U);

    Mat seeMyLabels;
    normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);

    // You can apply a colormap for better visualization
    //applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);

    imshow("Labels", seeMyLabels);
    imshow("input", image);
    imshow("output", label);
    waitKey(0);

    return 0;
}

谢谢你的回答,但我仍然得到一张空白(黑色)的图片。我添加了“cout<<label; cout SeeMyLabels”的代码,并且发现整个标签Mat似乎由1构成,而SeeMyLabels全是0。 - jsa
1
请再检查一遍。在“标签”窗口中显示的 seeMyLabels 图像不会是黑色的。 - Miki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接