Hough трансформация для линий с использованием OpenCV Java

Прежде всего я пытаюсь разработать приложение для Android, чтобы обнаружить сигналы ЭКГ от отсканированных копий ЭКГ, состоящих из 12 сигналов / копия. У меня есть решение на Matlab, и я пытаюсь реализовать его в Android Studio (Java) с помощью библиотеки OpenCV. На этом шаге я готов использовать грубое преобразование, чтобы обнаружить линии (потому что сигнал ЭКГ движется линейно), а следующим шагом является вычисление медианного значения этих линий, которое поможет мне на следующем этапе.

Вот мой код в Matlab и результат:

>     [H,T,R] = hough(BW,'RhoResolution',1,'Theta',[-90:-60,60:89]);
>     P  = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
>     lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
> 
> max_len = 0; for k = 1:length(lines)
>     xy = [lines(k).point1; lines(k).point2];
>     % Plot beginnings and ends of lines
>       plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
>       plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
>     len = norm(lines(k).point1 - lines(k).point2);
>     if ( len > max_len)
>         max_len = len;
>         xy_long = xy;
>     end end
>     xy = [lines(k).point1; lines(k).point2];
>     allLines=[allLines;xy]; end centerRow=round(median(allLines(:,2)));

введите описание изображения здесь я пытаюсь сейчас реализовать тот же код в Java, используя HoughLines или HoughLinesP. HoughLines предоставляет возможность задавать диапазон значений тета, но кажется, что невозможно установить параметры FillGap и minLength. Вот реализация, которая не работает (попытка чтения из нулевого массива):

int threshold = 50;
            Imgproc.HoughLines(ImageClearedLeft[0],lines,1,Math.PI/180,threshold,0,0,Math.PI/3,Math.PI/2);
            for( int  i = 0; i < lines.cols(); i++ )
            {

                double [] rho=lines.get(i,0);
                double theta [] = lines.get(i,1);
                Point pt1=new Point(0,0);
                Point pt2=new Point(0,0);
                double a = cos(theta[0]), b = sin(theta[0]);
                double x0 = a*rho[0], y0 = b*rho[0];
                pt1.x = Math.round(x0 + 1000*(-b));
                pt1.y = Math.round(y0 + 1000*(a));
                pt2.x = Math.round(x0 - 1000*(-b));
                pt2.y = Math.round(y0 - 1000*(a));
                line(ImageClearedLeft[0], pt1, pt2, new Scalar(0,0,255), 4);
            }    

Я попытался использовать HoughLinesP, которые дают в результате только одну строку (я думаю, потому что невозможно установить минимальное и максимальное значения тета)

Пожалуйста, я также хочу спросить, есть ли доступ к H, матрица грубого преобразования, потому что, как вы можете видеть, мой порог в matlab зависит от H..

Большое спасибо!

0 ответов

Другие вопросы по тегам