Extracting text OpenCV

后端 未结 10 1952
臣服心动
臣服心动 2020-11-22 08:10

I am trying to find the bounding boxes of text in an image and am currently using this approach:

// calculate the local variances of the grayscale image
Mat          


        
10条回答
  •  醉梦人生
    2020-11-22 08:17

    this is a VB.NET version of the answer from dhanushka using EmguCV.

    A few functions and structures in EmguCV need different consideration than the C# version with OpenCVSharp

    Imports Emgu.CV
    Imports Emgu.CV.Structure
    Imports Emgu.CV.CvEnum
    Imports Emgu.CV.Util
    
            Dim input_file As String = "C:\your_input_image.png"
            Dim large As Mat = New Mat(input_file)
            Dim rgb As New Mat
            Dim small As New Mat
            Dim grad As New Mat
            Dim bw As New Mat
            Dim connected As New Mat
            Dim morphanchor As New Point(0, 0)
    
            '//downsample and use it for processing
            CvInvoke.PyrDown(large, rgb)
            CvInvoke.CvtColor(rgb, small, ColorConversion.Bgr2Gray)
    
            '//morphological gradient
            Dim morphKernel As Mat = CvInvoke.GetStructuringElement(ElementShape.Ellipse, New Size(3, 3), morphanchor)
            CvInvoke.MorphologyEx(small, grad, MorphOp.Gradient, morphKernel, New Point(0, 0), 1, BorderType.Isolated, New MCvScalar(0))
    
            '// binarize
            CvInvoke.Threshold(grad, bw, 0, 255, ThresholdType.Binary Or ThresholdType.Otsu)
    
            '// connect horizontally oriented regions
            morphKernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, New Size(9, 1), morphanchor)
            CvInvoke.MorphologyEx(bw, connected, MorphOp.Close, morphKernel, morphanchor, 1, BorderType.Isolated, New MCvScalar(0))
    
            '// find contours
            Dim mask As Mat = Mat.Zeros(bw.Size.Height, bw.Size.Width, DepthType.Cv8U, 1)  '' MatType.CV_8UC1
            Dim contours As New VectorOfVectorOfPoint
            Dim hierarchy As New Mat
    
            CvInvoke.FindContours(connected, contours, hierarchy, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple, Nothing)
    
            '// filter contours
            Dim idx As Integer
            Dim rect As Rectangle
            Dim maskROI As Mat
            Dim r As Double
            For Each hierarchyItem In hierarchy.GetData
                rect = CvInvoke.BoundingRectangle(contours(idx))
                maskROI = New Mat(mask, rect)
                maskROI.SetTo(New MCvScalar(0, 0, 0))
    
                '// fill the contour
                CvInvoke.DrawContours(mask, contours, idx, New MCvScalar(255), -1)
    
                '// ratio of non-zero pixels in the filled region
                r = CvInvoke.CountNonZero(maskROI) / (rect.Width * rect.Height)
    
                '/* assume at least 45% of the area Is filled if it contains text */
                '/* constraints on region size */
                '/* these two conditions alone are Not very robust. better to use something 
                'Like the number of significant peaks in a horizontal projection as a third condition */
                If r > 0.45 AndAlso rect.Height > 8 AndAlso rect.Width > 8 Then
                    'draw green rectangle
                    CvInvoke.Rectangle(rgb, rect, New MCvScalar(0, 255, 0), 2)
                End If
                idx += 1
            Next
            rgb.Save(IO.Path.Combine(Application.StartupPath, "rgb.jpg"))
    

提交回复
热议问题