我正在使用C#编写程序来检测纸张边缘并从图像中裁剪出纸张的方形边缘。

下面是我要裁剪的图像。纸张将始终显示在页面底部。

我已经阅读了这些链接,但是我仍然不知道该怎么做。

OpenCV C++/Obj-C: Detecting a sheet of paper / Square Detection

编辑:我正在为此EMR项目使用EMGU

最佳答案

你也可以:

  • 将图像转换为灰度
  • 通过像素强度
  • 应用ThresholdBinary
  • 查找轮廓。
    要查看有关查找轮廓的示例,可以查看this帖子。FundContours方法不关心轮廓大小。在找到轮廓之前,这里要做的唯一一件事就是通过对图像进行二值化来强调轮廓(我们在步骤2中进行了此操作)。
    有关更多信息,请参见OpenCV文档:findContoursexample
  • 通过其边界框的大小和位置找到合适的轮廓。
    (在此步骤中,我们遍历所有在轮廓上找到的轮廓,并尝试使用已知的纸张尺寸,比例和相对位置-图像的左下角找出纸张轮廓中的哪一个)。
  • 使用纸的边框裁剪图像。
    Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage);
    Image<Bgr, byte> color = new Image<Bgr, byte>(colorImage);
    
    grayImage = grayImage.ThresholdBinary(new Gray(thresholdValue), new Gray(255));
    
    using (MemStorage store = new MemStorage())
    for (Contour<Point> contours= grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, store); contours != null; contours = contours.HNext)
    {
        Rectangle r = CvInvoke.cvBoundingRect(contours, 1);
    
        // filter contours by position and size of the box
    }
    
    // crop the image using found bounding box
    

  • UPD:我添加了更多详细信息。

    08-17 18:51