在OpenCV中自动检测并裁剪ROI

时间:2013-01-28 05:56:56

标签: c++ visual-studio-2010 opencv

我将这些图像相互比较。然而,我认为我可以裁剪出太多的黑人,以使比较更有效。

Mars 1 Mars 2 Mars 3

我想做的是庄稼火星。在比较时,矩形或圆形可以产生更好的结果。我担心如果裁剪会导致不同尺寸的图像,那么比较不会像预期的那样有效吗?如果可能,想法如何做和示例代码?提前致谢

更新:尝试使用cvHoughCircles()它不会检测到这个星球:/

3 个答案:

答案 0 :(得分:6)

尝试使用颜色检测。你需要找到除黑色以外的所有颜色。 Herehere是对这种方法的很好的解释。

答案 1 :(得分:4)

您可以使用cvCvtColor(img,imgGrayScale,CV_BGR2GRAY)

将这些图像转换为灰度图像

然后使用cvThreshold(imgGrayScale,imgThresh,x,255,CV_THRESH_BINARY)对其进行阈值处理。在这里,你必须找到一个很好的x值(我认为x = 50是好的)。

CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));
cvMoments(imgThresh, moments, 1);
double moment10 = cvGetSpatialMoment(moments, 1, 0);
double moment01 = cvGetSpatialMoment(moments, 0, 1);
double area = cvGetCentralMoment(moments, 0, 0);
int x = moment10/area;
int y = moment01/area;

现在你知道了blob的(x.y)坐标。然后,您可以使用cvSetImageROI(imgThresh, cvRect(x-10, y-10, x+10, y+10))裁剪图像。这里我假设这个blob的半径小于10像素。

所有裁剪的图像大小相同,白色斑点(行星)正好位于图像的中间位置。

然后,您可以使用规范化的互相关来比较图像。

答案 2 :(得分:1)

直方图在这里失败没有根本原因。我会在做直方图之前将图像转换为灰度,只是为了使数字更易于管理。彩色图像具有3D直方图;红色,绿色,蓝色和灰度直方图都是该3D直方图的一维投影。