我需要从太空中探测太阳。如何在OpenCv中检测太空中的太阳?
这些输入图像的例子:
我有形态学滤波后,这样的结果
这里的(两次open
操作)该处理的算法代码:
// Color to Gray
cvCvtColor(image, gray, CV_RGB2GRAY);
// color threshold
cvThreshold(gray,gray,150,255,CV_THRESH_BINARY);
// Morphologic open for 2 times
cvMorphologyEx(gray, dst, NULL, CV_SHAPE_RECT, CV_MOP_OPEN, 2);
对于这么简单的任务来说不是太重吗?以及如何找到太阳的中心?如果我发现白点,我会发现大地球的白点(第一个示例图像上的左上角)
请告诉我,我的进一步行动,检测太阳。
更新1:
试图通过公式取得centroid
的算法:{x,y} = {M10/M00, M01/M00}
CvMoments moments;
cvMoments(dst, &moments, 1);
double m00, m10, m01;
m00 = cvGetSpatialMoment(&moments, 0,0);
m10 = cvGetSpatialMoment(&moments, 1,0);
m01 = cvGetSpatialMoment(&moments, 0,1);
// calculating centroid
float centroid_x = m10/m00;
float centroid_y = m01/m00;
cvCircle(image,
cvPoint(cvRound(centroid_x), cvRound(centroid_y)),
50, CV_RGB(125,125,0), 4, 8,0);
在哪里地球的照片,我得到了这样的结果:
所以,质心在地球上。 :(
更新2:
试图cvHoughCircles
:
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* circles = cvHoughCircles(dst, storage, CV_HOUGH_GRADIENT, 12,
dst->width/2, 255, 100, 0, 35);
if (circles->total > 0) {
// getting first found circle
float* circle = (float*)cvGetSeqElem(circles, 0);
// Drawing:
// green center dot
cvCircle(image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
3, CV_RGB(0,255,0), -1, 8, 0);
// wrapping red circle
cvCircle(image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
cvRound(circle[2]), CV_RGB(255,0,0), 3, 8, 0);
}
第一个例子:宾果游戏,但第二 - 无;(
I”已经尝试了的不同配置- 无法找到适合每个示例照片的配置。
UPDATE3:
matchTemplate
办法为我工作(的mevatron
响应)。它与大量测试一起工作。
实际上,其工作原因与上述不同。对于初学者来说,这些图片中的任何地方都没有使用过类似的模板。而且,这比初始形态学方法慢几倍。 – mmgp
好点:)然而,因为我假设太空船是在我们的太阳系,我相信可以肯定地说只有一个太阳会出现:D – mevatron
我想这会失败,如果任何部分的HUD(飞行员用户界面)在阳光之上。除非模板匹配能够对比赛的优异程度进行评分,那么您可以将最好的结果设定为阈值,并且可能会有一些障碍。 –