文件交换的选择

我们最好的用户提交

最低限度的矩形,和更多!

布雷特本周的选择一套最小边界对象,通过约翰D 'Errico。我也喊朱利安diener,因为他二维最小的边界框函数。

发展过程中一些代码来自动跟踪对象在视频,我发现我需要创建一个“最小边界矩形”环绕探测点。有一个很好的演示计算机视觉的工具箱中分用于追踪一个移动的脸所划定多边形创建的polyshape命令。都很好;它工作得很好了,非常快。但由于其他原因,我更喜欢使用一个“images.roi。创建的对象,如矩形”drawrectangle命令(这本身就是一个方便的函数矩形()。)

的修改版本提到的例子是这样的:

vidObj = VideoReader (“tilted_face.avi”);videoFrame = readFrame (vidObj);togglefig (“面子”追踪)imgH = imshow (videoFrame);faceDetector = vision.CascadeObjectDetector ();bbox = faceDetector (videoFrame);:bboxPoints = bbox2points (bbox (1));thisPoly = polyshape (bboxPoints);持有polyH =情节(thisPoly,“FaceAlpha”0,“EdgeColor”,“y”,“线宽”2);点= detectMinEigenFeatures (rgb2gray (videoFrame),“投资回报”,bbox);pointTracker = vision.PointTracker (“MaxBidirectionalError”2);点= points.Location;初始化(pointTracker点,videoFrame);oldPoints =点;抽搐;hasFrame (vidObj)%得到下一帧,更新可视化:videoFrame = readFrame (vidObj);imgH。CData = videoFrame;%跟踪点。注意,可能会丢失一些点。[点,isFound] = pointTracker (videoFrame);visiblePoints =点(isFound:);oldInliers = oldPoints (isFound:);如果大小(visiblePoints 1) > = 2%至少需要2点[xform, oldInliers visiblePoints] = estimateGeometricTransform (oldInliers visiblePoints,“相似”,“MaxDistance”4);bboxPoints = transformPointsForward (xform, bboxPoints);thisPoly = polyshape (bboxPoints);polyH。形状= thisPoly;oldPoints = visiblePoints;选点(pointTracker oldPoints);结束imgH。CData = videoFrame;drawnow结束t = toc;%清理释放(pointTracker);%(处理while循环大约需要6.5秒在我的笔记本电脑)。

但如何将多边形替换为一个矩形旋转?幸运的是,有文件交换,在搜索“最小边界矩形”很快发现了约翰的“套房”功能的最小边界圆,球体,平行四边形,四边形、半圆形、三角形和矩形。

正如我们期待的,约翰的功能写和发表评论。这是一个简单的问题来代替多边形的最小的矩形,这毫不奇怪计算凸壳的输入点。一个注意:约翰的函数返回x -y -目标矩形的坐标、面积和周长相同的:

[rectx recty,面积,周长]= minboundrect (x, y,度量)

(事实上,可以选择,使用的度量参数,以减少由地区或周边,面积是默认的)。我需要旋转角度的三角形,使用作为输入drawrectangle。过了一会修改minboundrect返回作为额外的输出edgeangles内部参数,计算。在的时刻,我们有:

vidObj。CurrentTime = 0;%重置和重用VideoReader对象videoFrame = readFrame (vidObj);% togglefig(脸部追踪,true) %明显和重用% imgH = imshow (videoFrame);bbox = faceDetector (videoFrame);% hRect = drawrectangle(“位置”,bbox,…% ' FaceAlpha ', 0,“颜色”、“y”,“线宽”,2);:bboxPoints = bbox2points (bbox (1));点= detectMinEigenFeatures (rgb2gray (videoFrame),“投资回报”,bbox);pointTracker = vision.PointTracker (“MaxBidirectionalError”2);点= points.Location;初始化(pointTracker点,videoFrame);oldPoints =点;抽搐;hasFrame (vidObj)%得到下一帧,更新可视化:videoFrame = readFrame (vidObj);% imgH。CData = videoFrame;%跟踪点。注意,可能会丢失一些点。[点,isFound] = pointTracker (videoFrame);visiblePoints =点(isFound:);oldInliers = oldPoints (isFound:);如果大小(visiblePoints 1) > = 2%至少需要2点[xform, oldInliers visiblePoints] = estimateGeometricTransform (oldInliers visiblePoints,“相似”,“MaxDistance”4);bboxPoints =双(transformPointsForward (xform, bboxPoints));% | vertToPos |我写一个helper函数;这是逆变器% < //www.tatmou.com/help/vision/ref/bbox2points.html | bbox2points | >。测试=“约翰。”;开关测试情况下“约翰。”rectx recty,θ=minboundrect (bboxPoints (: 1) bboxPoints (:, 2));rectPos = vertToPos ([rectx recty]);情况下“于连”(矩形、θ)= minBoundingBox (bboxPoints ');rectPos = vertToPos(矩形);结束θ= 360 - rad2deg(θ(1));hRect。位置= rectPos;hRect。RotationAngle =θ;oldPoints = visiblePoints;选点(pointTracker oldPoints);结束% imgH。CData = videoFrame;drawnow结束t = toc;%清理释放(pointTracker);

循环在所有的视频帧花费了8.3秒的时间;minboundrect增加了大约4毫秒每帧开销。(不坏!)

边注,我还发现(和测试——看到上面的代码)的切换实例朱利安的二维最小边界框的贡献。朱利安(他显然回避资本化)写道,他的代码是“完全矢量化,”,因此“更适合大点集。”I didn't test the difference on a large dataset, but for my use case, I could detect no performance difference. Very nice, gentlemen--thank you both!

像往常一样,我欢迎你想法和意见

发表与MATLAB®R2019b

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。