【问题标题】:EmguCV Shape Detection affected by Image Size受图像大小影响的 EmguCV 形状检测
【发布时间】:2026-02-23 23:05:02
【问题描述】:

我正在使用 Emgu 形状检测示例应用程序来检测给定图像上的矩形。即使纵横比保持不变,调整后图像的尺寸似乎也会影响检测到的形状数量。这就是我的意思:

Using (400,400), actual img size == 342,400

Using (520,520), actual img size == 445,520

为什么会这样?以及如何确定最优值?

谢谢

【问题讨论】:

    标签: image-processing emgucv


    【解决方案1】:

    我回复了您在 EMGU 上的帖子,但认为您还没有回来查看,但就是这样。形状检测的工作原理是阈值保持不太可能的匹配,这可以防止大量错误分类。对于许多图像处理算法来说都是如此。基本上没有没有完美的设置,设计师必须选择最合适的设置才能产生最理想的结果。 IE。匹配最多的对象,而不用说比实际更多。

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

    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
    

    使用相同的方法一次调整一个值并观察输出,您有望找到所需的设置。切勿双脚跳入并更改所有值,因为您永远不知道是否提高了准确性。最后,如果所有其他方法都失败了,请查看检查矩形 Hough 结果的部分

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

    需要更改的变量更少,因为应该可以为您完成所有工作。但在这里一切都可以解决。

    很抱歉没有直截了当的答案,但我希望您能坚持下去并解决问题。否则,您可以随时调整图像大小。

    干杯

    克里斯

    【讨论】:

    • 谢谢...至少这代表了我可以遵循的路径。我同意大多数图像检测算法都需要某种调整;但是,我从未遇到过取决于图像大小而不是纵横比的图像。无论如何,边缘检测似乎都不会影响结果(至少对于这个图像)。一旦我检查其他参数就会更新。
    • 在这种情况下,您实际上会增加您要查找的对象的大小。很少有算法实际上取决于图像大小或比例,但实际上取决于内部对象的大小。以您的示例为例,未检测到的四边形大致是 Rectangle(165,97,240,114),其面积为 27360 像素。现在在您的第二张图像中,相同的四边形是 Rectangle(214, 129, 310, 146),它的面积增加了 45'260 像素。现在增加了 x1.65,我相信您可以看到为什么会检测到更大的那个。如果不是,更改霍夫线代码应该可以解决您的问题,我会看看,祝你好运
    • 显然在示例应用程序中,霍夫线不用于形状检测......轮廓是。如果点数是 4 => 矩形等。此外,这是我的问题,角度限制了检测到的矩形数量。任何超过 10 度的倾斜(即使所有线都处于相同的角度),并且形状被丢弃。我现在可以摆弄这个了:)。不过,还有另一件险恶的事情正在发生……形状被检测到两次:/
    • 你说得对,图像大小/比例通常不如对象大小相关。但是,在此示例中,调整大小具有缩小检测到的边缘中的间隙的副作用。在我的另一张测试图像中确实是这种情况,与较大的图像相比,在较小的图像中检测到的矩形更多。