2011-09-22 68 views

回答

3

我回答您的帖子上EMGU但估计你还没有签回,但就在于此。形状检测基于不可能匹配的阈值原理工作,这可以防止大量错误的分类。许多图像处理算法都是如此。基本上有没有完美的设置和设计师必须选择最合适的设置,以产生最理想的结果。 I.E.匹配最多的对象,没有说比实际存在的更多。

您需要逐个调整每个变量以查看您获得的结果类型。开始边缘检测。

Image<Gray, Byte> cannyEdges = gray.Canny(cannyThreshold, cannyThresholdLinking); 

看一看你的小图像看到有什么区别检测出的矩形和一个不是之间。你可能会缺少边缘或角落,这就是为什么它没有被分类。如果你正在调整cannyThreshold,并观察结果,如果好,那么保持它:)如果不好:(回到原始值。一旦满意调整cannyThresholdLinking并观察。

你会继续重复这个,直到你得到一个首选的图像这里的好处是你有3个项目进行比较,你会继续下去,直到没有被识别的项目匹配其他两个。

如果他们是相似的,可能是因为它是一个黑白图像,你需要进入霍夫线检测。

 LineSegment2D[] lines = cannyEdges.HoughLinesBinary(
      1, //Distance resolution in pixel-related units 
      Math.PI/45.0, //Angle resolution measured in radians. 
      20, //threshold 
      30, //min Line width 
      10 //gap between lines 
      )[0]; //Get the lines from the first channel 

使用相同的方法来调整一个值在一段时间,观察输出,你会希望找到你需要的设置。千万不要双脚跳进去,改变所有的数值,因为你永远不知道你的精度是否提高。最后,如果一切都失败了看那个检查霍夫结果矩形

     if (angle < 80 || angle > 100) 
         { 
          isRectangle = false; 
          break; 
         } 

少变量改变为霍夫应该做的所有的工作,你的部分。但仍然可以在这里完成。

对不起,没有直截了当的答案,但我希望你保持并解决问题。否则你总是可以随时调整图像的大小。

干杯

克里斯

+0

谢谢...至少这代表我可以遵循的路径。我同意大多数图像检测算法需要某种调整;但是我从来没有遇到过取决于图像大小而不是纵横比的图像。无论如何,边缘检测似乎不会影响结果(至少对于这个图像)。一旦我检查了其他参数,将会更新。 – Nav

+0

在这种情况下,您实际上增加了您要查找的对象的大小。很少算法实际上取决于图像大小或比例,但实际上取决于内部对象的大小。举个例子,未检测到的四边形是一个粗略的矩形(165,97,240,114),面积为27360像素。现在在你的第二张图片中,相同的四边形是矩形(214,129,310,146),增加了45'260像素的面积。现在增加了1.65倍,我相信你可以看到为什么检测到较大的那个。改变霍夫线代码应该解决你的问题,如果不是,我会看看,祝你好运 – Chris

+0

显然,在示例应用程序中,霍夫线不用于形状检测...轮廓是。如果点的数量是4 =>矩形等。另外,这是我的问题,角度限制了检测到的矩形的数量。任何超过10度的倾斜(即使所有线条都处于相同角度),形状也会被丢弃。我现在可以摆弄这个:)。还有一件阴险的事情正在进行,虽然......形状被检测到两次:/ – Nav