Измерительный угол пересечения

В этом примере показано, как измерить угол и точку пересечения между двумя балками с помощью bwtraceboundary, которая является стандартной программой контура. Общей задачей в приложениях машинного зрения является измерение без рук с использованием методов сбора изображений и обработки изображений.

Шаг 1: Загрузка изображения

Чтение в gantrycrane.png и нарисуйте стрелы, указывающие на два интересующих луча. Представляет собой изображение портального крана, используемого для сборки моста.

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

Figure contains an axes. The axes contains 5 objects of type image, text, line.

Шаг 2: Извлечение необходимой области

Обрезать изображение, чтобы получить только выбранные ранее балки портального крана. Этот шаг облегчает извлечение ребер двух металлических балок.

% 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)

Figure contains an axes. The axes contains an object of type image.

% 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;

Шаг 3: Порог изображения

Преобразуйте изображение в черно-белое для последующего извлечения координат ребра с помощью bwtraceboundary стандартная программа.

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

Figure contains an axes. The axes contains an object of type image.

Шаг 4: Найти начальную точку на каждом контуре

The bwtraceboundary стандартная программа требует, чтобы вы задали одну точку на контуре. Эта точка используется в качестве начального места для процесса трассировки контуров.

Чтобы извлечь ребро нижнего луча, выберите столбец в изображении и смотрите его, пока не произойдет переход от пикселя фона к пикселю объекта. Хранить это расположение для дальнейшего использования в bwtraceboundary стандартная программа. Повторите эту процедуру для другого луча, но на этот раз трассировка по горизонтали.

dim = size(BW);

% horizontal beam
col1 = 4;
row1 = find(BW(:,col1), 1);

% angled beam
row2 = 12;
col2 = find(BW(row2,:), 1);

Шаг 5. Проследите контуры

The bwtraceboundary стандартная программа используется для извлечения (X, Y) местоположений граничных точек. В порядок максимизации точности вычислений угла и точки пересечения важно извлечь как можно больше точек, принадлежащих ребрам балки. Вы должны определить число точек экспериментально. Поскольку начальная точка для горизонтальной полосы была получена путем сканирования с севера на юг, наиболее безопасно задать начальный шаг поиска, чтобы указать на внешнюю сторону объекта, то есть 'Север'.

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

Figure contains an axes. The axes contains 3 objects of type image, line.

Шаг 6. Подгонка линий к контурам

Хотя (X, Y) пары координат были получены на предыдущем шаге, не все точки лежат точно на линии. Какие из них следует использовать для вычисления угла и точки пересечения? Принимая, что все полученные точки являются одинаково важными, подбирайте линии к местоположениям пограничного пикселя.

Уравнение для линии y = [x 1] * [a; b]. Можно решить для параметров 'a' и 'b' в смысле наименьших квадратов при помощи polyfit.

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

Шаг 7: Найти угол пересечения

Используйте точечный продукт, чтобы найти угол.

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

Шаг 8: Найти точку пересечения

Решить систему двух уравнений, чтобы получить (X, Y) координаты точки пересечения.

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

Шаг 9: Постройте график результатов.

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

Figure contains an axes. The axes contains 6 objects of type image, line, text.

См. также

| | |

Похожие примеры

Подробнее о

Для просмотра документации необходимо авторизоваться на сайте