Этот пример показывает, как получить изображения в реальном времени от веб-камеры, обработать изображения с помощью анализа блоба фиксированной точки и определить мировые координаты, чтобы выиграть лазерную цель пистолета.
Технология, показанная в этом примере, используется в широком спектре приложений, таких как оценка расстояний до объектов перед автомобилем и медицинского анализа изображения ячеек. Ключевые возможности этого примера включают:
Анализ блоба фиксированной точки для сбора измерений
Получение изображений в реальном времени
Калибровка фотоаппарата, чтобы определить мировые координаты точек изображений
Правильные образы для искажения объектива, чтобы гарантировать точность собранных измерений в мировых модулях
Определите мировые координаты точек изображений путем отображения пиксельных местоположений с местоположениями в реальных модулях
Весь код для этого примера хранится в папке в качестве примера. Чтобы отредактировать код, перейдите к этой папке.
cd(fullfile(docroot,'toolbox','fixpoint',... 'examples','laser_target_example'));
+LaserTargetExample
в writeable местоположение.Image Acquisition Toolbox™ позволяет вам получить изображения и видео от камер и устройств захвата изображения непосредственно в MATLAB® и Simulink®. Используя Пакет Поддержки Image Acquisition Toolbox для Оборудования GigE Vision® или MATLAB® Support Package для Веб-камер USB, настроенных камера, чтобы получить изображения в реальном времени, чтобы выполнить анализ.
Для получения дополнительной информации о подготовке камеры смотрите Подключение устройства (Image Acquisition Toolbox).
Используйте следующие команды, чтобы создать цель, чтобы распечатать для использования в осуществлении. Код генерирует файл постскриптума, который может быть открыт и распечатан двусторонний с целью на одной стороне и шахматной доской для калибровки фотоаппарата с другой стороны.
distance = 10; % meters offset_mm = 0; % mm print_target = true; LaserTargetExample.make_target_airpistol10m(distance, ... offset_mm, print_target)
Можно найти предварительно сделанные цели в папке +LaserTargetExample/targets_for_printing
.
Настройте камеру так, чтобы она стояла перед стороной шахматной доски цели. Стрелок сталкивается с целью. Можно сохранить цель и камеру в фиксированных позициях путем монтирования их на плате.
Калибровка фотоаппарата является процессом оценки параметров линзы и формирователя изображения. Эти параметры измеряют объекты, полученные камерой. Используйте приложение Camera Calibrator, чтобы обнаружить шаблон шахматной доски в конце цели и удалить любое искажение. Определите порог рассеянного света на цели. Вы, возможно, должны настроить настройки камеры или подсветку так, чтобы изображение не насыщалось. Используйте функцию pointsToWorld
, чтобы определить мировые координаты точек изображений.
Для получения дополнительной информации смотрите то, Что Калибровка фотоаппарата? (Computer Vision Toolbox).
Очки алгоритма выстрелы путем обнаружения яркого света лазерного пистолета. При стрельбе получите кадр и обнаружьте, если существует яркое пятно. Если существует яркое пятно по заданному порогу, обработайте тот кадр.
Используйте анализ блоба, чтобы найти центр яркого пятна и перевести местоположение от пиксельных координат до мировых координат. Анализ блоба сделан в фиксированной точке, потому что изображение хранится как 8-битное целое число со знаком. После нахождения центра яркого пятна в мировых координатах вычислите его расстояние от мишени в начале координат и присвойте значение точки выстрелу.
Добавьте пример кода в путь.
addpath(fullfile(docroot,'toolbox','fixpoint',... 'examples','laser_target_example'));
Запустите симуляцию путем выполнения скрипта run
, сохраненного в папке +LaserTargetExample
.
LaserTargetExample.run
(1) gigecam (2) webcam (3) simulation Enter the number of the source type:
Скрипт предлагает вам выбирать источник, чтобы использовать для симуляции. Введите 3
, чтобы смотреть симуляцию ранее записанного сеанса. Существует восемь ранее записанных доступных симуляций. Введите номер (1 - 8), чтобы начать симуляцию.
(1) saved_shots_20170627T201451 (2) saved_shots_20170627T201814 (3) saved_shots_20170702T153245 (4) saved_shots_20170702T153418 (5) saved_shots_20170702T162503 (6) saved_shots_20170702T162625 (7) saved_shots_20170702T162743 (8) saved_shots_20170702T162908 Enter number of file from list:
Ввод 1
или 2
предлагает вам настраивать камеру Видения GigE или веб-камеру. Пример затем предлагает вам вводить расстояние от стрелка к цели (метры) и имя стрелка.
Чтобы настроить пример с помощью собственной камеры, используйте приложение Camera Calibrator, чтобы обнаружить шахматную доску в конце цели и удалить искажение. Сохраните калибровочные переменные в MAT-файле. Калибровочные переменные для камеры Видения GigE и веб-камеры сохранены в следующих MAT-файлах.
+LaserTargetExample/gigecam_240x240_calibration_parameters.mat
+LaserTargetExample/webcam_LifeCam_480x480_camera_parameters.mat
Отредактируйте один из следующих файлов, заменяющих настройками с соответствующими значениями для вашей камеры.
+LaserTargetExample/gigecam_setup.m
+LaserTargetExample/webcam_setup.m
Каждый раз, когда вы стреляете, хиты зарегистрированы в файле с именем ShotDatabase.csv
. Можно загрузить данные в объект таблицы с помощью readtable
, чтобы визуализировать его. Например, после стрельбы, которая заполняет файл ShotDatabase.csv
, следующий код строит центр группы из многих выстрелов.
T = readtable('ShotDatabase.csv'); LaserTargetExample.make_target_airpistol10m; LaserTargetExample.plot_shot_points(T.X, T.Y); ax = gca; line(mean(T.X)*[1,1], ax.YLim); line(ax.XLim, mean(T.Y)*[1,1]); grid on;
Каждый раз, когда вы стреляете, кадры видео, в которых были обнаружены выстрелы, хранятся в файлах в папке под названием simulation_recordings
. Можно загрузить эти файлы и исследовать необработанные данные от выстрелов. Можно также отредактировать алгоритм.
Переменная frames
содержит первый кадр, который использовался для калибровки плюс десять кадров для каждого обнаруженного выстрела. Первый кадр в каждом выполнении десять - то, где выстрел был обнаружен. Вы видите свое движение рук в последующих кадрах. Можно сделать короткую анимацию данных с помощью следующего кода.
d = dir(fullfile('simulation_recordings','*.mat')); record = load(fullfile(d(1).folder, d(1).name)); t = LaserTargetExample.SerialDateNumber_to_seconds(... record.times); t = t-t(1); figure for k = 1:size(record.frames, 3) imshow(record.frames(:,:,k), ... 'InitialMagnification','fit'); title(sprintf('Time since beginning of round: %.3f seconds',... t(k))) drawnow end
detectCheckerboardPoints
| pointsToWorld
| undistortImage
| vision.BlobAnalysis