Calculating skew of text OpenCV

Posted by Nick on Stack Overflow See other posts from Stack Overflow or by Nick
Published on 2014-06-04T19:37:29Z Indexed on 2014/06/09 15:26 UTC
Read the original article Hit count: 600

Filed under:
|
|

I am trying to calculate the skew of text in an image so I can correct it for the best OCR results.

Currently this is the function I am using:

double compute_skew(Mat &img)
{

    // Binarize
    cv::threshold(img, img, 225, 255, cv::THRESH_BINARY);

    // Invert colors
    cv::bitwise_not(img, img);

    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 3));
    cv::erode(img, img, element);

    std::vector<cv::Point> points;
    cv::Mat_<uchar>::iterator it = img.begin<uchar>();
    cv::Mat_<uchar>::iterator end = img.end<uchar>();
    for (; it != end; ++it)
        if (*it)
            points.push_back(it.pos());

    cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));

    double angle = box.angle;
    if (angle < -45.)
        angle += 90.;

    cv::Point2f vertices[4];
    box.points(vertices);
    for(int i = 0; i < 4; ++i)
        cv::line(img, vertices[i], vertices[(i + 1) % 4], cv::Scalar(255, 0, 0), 1, CV_AA);

    return angle;
}

When I look at then angle in debug I get 0.000000 enter image description here

However when I give it this image I get proper results of a skew of about 16 degrees:

enter image description here

How can I properly detect the skew in the first image?

© Stack Overflow or respective owner

Related posts about c++

Related posts about opencv