File: text_skewness_correction.cpp

package info (click to toggle)
opencv 4.10.0%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 282,092 kB
  • sloc: cpp: 1,178,079; xml: 682,621; python: 49,092; lisp: 31,150; java: 25,469; ansic: 11,039; javascript: 6,085; sh: 1,214; cs: 601; perl: 494; objc: 210; makefile: 173
file content (74 lines) | stat: -rw-r--r-- 2,257 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
This tutorial demonstrates how to correct the skewness in a text.
The program takes as input a skewed source image and shows non skewed text.

*/

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#include <iostream>
#include <iomanip>
#include <string>

using namespace cv;
using namespace std;


int main( int argc, char** argv )
{
    CommandLineParser parser(argc, argv, "{@input | imageTextR.png | input image}");

    // Load image from the disk
    Mat image = imread( samples::findFile( parser.get<String>("@input") ), IMREAD_COLOR);
    if (image.empty())
    {
        cout << "Cannot load the image " + parser.get<String>("@input") << endl;
        return -1;
    }

    Mat gray;
    cvtColor(image, gray, COLOR_BGR2GRAY);

    //Threshold the image, setting all foreground pixels to 255 and all background pixels to 0
    Mat thresh;
    threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);

    // Applying erode filter to remove random noise
    int erosion_size = 1;
    Mat element = getStructuringElement( MORPH_RECT, Size(2*erosion_size+1, 2*erosion_size+1), Point(erosion_size, erosion_size) );
    erode(thresh, thresh, element);

    cv::Mat coords;
    findNonZero(thresh, coords);

    RotatedRect box = minAreaRect(coords);
    float angle = box.angle;

    // The cv::minAreaRect function returns values in the range [-90, 0)
    // if the angle is less than -45 we need to add 90 to it
    if (angle < -45.0f)
    {
        angle = (90.0f + angle);
    }

    //Obtaining the rotation matrix
    Point2f center((image.cols) / 2.0f, (image.rows) / 2.0f);
    Mat M = getRotationMatrix2D(center, angle, 1.0f);
    Mat rotated;

    // Rotating the image by required angle
    stringstream angle_to_str;
    angle_to_str << fixed << setprecision(2) << angle;
    warpAffine(image, rotated, M, image.size(), INTER_CUBIC, BORDER_REPLICATE);
    putText(rotated, "Angle " + angle_to_str.str() + " degrees", Point(10, 30), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 0, 255), 2);
    cout << "[INFO] angle: " << angle_to_str.str() << endl;

    //Show the image
    imshow("Input", image);
    imshow("Rotated", rotated);
    waitKey(0);
    return 0;
}