Как сравнить позиции Hough Line в OpenCV? - PullRequest
3 голосов
/ 29 января 2011

Использование VC ++ и Open CV. Вот что я пытаюсь сделать: найдите первые три почти горизонтальные линии неровностей и нарисуйте их. найти все почти вертикальные линии и нарисовать их если любая вертикальная линия выше горизонтальной линии, тогда FLAG устанавливается на 0 если над горизонтальной линией нет вертикальной линии Хафа (все ниже), тогда FLAG = 1

    int n, i,c=0;
    int flag = 0;

    cvCanny( src, dst, 50, 150, 3 );
    lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 10, 5, 5 );
    n = lines->total;

    for( i = 0; i < n; i++ )
    {
        CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
        CvPoint pt1, pt2, hpt1, hpt2, vpt1, vpt2;
        int hy = 0, vy = 0;         
        pt1 = line[0];
        pt2 = line[1];   
        theta = atan( (double)(pt2.y - pt1.y)/(pt2.x - pt1.x) ); /*slope of line*/
        degree = theta*180/CV_PI;  
        if( fabs(degree) < 8) //checking for near horizontal line
        {
            c++;
            if( c > 0 && c <5)  /*main horizontal lines come first*/
            {
                cvLine( out, pt1, pt2, CV_RGB(255, 255,255), 1, CV_AA, 0 );
                hpt1 = line[0];
                hpt2 = line[1];

                if( hpt1.y > hpt2.y ) //finds out lower end-point
                    hy = hpt1.y;
                else
                    hy = hpt2.y;
            }
        }

        if( fabs(degree) > 70 ) /*near vertical lines*/
        {
            cvLine( out, pt1, pt2, CV_RGB(255, 255,255), 1, CV_AA, 0 );

            vpt1 = line[0];
            vpt2 = line[1];

            if( vpt1.y > vpt2.y ) //finds upper end-pt of vertical line
                    vy = vpt1.y;
            else
                vy = vpt2.y;

            if( vy >= hy ) //if vert line is lower than horizontal line
                flag = 1;
            else 
                flag = 0;

        }

    }
    display( out, "hough lines" );
    return flag;
}

Однако для изображения, даже если вертикальные линии обнаружены над горизонтальной линией - пока флаг не вернется 1. Итак, я неправильно считаю по оси? Пожалуйста, помогите мне.

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Строки if( fabs(degree) > 70 ) и if( fabs(degree) < 8 ) выглядят неправильно. Угол около 180 означает почти горизонтальный ... вы, вероятно, хотите изменить это, и иметь в виду периодичность углов (так что около 360 также почти горизонтальный). Способ хорошо обработать это будет использовать if (fabs(cos(angle - desired_angle)) > 0.996), что примерно означает "если угол и требуемый_угольник находятся в пределах 5 градусов друг от друга, независимо от направления". 0.996 - это примерно косинус 5 градусов, если вам нужно более точное, введите больше цифр - 0.9961946980917455 - это более близкое совпадение.

Кроме того, ваш заказ петли отключен. Вы не find the first three nearly-horizontal hough lines and draw them. find all the nearly-vertical lines and draw them if any vertical line is above the horizontal line в этой последовательности, вы перебираете все строки в любом порядке и обрабатываете их независимо - вертикальные могут предшествовать горизонтальным, поэтому вы не знаете, что проверять.

В-третьих,

            if( hpt1.y > hpt2.y ) //finds out lower end-point
                hy = hpt1.y;
            else
                hy = hpt2.y;

против

        if( vpt1.y > vpt2.y ) //finds upper end-pt of vertical line
                vy = vpt1.y;
        else
            vy = vpt2.y;

Вы используете тот же код, чтобы найти нижнюю координату, чтобы найти более высокую. Как вы думаете, это может сработать?

В-четвертых,

        if( vy >= hy ) //if vert line is lower than horizontal line
            flag = 1;
        else 
            flag = 0;

Значение флага зависит от последнего прохождения этого фрагмента кода. Это не соответствует any в вашем описании.

1 голос
/ 13 сентября 2012

Намного проще не использовать PPHL (прогрессивный вероятностный алгоритм Hough Lines), а SHL (стандартный HL)! Так что вы получите полярную форму линии с углом и радиусом! Затем вы можете просто проверить угол, не вычисляя его самостоятельно.

Если выходной угол составляет около 0 ° или 180 °, это вертикальная линия, а если он составляет около 90 °, это горизонтальная линия ...

...