3

我有以下代码,它只是一个简单的测试程序,用于学习如何在 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 提出的完整代码,我得到了这个:

在此处输入图像描述

我认为问题可能是连接的组件无法正常工作。

尝试了我桌面上的一张图片,终于得到了一些东西:

在此处输入图像描述

然而,这一次源图像是一张有人、建筑物、汽车……的常规图片,并且大部分输出仍然是空白的。有人知道为什么吗?

添加后image = image < 200;

在此处输入图像描述

使用applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);,标签图像从几乎黑色灰度变为蓝色阴影

在此处输入图像描述

4

1 回答 1

7

结果就在那里,你只是看不到它们!


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;
}
于 2016-01-18T11:55:45.967 回答