主要内容

激光跟踪

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

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

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

第一个任务涉及校准数据,以建立获取的图像像素和MATLAB图形轴之间的关系。一旦建立了这种关系,就可以在MATLAB图形窗口中跟踪激光点的移动。

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

  • MATLABROOT \ \ imaq \主要例子

物理设置

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

最好把房间里的环境光调到最小。这个例子已经在使用投影仪的礼堂中成功运行。

配置收购

图像采集装置将用于获取图像数据,以执行校准和激光跟踪。所使用的设备将是一个通用的Windows®视频网络摄像头。

访问和配置一个设备。视频输入(“winvideo”, 1“RGB24_320x240”);从视频。FramesPerTrigger = 1;从视频。TriggerRepeat = Inf;triggerconfig(视频,“手动”

创建校准屏幕

创建的校准屏幕故意设置为黑色,以获得激光指示器的最佳对比度。有些系统在标题栏的窗口颜色设置为深色时工作得更好。

由于将使用红色激光,图像的红色平面是唯一感兴趣的颜色平面。为了使校准正方形在红色平面中显得“不可见”,它被制成蓝色。

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

相机的位置

相机的位置,这样只有蓝色的正方形是可见的。

显示定位信息。posText = sprintf(“% s \ n % s”...定位相机,确保是蓝框...“是相机视野中唯一的东西。”);infoText = text(0, -0.2, posText,“颜色”, [11 1 1]);轴([-0.2 1.2 -0.2 1.2]平等的

使用预览窗口,要求相机的位置是这样的%表示视图是蓝色框和其他的。预览(vid) smallFigPos = laserfig .位置;laserFig。Position = get(0,“拉”);disp (“等待相机定位……按任意键继续。”)暂停
等待相机定位…按任意键继续。

进行图像校准

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

  • 输出一个声音,表明激光应该瞄准

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

  • 触发采集装置

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

激光位置是通过阈值确定的红色平面和寻找高强度值。执行一些额外的处理,以确保激光不会被一些网络摄像头中由于光学性能差而引起的鬼影所遮挡。它还验证了激光点实际上出现在屏幕上。

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

开始采集并创建一个新的图形来显示%校准结果在MATLAB SPY图。start(vid) spyFig = figure;%目标1…图(laserFig);hTarget。XData = 0;hTarget。YData = 0;声音(1),暂停(2)声音(1),触发(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;声音(1),暂停(2)声音(1),触发(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;声音(1),暂停(2)声音(1),触发(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;声音(1),暂停(2)声音(1),触发(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)I = 1:100,获取一个图像帧并确定%相机像素坐标。(1)声音,触发(vid);Frame = getdata(vid, 1);[x, y] = util_findlaser(frame);如果~isnan(x) && ~isnan(y),如果坐标有效,请确保相机像素坐标%在标定范围内。x = max([x min(xcalibrb ([1 2]))]);x = min([x max(xcalibrb ([3 4]))]);y = min([y max(ycalibrb ([1 4]))]);y = max([y min(ycalibrb ([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);停止采集,从内存中删除对象,%,清除该变量。Stop (vid) delete(vid) clear从视频