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

Este ejemplo muestra cómo medir el ángulo y el punto de intersección entre dos vigas utilizando, que es una rutina de trazado de contorno.bwtraceboundary Una tarea común en aplicaciones de visión artificial es la medición de manos libres utilizando técnicas de adquisición de imágenes y procesamiento de imágenes.

Paso 1: cargar imagen

Lee y dibuja flechas apuntando a dos haces de interés.gantrycrane.png Es una imagen de una grúa de pórtico utilizada para ensamblar 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: Extraiga la región de interés

Recorte la imagen para obtener sólo los haces de la grúa de 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 utilizando 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 contorno

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

Para extraer el borde de la viga inferior, designe una columna de la imagen e inspecciónelo 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 traza horizontalmente.

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

Paso 5: Trace los límites

La rutina se utiliza para extraer (X, Y) ubicaciones de los puntos de contorno.bwtraceboundary Con el fin de maximizar la precisión de los cálculos de ángulo y punto de intersección, es importante extraer tantos puntos que pertenezcan a los bordes de la viga como sea posible. Debe determinar el número de puntos experimentalmente. Dado que el punto inicial para 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: ajuste las líneas a los límites

Aunque (X, Y) se obtuvieron pares de coordenadas en el paso anterior, no todos los puntos se encuentran exactamente en una línea. ¿Cuáles deben usarse 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 contorno.

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

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

Paso 7: encuentra el ángulo de intersección

Utilice el producto de 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: encuentra el punto de intersección

Resuelva el sistema de dos ecuaciones para obtener las coordenadas (X, Y) 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

Paso 9: graficar los resultados.

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');

Consulte también

| | |

Ejemplos relacionados

Más acerca de