В этом примере показано, как отслеживать движущуюся лазерную точку.
С помощью Toolbox™ получения изображения потоки данных изображения с камеры поступают непосредственно в MATLAB ®. Эти изображения используются для отслеживания объектов в виде камеры. В этом примере отслеживаемый объект представляет собой точку, образованную лазерной указкой .
Монитор компьютера с MATLAB помещается в поле зрения камеры, в то время как лазерная указка светит красной точкой в окне фигуры MATLAB. Камера используется для получения изображений окна изображения MATLAB во время перемещения лазерной указки. Отслеживая перемещение лазерной точки, лазерная указка может использоваться в качестве указательного устройства, аналогичного мыши.
Первая задача включает калибровку данных для установления взаимосвязи между полученными пикселями изображения и осями фигуры MATLAB. Как только это соотношение установлено, лазерная точка может отслеживаться при ее перемещении в пределах окна изображения MATLAB.
В этом примере используется набор служебных функций, которые помогают в обработке изображений. Эти служебные функции требуют Toolbox™ обработки изображений и находятся в следующем каталоге:
MATLABROOT\examples\imaq\main
Фокусируйте камеру на экране компьютера, на котором работает MATLAB.
![]()
Лучше всего, чтобы внешний свет в комнате был сведен к минимуму. Этот пример успешно выполнен в зрительных залах с помощью проектора.
Устройство получения изображения будет использоваться для получения данных изображения для выполнения калибровки и лазерного слежения. В качестве устройства будет использоваться общий видео Windows ® WebCam .
% Access and configure a device. vid = videoinput('winvideo', 1, 'RGB24_320x240'); vid.FramesPerTrigger = 1; vid.TriggerRepeat = Inf; triggerconfig(vid,'manual')
Созданный калибровочный экран специально устанавливается на черный, чтобы получить наилучший контраст для лазерной указки. Некоторые системы работают лучше, когда цвета окна установлены темными для строк заголовка.
Поскольку будет использоваться красный лазер, красная плоскость изображения является единственной интересующей цветовой плоскостью. Калибровочный квадрат делается синим для того, чтобы он выглядел «невидимым» в красной плоскости.
% Create the laser figure window. laserFig = figure; hBox = plot([0 0 1 1 0], [0 1 1 0 0], 'b-'); hold on % Set up calibration screen. Modify the cursor so it does not % interfere with the calibration. hTarget = plot(0, 0, 'yo'); ax = gca; ax.Color = [0, 0, 0]; laserFig.Color = [0, 0, 0]; laserFig.Menubar = 'none'; laserFig.DoubleBuffer = 'on'; laserFig.Pointer = 'custom'; laserFig.PointerShapeCData = NaN(16, 16);
![]()
Установите камеру так, чтобы был виден только синий квадрат.
% Display positioning information. posText = sprintf('%s\n%s', ... 'Position the camera and ensure the blue box', ... 'is the only thing in the camera''s view.'); infoText = text(0, -0.2, posText, 'Color', [1 1 1]); axis([-0.2 1.2 -0.2 1.2]) axis equal
![]()
% Using the preview window, request that the camera be positioned such % that the view is of the blue box and little else. preview(vid) smallFigPos = laserFig.Position; laserFig.Position = get(0, 'ScreenSize'); disp('Waiting for camera to be positioned...press any key to continue.') pause
Waiting for camera to be positioned...press any key to continue.
Теперь, когда камера сфокусирована на правой области, цель рисуется в каждом из четырех углов коробки. Калибровка выполняется путем наведения лазера на каждый угол синего квадрата, что позволяет установить взаимосвязь между координатами пикселя камеры (изображение) и координатами оси MATLAB (квадрат). Для каждой отображаемой цели:
вывести звук, указывающий на то, что лазер должен быть направлен
вывод звука, указывающего на то, что кадр собирается получить
запустить устройство сбора данных
получить доступ к полученному кадру изображения и определить положение лазера в координатах пикселей
Положение лазера определяется путем пороговой обработки красной плоскости и поиска высоких значений интенсивности. Некоторая дополнительная обработка выполняется для того, чтобы убедиться, что лазер не скрыт призрачными изображениями, вызванными плохой оптикой в некоторых WebCams. Также проверяется, что лазерная точка на самом деле присутствовала на экране.
% Provide calibration instructions. calibText = sprintf('%s\n%s', ... 'Aim the laser pointer on each target as it appears.', ... 'Hold the laser on the target until the target moves.'); infoText.String = calibText;
![]()
% Start the acquisition and create a new figure to display % calibration results in a MATLAB SPY plot. start(vid) spyFig = figure; % Target 1... figure(laserFig); hTarget.XData = 0; hTarget.YData = 0; sound(1), pause(2) sound(1), trigger(vid); acqResults{1} = getdata(vid, 1); [xCalib(1), yCalib(1), laserSights] = util_findlaser(acqResults{1}); figure(spyFig); spy(laserSights) title('Target 1: Suspected Laser Sighting')
![]()
% Target 2... figure(laserFig); hTarget.XData = 0; hTarget.YData = 1; sound(1), pause(2) sound(1), trigger(vid); acqResults{2} = getdata(vid, 1); [xCalib(2), yCalib(2), laserSights] = util_findlaser(acqResults{2}); figure(spyFig); spy(laserSights) title('Target 2: Suspected Laser Sighting')
![]()
% Target 3... figure(laserFig); hTarget.XData = 1; hTarget.YData = 1; sound(1), pause(2) sound(1), trigger(vid); acqResults{3} = getdata(vid, 1); [xCalib(3), yCalib(3), laserSights] = util_findlaser(acqResults{3}); figure(spyFig); spy(laserSights) title('Target 3: Suspected Laser Sighting')
![]()
% Target 4... figure(laserFig); hTarget.XData = 1; hTarget.YData = 0; sound(1), pause(2) sound(1), trigger(vid); acqResults{4} = getdata(vid, 1); [xCalib(4), yCalib(4), laserSights] = util_findlaser(acqResults{4}); figure(spyFig); spy(laserSights) title('Target 4: Suspected Laser Sighting')
![]()
% Close the SPY plot and stop the acquisition.
close(spyFig)
stop(vid);
Постройте график полученного изображения и вычисленных координат лазерной указки для каждой цели. Поскольку желтые перекрестия расположены в соответствующем месте на каждом изображении, результаты обработки подтверждаются.
% Target 1 results...
calibFig = figure;
util_plotpos(acqResults{1}, xCalib(1), yCalib(1));
![]()
% Target 2 results...
util_plotpos(acqResults{2}, xCalib(2), yCalib(2));
![]()
% Target 3 results...
util_plotpos(acqResults{3}, xCalib(3), yCalib(3));
![]()
% Target 4 results...
util_plotpos(acqResults{4}, xCalib(4), yCalib(4));
![]()
% Close the figure illustrating calibration results.
close(calibFig)
Запустите сбор и обработайте полученные данные определенное количество раз. Обработка состоит из определения местоположения лазера в полученном изображении и определения положения лазера в координатах пикселя и оси MATLAB.
Чтобы сделать вещи интересными, используя лазерную указку, попытайтесь «нарисовать» букву 'M' (для MATLAB) в синей рамке.
% Update instructions on laser screen. figure(laserFig); infoText.String = 'Move the laser pointer within the blue box.'; % Start the acquisition. For each iteration: % % * output a sound to indicate a frame is about to be acquired % * trigger the device % * process the acquired image and locate the laser % * convert pixel coordinates to MATLAB axis coordinates laser.x = []; laser.y = []; start(vid) for i = 1:100, % Acquire an image frame and determine the % camera pixel coordinates. sound(1), trigger(vid); frame = getdata(vid, 1); [x, y] = util_findlaser(frame); if ~isnan(x) && ~isnan(y), % If coordinates were valid, ensure the camera pixel coordinate % was in the calibration range. x = max([x min(xCalib([1 2]))]); x = min([x max(xCalib([3 4]))]); y = min([y max(yCalib([1 4]))]); y = max([y min(yCalib([2 3]))]); % Determine spatial transformation from the unit square calibration points. tform = cp2tform([xCalib(:) yCalib(:)], [0 0; 0 1; 1 1; 1 0], 'projective'); xyScreen = tformfwd([x, y], tform); xScreen = xyScreen(1); yScreen = xyScreen(2); % Ensure the new coordinates remain within the unit square. xScreen = min([xScreen 1]); xScreen = max([xScreen 0]); yScreen = min([yScreen 1]); yScreen = max([yScreen 0]); % Store the new MATLAB axis coordinates. laser.x = [laser.x(:); xScreen]; laser.y = [laser.y(:); yScreen]; end end % Plot the tracked laser positions. laserFig.Position = smallFigPos; plot(laser.x, laser.y, 'r*');
![]()
% Close the laser figure. close(laserFig); % Stop the acquisition, remove the object from memory, % and clear the variable. stop(vid) delete(vid) clear vid