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..
Большое спасибо!