Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Medición del ángulo de intersección

En este ejemplo se muestra cómo medir el ángulo y el punto de intersección entre dos vigas mediante , que es una rutina de seguimiento de contornos.bwtraceboundary Una tarea común en las aplicaciones de visión artificial es la medición manos libres mediante técnicas de adquisición de imágenes y procesamiento de imágenes.

Paso 1: Cargar imagen

Lea y dibuje flechas que apunten a dos vigas de interés.gantrycrane.png Es una imagen de una grúa pórtico utilizada para montar un puente.

RGB = imread('gantrycrane.png'); imshow(RGB);  text(size(RGB,2),size(RGB,1)+15,'Image courtesy of Jeff Mather',...      'FontSize',7,'HorizontalAlignment','right');  line([300 328],[85 103],'color',[1 1 0]); line([268 255],[85 140],'color',[1 1 0]);  text(150,72,'Measure the angle between these beams','Color','y',...      'FontWeight', 'bold');

Paso 2: Extraer la Región de Interés

Recortar la imagen para obtener sólo las vigas de la grúa pórtico elegida anteriormente. Este paso hará que sea más fácil extraer los bordes de las dos vigas metálicas.

% you can obtain the coordinates of the rectangular region using  % pixel information displayed by imtool start_row = 34; start_col = 208;  cropRGB = RGB(start_row:163, start_col:400, :);  imshow(cropRGB)

 % Store (X,Y) offsets for later use; subtract 1 so that each offset will % correspond to the last pixel before the region of interest offsetX = start_col-1; offsetY = start_row-1;

Paso 3: Umbral de la imagen

Convierta la imagen a blanco y negro para la posterior extracción de las coordenadas del borde mediante la rutina.bwtraceboundary

I = rgb2gray(cropRGB); BW = imbinarize(I); BW = ~BW;  % complement the image (objects of interest must be white) imshow(BW)

Paso 4: Encontrar el punto inicial en cada límite

La rutina requiere que especifique un único punto en un límite.bwtraceboundary Este punto se utiliza como ubicación inicial para el proceso de seguimiento de límites.

Para extraer el borde de la viga inferior, elija una columna de la imagen e inspeccione hasta que se produzca una transición de un píxel de fondo al píxel del objeto. Almacene esta ubicación para su uso posterior en la rutina.bwtraceboundary Repita este procedimiento para la otra viga, pero esta vez trazando horizontalmente.

dim = size(BW);  % horizontal beam col1 = 4; row1 = find(BW(:,col1), 1);  % angled beam row2 = 12; col2 = find(BW(row2,:), 1);

Paso 5: Traza los límites

La rutina se utiliza para extraer (X, Y) ubicaciones de los puntos de límite.bwtraceboundary Para maximizar la precisión de los cálculos de ángulo y punto de intersección, es importante extraer tantos puntos pertenecientes a las aristas de la viga como sea posible. Debe determinar el número de puntos experimentalmente. Dado que el punto inicial de la barra horizontal se obtuvo escaneando de norte a sur, es más seguro establecer el paso de búsqueda inicial para apuntar hacia el exterior del objeto, es decir. 'Norte'.

boundary1 = bwtraceboundary(BW, [row1, col1], 'N', 8, 70);  % set the search direction to counterclockwise, in order to trace downward. boundary2 = bwtraceboundary(BW, [row2, col2], 'E', 8, 90,'counter');  imshow(RGB); hold on;  % apply offsets in order to draw in the original image plot(offsetX+boundary1(:,2),offsetY+boundary1(:,1),'g','LineWidth',2); plot(offsetX+boundary2(:,2),offsetY+boundary2(:,1),'g','LineWidth',2);

Paso 6: Ajustar líneas a los límites

Aunque los pares de coordenadas (X,Y) se obtuvieron en el paso anterior, no todos los puntos se encuentran exactamente en una línea. ¿Cuáles se deben utilizar para calcular el ángulo y el punto de intersección? Suponiendo que todos los puntos adquiridos son igualmente importantes, ajuste las líneas a las ubicaciones de píxeles de límite.

La ecuación para una línea es y á [x 1]*[a; b]. Puede resolver los parámetros 'a' y 'b' en el sentido de mínimos cuadrados utilizando .polyfit

ab1 = polyfit(boundary1(:,2), boundary1(:,1), 1); ab2 = polyfit(boundary2(:,2), boundary2(:,1), 1);

Paso 7: Encontrar el ángulo de intersección

Utilice el producto punto para encontrar el ángulo.

vect1 = [1 ab1(1)]; % create a vector based on the line equation vect2 = [1 ab2(1)]; dp = dot(vect1, vect2);  % compute vector lengths length1 = sqrt(sum(vect1.^2)); length2 = sqrt(sum(vect2.^2));  % obtain the larger angle of intersection in degrees angle = 180-acos(dp/(length1*length2))*180/pi
angle = 129.4971 

Paso 8: Encontrar el punto de intersección

Resuelva el sistema de dos ecuaciones para obtener (X,Y) coordenadas del punto de intersección.

intersection = [1 ,-ab1(1); 1, -ab2(1)] \ [ab1(2); ab2(2)]; % apply offsets in order to compute the location in the original, % i.e. not cropped, image. intersection = intersection + [offsetY; offsetX]
intersection = 2×1

  143.0917
  295.7494

inter_x = intersection(2); inter_y = intersection(1);  % draw an "X" at the point of intersection plot(inter_x,inter_y,'yx','LineWidth',2);  text(inter_x-60, inter_y-30, [sprintf('%1.3f',angle),'{\circ}'],...      'Color','y','FontSize',14,'FontWeight','bold');  interString = sprintf('(%2.1f,%2.1f)', inter_x, inter_y);  text(inter_x-10, inter_y+20, interString,...      'Color','y','FontSize',14,'FontWeight','bold');

Paso 9: Trazar los resultados.

Consulte también

| | |

Ejemplos relacionados

Más acerca de