оценить уровень перекоса с помощью houghLines

Я хочу определить уровень перекоса изображения. У меня есть следующий код:

public void analyse(CvMat img) {

    rows = img.rows();
    cols = img.cols();
    // create edge-map from rois
    CvMat edgeMap = cvCreateMat(rows, cols, CV_8UC1);

    cvCanny(img, edgeMap, 100, 400, 3);

    // transform to hough
    CvMemStorage storage = cvCreateMemStorage(0);
    lines = cvHoughLines2(edgeMap, storage, CV_HOUGH_PROBABILISTIC, 1,


    EuclideanDistance euclideanDistance = new EuclideanDistance();
    double maxDistance = Double.MIN_VALUE;
    for (int i = 0; i < lines.total(); ++i) {
        Pointer line = cvGetSeqElem(lines, i);
        CvPoint pt1 = new CvPoint(line).position(0);
        CvPoint pt2 = new CvPoint(line).position(1);
        double distance = euclideanDistance.getDistance(pt1, pt2);
        double currentAngle = Math.atan2(pt2.y() - pt1.y(),
                pt2.x() - pt1.x())
                * 180 / Math.PI;
        System.out.println(currentAngle);
        if (distance > maxDistance) {

            skewAngle = currentAngle;

        }
    }

Мое тестовое изображение: skew

Я думаю, что уровень перекоса составляет -16 градусов, но мой код говорит, что на 25...

for также выводит средний угол на 25. Что не так с моими параметрами?

// РЕДАКТИРОВАТЬ здесь рисунок из houghLines введите здесь описание изображения

Привет


person 501 - not implemented    schedule 31.08.2012    source источник
comment
Скорее кажется, что вы случайно масштабировали изображение - оно было прямоугольником, а теперь вписывается в квадрат. Проблема во внешнем коде.   -  person Lyth    schedule 31.08.2012
comment
да, спасибо ... я видел это ... я масштабировал входное изображение до другого соотношения .... - .- спасибо   -  person 501 - not implemented    schedule 31.08.2012


Ответы (1)


Во-первых, поскольку у вас довольно четкий текст, я предлагаю вам использовать расширение/размытие до Canny and Hough. Внутри букв вы получите гораздо больше очков, от которых Хаф обязательно выиграет.

Во-вторых, вы выбираете «лучший угол» как максимальное расстояние между двумя точками линии.

double distance = euclideanDistance.getDistance(pt1, pt2);
...
if (distance > maxDistance) {
    skewAngle = currentAngle;
}

Это НЕ будет работать, потому что на самом деле Хаф может обнаружить некоррелированную строку, которая длиннее любой строки текста:

Пока не получилось

У вас может получиться лучший алгоритм, если вы продемонстрируете себе каждый сделанный шаг — что вы получите после Кэнни, какие строки произвело преобразование Хафа и т. д.

person Lyth    schedule 31.08.2012