Scoreboard digit recognition using OpenCV

前端 未结 5 1428
轻奢々
轻奢々 2021-01-31 05:59

I am trying to extract numbers from a typical scoreboard that you would find at a high school gym. I have each number in a digital \"alarm clock\" font and have managed to persp

相关标签:
5条回答
  • 2021-01-31 06:08

    If you are trying text recognition with Tesseract, try passing not one digit, but a number of duplicated digits, sometimes it could produce better results, here's the example. However, if you're planning a business software, you may want to have a look at a commercial OCR SDK. For example, try ABBYY FineReader Engine. It's not affordable for free to use applications, but when it comes to business, it can a good value to your product. As far as i know, ABBYY provides the best OCR quality, for example check out http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison

    0 讨论(0)
  • 2021-01-31 06:13

    You want your scorecard image inputs S feeding an algorithm that maps them to {0,1,2,3,4,5,6,7,8,9}.

    Let V denote the set of n-tuples of integers.

    Construct an algorithm α that maps each image S to a n-tuple

    (k1,k2,...,kn)

    that can differentiate between two different scoreboard digits.

    If you can specify the range of α then you only have to collect the vectors in V that correspond to a digit in order to solve the problem.

    I've applied this idea using Martin Beckett's idea and it works. My initial attempt was a simple injection into a 2-tuple by vertical left-to-right summing, with the first integer a image column offset and the second integer was the length of a 'nice' vertical line.

    This did not work - images for 6 and 8 would map to the same vectors. So I needed another mini-info-capture for my digit input types (they are not scoreboard) and a 3-tuple info vector does the trick.

    0 讨论(0)
  • 2021-01-31 06:15

    Given the highly regular nature of your input, you could define a set of 7 target areas of the image to check. Each area should encompass some significant portion of one of the 7 segments of each digital of the display, but not overlap.

    You can then check each area and average the color / brightness of the pixels in to to generate a probability for a given binary state. If your probability is high on all areas you can then easily figure out what the digit is.

    It's not as elegant as a pure ML type algorithm, but ML is far more suited to inputs which are not regular, and in this case that does not seem to apply - so you trade elegance for accuracy.

    0 讨论(0)
  • 2021-01-31 06:20

    Might sound silly but have you tried simply checking for black bars vertically and then horizontally in the top and bottom halfs - left and right of the centerline ?

    0 讨论(0)
  • 2021-01-31 06:27

    The classical digit recognition, which should work well in this case is to crop the image just around the digit and resize it to 4x4 pixels.

    A Discrete Cosine Transform (DCT) can be used to further slim down the search space. You could select the first 4-6 values.

    With those values, train a classifier. SVM is a good one, readily available in OpenCV.

    It is not as simple as emma's or martin suggestions, but it's more elegant and, I think, more robust.

    Given the width/height ratio of your input, you may choose a different resolution, like 3x4. Choose the smallest one that retains readable digits.

    0 讨论(0)
提交回复
热议问题