2014-09-23 88 views
3

我使用OpenCV进行图像预处理。我只需要扫描照片,而不是白色区域。 我使用algoritm:扫描图像上的文档检测OpenCV

  • image_canny < - 应用Canny边缘检测器,用于该信道
  • 用于阈值在bunch_of_increasing_thresholds:
  • image_thresholds [阈] < - 应用阈值,以该信道 在找到的每个轮廓{ image_canny} U image_thresholds:
  • 近似轮廓与多边形
  • 如果近似有四个角并且角度接近90度。 d扫描图像上的矩形对象。但是这个例子不起作用,如果我把我的照片放在扫描仪的角落里!

有人可以提醒,我怎么能在扫描的图像上找到这张照片?任何示例,方法?

+1

如果您分享一些样本图片或其他相关图片,效果会更好。 – 2014-09-24 07:54:29

+0

Thx编辑!当然,我附上样品:[样品1](http://s019.radikal.ru/i632/1409/e3/9b867ca286a7.jpg),[样品2](http://i003.radikal.ru/1409/12/990fc8613b1f .JPG) – 2014-09-25 00:12:49

回答

0

有几种方法可以实现您的目标。我将给出OpenCvSharp的代码,对于普通的C++来说它是相似的。

  1. 尝试在图像周围添加一些中性边框。例如,您可以在源图像周围添加10-20像素的白色。它可能会产生错误的轮廓,但您的图像目标部分仍然不在角落。

    Mat img = Cv2.ImRead("test.jpg"); 
    Mat imgExtended = new Mat(new OpenCvSharp.Size(img.Size().Width + 40, img.Size().Height + 40), MatType.CV_8UC3, Scalar.White); 
    OpenCvSharp.Rect roi = new OpenCvSharp.Rect(new OpenCvSharp.Point(20, 20), img.Size()); 
    img.CopyTo(imgExtended.SubMat(roi)); 
    img = imgExtended; 
    Mat coloredImage = img.Clone(); 
    Cv2.CvtColor(img, img, ColorConversionCodes.BGR2GRAY); 
    OpenCvSharp.Point[][] contours; 
    HierarchyIndex[] hierarchy; 
    Cv2.Canny(img, result, 80, 150); 
    Cv2.FindContours(result, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); 
    
  2. 您有对象和几乎白色的背景。你可以做任何阈值操作,然后采取最大的一团。

更新。 在这两种情况下,图像顶部的黑线和左角的黑色区域仍然可能是问题。在这种情况下,你可以通过该功能

double Cv2.ContourArea(Point[] Contour); 

选择面积最大的轮廓,然后尝试创建边框,这将最大限度地减少错误。