如何使用OpenCV有效地检测图像中的聚类中心

时间:2015-05-16 17:05:37

标签: c++ opencv image-processing

所以,我试图在下一帧中用OpenCV找到白色星团的中心:

*screenshot made with OpenCV imshow()*

我已经尝试过HoughGradient函数,但它的结果不一致,因为这些聚类在所有帧中都不是圆形的。还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

我认为你有两种选择。

  1. 使用连接的组件查找blob,因为您知道 他们是循环的,对他们的中心做一些估计。该 OpenCV文档中的drawcontours函数有一个很好的功能 如何使用轮廓查找连接组件的示例:http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#drawcontours

  2. 如果您知道您的斑点是白色/白色,您可以找到所有像素的索引,其颜色接近白色/白色,并手动将每组索引重建为连接成分

  3. (可能相关的帖子:OpenCV Object Detection - Center Point

答案 1 :(得分:0)

正如@berak指出的那样,你可以用片刻找到斑点的质心

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

Point getCentroid( InputArray Points )
{
    Point Coord;
    Moments mm = moments( Points, false );
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}

int main( int argc, char* argv[] )
{
    Mat src = imread( argv[1] );

    Mat gray;
    cvtColor( src, gray, CV_BGR2GRAY );
    gray = gray > 127;

    Mat nonzeropixels;
    findNonZero( gray, nonzeropixels );

    Point pt = getCentroid( nonzeropixels );
    rectangle(src, pt,pt, Scalar(0, 255, 0), 2);

    imshow("result",src);
    waitKey();

    return 0;
}

测试图像&amp;结果:(绿点是白色斑点的质心)

enter image description here enter image description here

enter image description here enter image description here