如何使用 OpenCV 有效地检测图像中的簇中心
How to efficiently detect the center of clusters in an image with OpenCV
所以,我试图在下一帧中用 OpenCV 找到白色簇的中心:
我已经尝试过 HoughGradient 函数,但结果不一致,因为这些簇在所有帧中都不是圆形。还有其他建议吗?
我想你有两个选择。
使用连通分量来查找斑点,因为你知道
他们是圆形的,对他们的中心做一些估计。这
drawcontours
函数在OpenCV文档中有很好的
如何使用轮廓查找连通分量的示例:http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#drawcontours
如果你知道你的斑点是白色/偏白,你可以找到所有颜色接近白色/偏白的像素的索引,并手动重建每组索引到连接的组件。
(潜在相关 post:OpenCV Object Detection - Center Point)
正如@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;
}
测试图像和结果:(绿点是白色斑点的质心)
所以,我试图在下一帧中用 OpenCV 找到白色簇的中心:
我已经尝试过 HoughGradient 函数,但结果不一致,因为这些簇在所有帧中都不是圆形。还有其他建议吗?
我想你有两个选择。
使用连通分量来查找斑点,因为你知道 他们是圆形的,对他们的中心做一些估计。这
drawcontours
函数在OpenCV文档中有很好的 如何使用轮廓查找连通分量的示例:http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#drawcontours如果你知道你的斑点是白色/偏白,你可以找到所有颜色接近白色/偏白的像素的索引,并手动重建每组索引到连接的组件。
(潜在相关 post:OpenCV Object Detection - Center Point)
正如@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;
}
测试图像和结果:(绿点是白色斑点的质心)