使用EmguCV从图像中检测文本区域

时间:2015-07-13 05:20:33

标签: c# opencv ocr emgucv

我是EmguCV和OpenCV的新手。我想使用EmguCV从图像中检测文本区域。

使用OpenCV已经在Stack上发布了一些解决方案。

  1. Extracting text OpenCV
  2. 但无法将该OpenCV代码转换为EmguCV。

1 个答案:

答案 0 :(得分:2)

以下是您通过EMGU向c#提供的链接中接受的答案的直接转换。您可能必须进行一些更改,因为它的实现略有不同,但它应该让您开始。我也怀疑它是非常强大的,所以根据您的具体用途,它可能不适合。祝你好运。

public List<Rectangle> detectLetters(Image<Bgr, Byte> img)
{
    List<Rectangle> rects = new List<Rectangle>();
    Image<Gray, Single> img_sobel;
    Image<Gray, Byte> img_gray, img_threshold;
    img_gray = img.Convert<Gray, Byte>();
    img_sobel = img_gray.Sobel(1,0,3);
    img_threshold = new Image<Gray, byte>(img_sobel.Size);
    CvInvoke.cvThreshold(img_sobel.Convert<Gray, Byte>(), img_threshold, 0, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_OTSU);
    StructuringElementEx element = new StructuringElementEx(3, 17, 1, 6, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT);
    CvInvoke.cvMorphologyEx(img_threshold, img_threshold, IntPtr.Zero, element, Emgu.CV.CvEnum.CV_MORPH_OP.CV_MOP_CLOSE, 1);
    for (Contour<System.Drawing.Point> contours = img_threshold.FindContours(); contours != null; contours = contours.HNext)
    {
        if (contours.Area > 100)
        {
            Contour<System.Drawing.Point> contours_poly = contours.ApproxPoly(3);
            rects.Add(new Rectangle(contours_poly.BoundingRectangle.X, contours_poly.BoundingRectangle.Y, contours_poly.BoundingRectangle.Width, contours_poly.BoundingRectangle.Height));
        }
    }
    return rects;
}

用法:

Image<Bgr, Byte> img = new Image<Bgr, Byte>("VfDfJ.png");
List<Rectangle> rects = detectLetters(img);
for (int i=0;i<rects.Count();i++)
    img.Draw(rects.ElementAt<Rectangle>(i),new Bgr(0,255,0),3);
CvInvoke.cvShowImage("Display", img.Ptr);
CvInvoke.cvWaitKey(0);
CvInvoke.cvDestroyWindow("Display");