主要内容

激光跟踪

这个例子展示了如何跟踪移动的激光点。

使用图像采集工具箱™,从相机的图像数据流直接获取到MATLAB®。这些图像用于跟踪摄像机视野中的物体。在这个例子中,被跟踪的对象是由激光笔产生的点。

运行MATLAB的计算机监视器被放置在摄像机的视图中,同时一个激光指针在MATLAB图形窗口上照亮一个红点。摄像机在激光笔移动的同时获取MATLAB图形窗口的图像。通过跟踪激光点的移动,激光笔可以作为类似于鼠标的指针设备使用。

第一项任务是对数据进行校准,建立获取的图像像素与MATLAB图形轴之间的关系。一旦建立了这种关系,激光点可以被跟踪,因为它在MATLAB图形窗口内移动。

这个例子使用了一组帮助处理图像的实用函数。这些实用函数需要图像处理工具箱™,可以在以下目录中找到:

  • MATLABROOT \ \ imaq \主要例子

物理设置

将摄像机聚焦到运行MATLAB的计算机屏幕上。

最好尽量减少房间内的环境光。这个例子已经成功地在礼堂使用投影仪运行。

配置采集

图像采集设备用于采集图像数据,进行校准和激光跟踪。使用的设备将是一个通用的Windows®视频摄像头。

%访问并配置设备。vid = videoinput (“winvideo”, 1“RGB24_320x240”);从视频。FramesPerTrigger = 1;从视频。TriggerRepeat =正;triggerconfig(视频,“手动”

创建校准屏幕

校准屏幕特意设置为黑色,以获得最佳的对比激光指针。当窗口的标题栏颜色设置为深色时,有些系统工作得更好。

由于将使用红色激光,图像的红色平面是唯一感兴趣的彩色平面。校准方框是蓝色的,以便使它在红色飞机上显得“不可见”。

%创建激光图形窗口。laserFig =图;hBox = plot([0 0 1 1 0], [0 1 1 0],),“b -”);持有%设置校准屏幕。修改游标,使其不存在%干扰校准。hTarget = plot(0,0, 0,)“哟”);甘氨胆酸ax =;斧子。颜色:[0,0,0];laserFig。颜色:[0,0,0];laserFig。菜单条=“没有”;laserFig。DoubleBuffer =“上”;laserFig。指针=“自定义”;laserFig。PointerShapeCData = NaN(16, 16);

相机的位置

将相机放置到只有蓝色方块可见的位置。

%显示定位信息。posText = sprintf (“% s \ n % s”...定位摄像机,确保蓝盒子...'是唯一在摄像机的视野。');infoText = text(0, -0.2, posText,“颜色”, [1 1 1]);轴([-0.2 1.2 -0.2 1.2])平等的

使用预览窗口,请求相机的位置如下%的观点是蓝色的方框和其他很少。preview(vid) smallFigPos = laserFig.Position;laserFig。位置= get (0,“拉”);disp (“等着摄像机就位……按任意键继续。”)暂停
等着摄像机就位…按任意键继续。

执行图像校准

现在相机聚焦在正确的区域,在盒子的四个角上绘制一个目标。校准是通过将激光瞄准蓝色正方形的每个角来执行的,允许在相机像素坐标(图像)和MATLAB轴坐标(正方形)之间建立关系。对于显示的每个目标:

  • 输出一个声音,指示激光应该瞄准

  • 输出一个声音,指示一帧即将被获取

  • 触发采集装置

  • 访问获取的图像帧,并在像素坐标中确定激光位置

激光位置是通过对红色平面阈值和寻找高强度值来确定的。一些额外的处理被执行,以确保激光不被鬼图像所掩盖,在一些网络摄像头的不良光学造成。也证实了一个激光点确实出现在屏幕上。

提供校准说明。calibText = sprintf (“% s \ n % s”...用激光笔对准每个出现的目标...用激光瞄准目标,直到目标移动);infoText。字符串=calibText;

