Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Распознавание образов в 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
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі