% Ініціалізація змінних global px1 py1 px2 py2 price_division px1_line py1_line px2_line py2_line draw size_object image_clear image_measurement real_size % Реальний розмір об'єкта в міліметрах real_size = 100; % Справжній розмір опорного об'єкту (мм) px1 = 0; py1 = 0; px2 = 0; py2 = 0; price_division = 0; px1_line = 0; py1_line = 0; px2_line = 0; py2_line = 0; draw = false; size_object = 0; % Читання зображення image_clear = imread('photo.jpg'); image_measurement = image_clear; % Копія оригінального зображення для зміни % Створення вікна фігури figure('Name', 'Image', 'NumberTitle', 'off'); imshow(image_clear); hold on; % Налаштування функції зворотного виклику для миші set(gcf, 'WindowButtonDownFcn', @set_size); % Виведення інструкцій для вибору одиниці вимірювання text(300, 50, 'Виберіть розмір опорного об`єкту!', 'Color', 'red', 'FontSize', 14); % Функція зворотного виклику для кліків миші function set_size(~, ~) global px1 py1 px2 py2 price_division px1_line py1_line px2_line py2_line draw size_object image_clear image_measurement real_size % Отримання поточної позиції миші current_pos = get(gca, 'Currentpoint'); x = round(current_pos(1, 1)); y = round(current_pos(1, 2)); % Отримання натиснутої кнопки миші button = get(gcf, 'SelectionType'); % Клік правою кнопкою для скидання точок (alt key) if strcmp(button, 'alt') px1 = 0; py1 = 0; px2 = 0; py2 = 0; price_division = 0; disp([px1, py1, px2, py2]); end % Лівий клік для визначення одиниці вимірювання (звичайний клік) if strcmp(button, 'normal') && px1 == 0 && py1 == 0 px1 = x; py1 = y; elseif strcmp(button, 'normal') && px2 == 0 && py2 == 0 px2 = x; py2 = y; % Перевірка, чи не однакові точки, щоб уникнути ділення на нуль if (px2 ~= px1 || py2 ~= py1) price_division = real_size / (sqrt((py2 - py1)^2 + (px2 - px1)^2)); else disp('Точки для визначення одиниці вимірювання однакові. Будь ласка, виберіть різні точки.'); end end % Лівий клік для визначення лінії для вимірювання if price_division ~= 0 if strcmp(button, 'normal') && px1_line == 0 && py1_line == 0 px1_line = x; py1_line = y; elseif strcmp(button, 'normal') && px2_line == 0 && py2_line == 0 && px1_line ~= 0 && py1_line ~= 0 px2_line = x; py2_line = y; size_object = sqrt((px2_line - px1_line)^2 + (py1_line - py2_line)^2) * price_division; draw = true; elseif strcmp(button, 'normal') && px2_line ~= 0 && py2_line ~= 0 && px1_line ~= 0 && py1_line ~= 0 draw = false; px1_line = 0; py1_line = 0; px2_line = 0; py2_line = 0; end end % Оновлення зображення з вимірюваннями image_measurement = image_clear; % Скидання на оригінальне зображення imshow(image_measurement); % Виведення зображення if price_division == 0 text(300, 50, 'Виберіть розмір опорного об`єкту!', 'Color', 'red', 'FontSize', 14); else if px1_line ~= 0 && py1_line ~= 0 plot(px1_line, py1_line, 'ro', 'MarkerSize', 5); end if draw plot([px1_line, px2_line], [py1_line, py2_line], 'r-', 'LineWidth', 2); mid_x = (px1_line + px2_line) / 2; mid_y = (py1_line + py2_line) / 2; text(mid_x, mid_y - 20, sprintf('%0.2f', size_object), 'Color', 'red', 'FontSize', 12); end end end