Deskewing Image OpenCV

时间:2017-08-28 06:41:12

标签: c++ objective-c opencv rotation computer-vision

我已经按照这篇文章关于如何计算和校正图像以获得更好的Tesseract OCR结果:http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/

计算出正确的角度,但文本实际上从未旋转过。

这些是我正在使用的方法:

+(UIImage *) prepareImage: (UIImage *)image{
    return deskew(image, computeSkew(image));
}

// Organization -> Deskewing

double computeSkew(UIImage *image)
{
    Mat src;
    UIImageToMat(image, src);
    cv::Size size = src.size();

    bitwise_not(src, src);

    vector<Vec4i> lines;
    HoughLinesP(src, lines, 1, CV_PI/180, 100, size.width / 2.f, 20);

    Mat disp_lines(size, CV_8UC1, Scalar(0, 0, 0));
    double angle = 0.;
    unsigned nb_lines = lines.size();
    for (unsigned i = 0; i < nb_lines; ++i)
    {
        line(disp_lines, cv::Point(lines[i][0], lines[i][1]),
             cv::Point(lines[i][2], lines[i][3]), Scalar(255, 0 ,0));
        angle += atan2((double)lines[i][3] - lines[i][1],
                       (double)lines[i][2] - lines[i][0]);
    }
    angle /= nb_lines; // mean angle, in radians.
    cout << angle << endl;
    return angle;
}

UIImage* deskew(UIImage *image, double angle)
{
    Mat img;
    UIImageToMat(image, img);

    bitwise_not(img, img);

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

    RotatedRect box = minAreaRect(Mat(points));
    Mat rot_mat = getRotationMatrix2D(box.center, angle, 1);
    Mat rotated;
    warpAffine(img, rotated, rot_mat, img.size(), INTER_CUBIC);
    return MatToUIImage(rotated);
}

UIImageToMat和MatToUIImage是可靠的来回转换方法。我也尝试以弧度和度数返回角度。两次从prepareImage函数返回的图像仍然以与原始图像相同的角度倾斜。

0 个答案:

没有答案