Распознавание образов в Matlab. Определение диаметра и расстояние до края фигуры
Доброго времени суток!
В связи со всемирным карантином, решила по практиковаться в программировании.
В среде Матлаб накодила, что в режиме реального времени распознаются отверстия на детали, даже высчитывается диаметр, но никак не могу добиться, чтобы показывал еще и расположение отверстия относительно края детали, видит либо отверстия, либо прямоугольник, одно в другом не видит.
Может кто-то сможет помочь, хотелось бы, чтобы программа распознавала объект (прямоугольник), выделяла его как-то, в нем распознавала отверстия, высчитывала их диаметр и вычисляла координаты отверстия относительно РАМКИ ВЫДЕЛЕННОГО ПРЯМОУГОЛЬНИКА.
clear all; cam = webcam('HP Truevision HD'); img_display = figure('CloseRequestFcn',@my_closereq); global LOOP_RUNNING; LOOP_RUNNING = true; while (LOOP_RUNNING) img = snapshot(cam); t_img = imadjust(rgb2gray(img)); % переводим в оттенки серого и выравниваем яркость Ibw = ~imbinarize(t_img,graythresh(t_img)); % переводим в ЧБ и инвертируем diff_im = imsubtract(img(:,:,1), rgb2gray(img)); se1 = strel('rectangle', [10 10] ); % находим белые кружки более 5 пикселей Ibw = imopen(Ibw, se1); % убираем лишнее %Use a median filter to filter out noise %diff_im = medfilt2(diff_im, [3 3]); diff_im = bwareaopen(Ibw,5); % Удалите все эти пиксели размером менее 300 пикселей bw1 = bwlabel(diff_im, 8); % Обозначьте все подключенные компоненты на изображении. stats1 = regionprops(bw1, 'BoundingBox','Centroid'); se = strel('disk',5); % находим белые кружки более 5 пикселей Ibw = imopen(Ibw, se); % убираем лишнее imshow(Ibw) % отображаем bw2 = edge(Ibw,'canny', 0.15, 2);% выделяем границы методом Канни bw2 = imfill(bw2,'holes');% заливаем замкнутые области на изображении. bw2 = imopen(bw2,se);% — морфологическое открытие, тонкие линии исчезают. [B,L] = bwboundaries(bw2); stats = regionprops(L,'Centroid','EquivDiameter'); hold on for object = 1:length(stats1) bb = stats1(object).BoundingBox; bc = stats1(object).Centroid; rectangle('Position', bb, 'EdgeColor','r', 'LineWidth',2) plot(bc(1), bc(2), '-m+') a=text(bc(1)+15,bc(2), strcat('X: ', num2str(round(bc(1))), ' Y: ', num2str(round(bc(2))))); set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow'); end for k = 1:length(B) boundary = B{k}; radius = stats(k).EquivDiameter/2; xc = stats(k).Centroid(1);% координаты центра yc = stats(k).Centroid(2);% координаты центра theta = 0:0.01:2*pi; Xfit = radius*cos(theta) + xc; Yfit = radius*sin(theta) + yc; plot(Xfit, Yfit, 'g'); text(boundary(1,2)-15,boundary(1,1)+15, num2str(radius,3),'Color','y',... 'FontSize',8); % text(boundary(1,2)-40,boundary(1,1)+10, num2str(xc,3),'Color','green',... %'FontSize',10); % text(boundary(1,2)-10,boundary(1,1)+40, num2str(yc,5),'Color','red',... % 'FontSize',10); end end function my_closereq(~,~) global LOOP_RUNNING; LOOP_RUNNING = false; delete(gcf); clear('cam'); return; end
1 коментар
Додати коментар Підписатись на коментаріВідписатись від коментарів