%开始采集并创建一个新的数字来显示%标定结果在MATLAB SPY图中。begin (vid) spyFig = figure;%的目标1…图(laserFig);hTarget。XData = 0;hTarget。YData = 0;Sound (1), pause(2), trigger(vid);acqResults{1} = getdata(vid, 1);[xCalib(1), yCalib(1), laserSights] = util_findlaser(acqResults{1});图(spyFig);间谍(laserSights)标题(“目标1:疑似激光瞄准”

%的目标2…图(laserFig);hTarget。XData = 0;hTarget。YData = 1;Sound (1), pause(2), trigger(vid);acqResults{2} = getdata(vid, 1);[xCalib(2), yCalib(2), laserSights] = util_findlaser(acqResults{2});图(spyFig);间谍(laserSights)标题(“目标2:疑似激光瞄准”

%的目标3…图(laserFig);hTarget。XData = 1;hTarget。YData = 1;Sound (1), pause(2), trigger(vid);acqResults{3} = getdata(vid, 1);[xCalib(3), yCalib(3), laserSights] = util_findlaser(acqResults{3});图(spyFig);间谍(laserSights)标题(“目标3:疑似激光瞄准”

%的目标4…图(laserFig);hTarget。XData = 1;hTarget。YData = 0;Sound (1), pause(2), trigger(vid);acqResults{4} = getdata(vid, 1);[xCalib(4), yCalib(4), laserSights] = util_findlaser(acqResults{4});图(spyFig);间谍(laserSights)标题(“目标4:疑似激光瞄准”

%关闭间谍阴谋并停止收购。关闭(spyFig)停止(vid);

校准结果

绘制获得的图像和计算出的每个目标的激光指针坐标。由于黄色十字准线在每个图像中的位置都是正确的,因此对处理结果进行了验证。

%目标1结果…calibFig =图;util_plotpos (acqResults {1}, xCalib (1) yCalib (1));

%目标2结果…util_plotpos (acqResults {2}, xCalib (2), yCalib (2));

%目标3结果…util_plotpos (acqResults {3}, xCalib (3), yCalib (3));

%目标4结果…util_plotpos (acqResults {4}, xCalib (4), yCalib (4));

关闭显示校准结果的数字。关上(calibFig)

激光跟踪

启动采集并对采集的数据进行一定次数的处理。该处理包括在获取的图像中定位激光,并确定激光在像素和MATLAB轴坐标中的位置。

为了让事情变得有趣,使用激光笔,尝试在蓝色框内“绘制”字母“M”(MATLAB)。

更新激光屏幕上的说明。图(laserFig);infoText。字符串=把激光笔移到蓝盒子里%开始收购。每一次迭代:% *输出一个声音来指示将要获取的帧% *触发设备% *处理获取的图像并定位激光器% *转换像素坐标到MATLAB轴坐标激光。x = [];激光。y = [];开始(vid)我= 1:10 0,%获取图像帧并确定相机像素坐标。(1)声音,触发(vid);帧= getdata(vid, 1);[x, y] = util_findlaser(帧);如果~ isnan (x) & & ~ isnan (y),%如果坐标有效,请确保相机像素坐标%在校正范围内。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]))]);%从单位平方校准点确定空间变换。tform = cp2tform([xCalib(:) yCalib(:)], [0 0;0 1;1 1;1 0],“射影”);xyScreen = tformfwd([x, y], tform);xScreen = xyScreen (1);yScreen = xyScreen (2);%确保新坐标保持在单位方格内。xScreen = min([xScreen 1]);xScreen = max([xScreen 0]);yScreen = min([yScreen 1]);yScreen = max([yScreen 0]);%存储新的MATLAB轴坐标。激光。x = [laser.x (:);xScreen];激光。y = [laser.y (:);yScreen];结束结束绘制跟踪的激光位置。laserFig。位置= smallFigPos;情节(激光。x laser.y的r *);

%关闭激光图形。关闭(laserFig);%停止获取,从内存中删除对象,%并清除该变量。停止(vid)删除(vid)清晰从视频