2013-01-29 2 views
1

Besoin d'aide, Plz voir la question suivante, je pose cette question la deuxième fois, parce que la dernière fois je n'ai pas eu de réponse. Tenez compte après deux liens => 1:=> Finding Skew Angle 2:=> Rotating Image as per skew angleTrouver angle d'inclinaison et faire pivoter l'image en C++ OpenCV

je veut faire la même chose, et le code donné sur ce lien fonctionne bien. Mais le problème est, voir le texte affiché dans ces images, ce code fonctionne bien pour le texte bien aligné seulement (tel qu'affiché dans les images sur les liens donnés), mais il obtient échoué lorsque votre texte est sous forme dispersée. S'il vous plaît dites-moi comment le faire pour les images qui contiennent du texte sous la forme dispersée ..? Merci d'avance..!! [Ici, le principal défi est de TROUVER l'ANGLE CORRECT SKEW ..] Je suis très frustré à cause de ce problème ... Plz Help .. !!!

Mon code est la suivante: =>

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

} 
+0

Ici, ça recommence. Qu'avez-vous essayé? –

+0

Dois-je mettre mon code ici ..? Si vous voulez voir ... –

+0

Oui, s'il vous plaît, les gens ont tendance à résoudre les problèmes plus rapidement de cette façon. –

Répondre

1

Cette approche est vouée à l'échec si vous avez un texte dispersé, car il repose sur la recherche de longues lignes de texte. En outre, le terme "skew" est un peu malheureux dans ce cas parce que c'est une rotation pure dans les exemples affichés. Ce que je ferais, ce serait de faire des projections de lignes sur une gamme d'orientations (par exemple, la transformation de Radon ou la recherche de lignes de Hough). Lorsque votre projection de ligne a la bonne orientation, il y aura beaucoup de zéros dans la projection de ligne causée par les intervalles d'interligne. L'orientation qui donne les valeurs les plus nuls dans la projection est l'angle de rotation le plus probable du texte.

Questions connexes