Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在图像中找到图像?_C#_Emgucv - Fatal编程技术网

C# 如何在图像中找到图像?

C# 如何在图像中找到图像?,c#,emgucv,C#,Emgucv,如何在图像中找到图像 现在我正在使用EmguCV,并根据本教程编写了以下代码: 第一步 步骤2 步骤3 这是我迄今为止最好的结果,但它并不完美,因为我仍然需要一些边来创建图像周围的所有边界框 步骤4 我想要的是找到图像中每个图像的所有边缘,这样我就可以制作出完美的边界框。 我对EmguCV/OpenCV还不熟悉,但我仍然认为我最好的选择是使用这个库来解决这个问题。 我只需要找到正确的工具并正确使用它们,这就是我希望这里的人能帮助我的:)以下是您可以做的: 加载图像 反转-img.Not

如何在图像中找到图像

现在我正在使用EmguCV,并根据本教程编写了以下代码:

第一步 步骤2 步骤3

这是我迄今为止最好的结果,但它并不完美,因为我仍然需要一些边来创建图像周围的所有边界框

步骤4

我想要的是找到图像中每个图像的所有边缘,这样我就可以制作出完美的边界框。

我对EmguCV/OpenCV还不熟悉,但我仍然认为我最好的选择是使用这个库来解决这个问题。
我只需要找到正确的工具并正确使用它们,这就是我希望这里的人能帮助我的:)

以下是您可以做的:

  • 加载图像
  • 反转-
    img.Not()
  • 转换为灰度-
    img.Convert()
  • 执行二进制阈值处理-
    img.Convert().ThresholdBinary(新灰色(54)、新灰色(255))
它将生成以下图像,优化阈值以获得更好的结果:

  • 获取凸包和边界框。执行过滤,以便获得符合条件的对象。可以使用轮廓面积、周长等

    var Contours = new List<Contour<Point>>();
    for (Contour<Point> contours = _gray.FindContours(
       HAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, RETR_TYPE.CV_RETR_EXTERNAL); 
       contours != null; contours = contours.HNext)
    {
        Seq<Point> pts = contours.GetConvexHull(ORIENTATION.CV_CLOCKWISE);
        double diff = Math.Round(Math.Abs(pts.Area - contours.Area) / 
          pts.Area, 2);
    
        //additional constraint
        double q = contours.Area / contours.Perimeter;
    
        //bounding box of the counter
        Rectangle rect = contours.BoundingRectangle;
    
        //customize the value to suit your need
        if (contours.BoundingRectangle.Height > 5 && 
         contours.BoundingRectangle.Width > 5)
        {
            Contours.Add(contours);
        }
    } 
    
    var等高线=新列表();
    对于(等高线=_gray.FindContours(
    HAIN_近似法。CV_链近似法(简单,翻新类型。CV_翻新外部);
    等高线!=null;等高线=等高线.HNext)
    {
    Seq pts=等高线GetConvxhull(方向为顺时针);
    双差=数学圆(数学绝对值(点面积-轮廓面积)/
    临时秘书处区域,2);
    //附加约束
    双q=等高线。面积/等高线。周长;
    //计数器的边界框
    矩形矩形=等高线。边框矩形;
    //定制价值以满足您的需要
    如果(等高线.BoundingRectangle.Height>5&&
    轮廓.BoundingRectangle.Width>5)
    {
    等高线。添加(等高线);
    }
    } 
    
  • 使用
    轮廓执行所需操作(例如,填充并用作遮罩以提取每个图像、绘制边界框等)


谢谢!我根据您的示例制作了一个工作原型,效果非常好。但是有一个问题,因为如果背景是黑色而不是像这样的白色,那么它将不再工作。我发现我可以通过不反转来解决它,但是我怎么知道我是否必须反转它呢?你可以计算黑色像素或白色像素的数量,设置一个阈值,然后选择是否反转图像。阈值可以是黑色像素的总数占总图像的百分比,比如20%或0.20。如果满足此条件,则可以选择反转图像或不反转图像。
var Contours = new List<Contour<Point>>();
for (Contour<Point> contours = _gray.FindContours(
   HAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, RETR_TYPE.CV_RETR_EXTERNAL); 
   contours != null; contours = contours.HNext)
{
    Seq<Point> pts = contours.GetConvexHull(ORIENTATION.CV_CLOCKWISE);
    double diff = Math.Round(Math.Abs(pts.Area - contours.Area) / 
      pts.Area, 2);

    //additional constraint
    double q = contours.Area / contours.Perimeter;

    //bounding box of the counter
    Rectangle rect = contours.BoundingRectangle;

    //customize the value to suit your need
    if (contours.BoundingRectangle.Height > 5 && 
     contours.BoundingRectangle.Width > 5)
    {
        Contours.Add(contours);
    }
}