找到倾斜角度并在C ++ OpenCV中旋转图像

时间:2013-01-29 07:37:28

标签: android opencv

需要帮助,Plz看到以下问题,我第二次问这个问题,因为上次我没有得到任何答案。考虑以下两个链接=> 1:=> Finding Skew Angle 2:=> Rotating Image as per skew angle

我想做同样的事情,这个链接上给出的代码效果很好。但问题是,请参阅这些图像中显示的文本,此代码仅适用于良好对齐的文本(如给定链接上的图像中所示),但是当文本处于分散形式时,它会失败。请告诉我如何为包含分散形式的文本的图像执行此操作..?提前致谢..!! [这里的主要挑战是找到正确的角度......] 我很沮丧,因为这个问题... Plz帮助.. !!!

我的代码如下:=>

// Find Skew angle.
double compute_skew(const char* filename)
{

    // Load in grayscale.
    cv::Mat img = cv::imread(filename, 0);

    // 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);

    std::cout << "File **************Angle***************** " << filename << ": " << angle << std::endl;


    return angle;
}

// Rotate Image  according to skew angle.
void deskew(const char* filename, double angle)
{
    cv::Mat img = cv::imread(filename, 0);

    Point2f src_center(img.cols/2.0F, img.rows/2.0F);
    Mat rot_mat = getRotationMatrix2D(src_center, angle, 1.0);
    Mat rotated;
    warpAffine(img, rotated, rot_mat, img.size(), cv::INTER_CUBIC);

    imwrite(filename,rotated);

}

1 个答案:

答案 0 :(得分:1)

如果你有分散的文本,这种方法注定会失败,因为它依赖于查找长文本行。此外,在这种情况下,术语“倾斜”有点不幸,因为它在发布的示例中是纯粹的旋转。

我要做的是在一系列方向上进行线投影(cfr.Radon变换或Hough线搜索)。当线投影具有正确的方向时,由线间隙引起的线投影中将存在大量零。在投影中产生最多零值的方向是文本最可能的旋转角度。