我是Matlab的新手。我正在努力 在Mat-lab上使用vision.CascadeObjectDetector 两次找出两个不同的对象(分开 来自视频的E和K说。 bbox和bbox2 各自的投资回报率。 while循环中的部分代码如下:
videoFrame=step(videoFileReader);
bbox=step(letterDetector_E,videoFrame);
bbox2=step(letterDetector_K,videoFrame);
C = vertcat(bbox,bbox2);
videoOut=insertObjectAnnotation(videoFrame, 'rectangle', C, 'E&K');
step(videoPlayer, videoOut);
我想在找出bbox2时忽略bbox表示的区域。也就是说,不应该从图像的相同部分找到两个对象(显然两种类型的对象都有相似之处)。所以我希望掩盖或忽略videoFrame的bbox区域 bbox2分配了步骤(letterDetector_K,videoFrame) 正在执行。 bbox的格式是[xUpperLeft,yUpperLeft,width, 高度]。 我怎么能这样做。
答案 0 :(得分:1)
这很容易做到。检测到第一个形状后,使用为第一个对象E
检测到的边界框,然后使用insertShape
在该点中插入填充的矩形。确保将Opacity
设置为1.0,以便它不会将背景中的任何像素混合到此矩形中,并选择填充矩形的颜色,该颜色与您尝试检测的对象完全不同。也许选择黑色。此外,我建议您在绘制矩形时关闭消除锯齿功能,因为在打开此图形时绘制形状实际上需要更多时间。消除锯齿基本上可以平滑任何形状的边缘。因为您不希望在此区域中包含信息,所以实际上不需要消除锯齿,因此将其设置为false
。这是通过SmoothEdges
选项完成的。
完成填充形状后,使用此修改后的帧并检测下一个对象K
。因此,您只需要一行代码,所以这样做:
videoFrame=step(videoFileReader);
bbox=step(letterDetector_E,videoFrame);
%// NEW - Insert filled rectangle
videoFrame = insertShape(videoFrame, 'FilledRectangle', bbox, ...
'Opacity', 1.0, 'Color', 'black', ...
'SmoothEdges', false);
%// Now detect next shape on modified frame
bbox2=step(letterDetector_K,videoFrame);
C = vertcat(bbox,bbox2);
videoOut=insertObjectAnnotation(videoFrame, 'rectangle', C, 'E&K');
step(videoPlayer, videoOut);
insertShape
的工作原理是它接收图像(在您的情况下为videoFrame
),然后指定FilledRectangle
标记和边界框位置,这与4精确重合元素数组以您描述的方式,即左上角的x
和y
,后跟矩形的宽度和高度。我们将在此位置放置一个填充的矩形。然后,我们在绘制矩形之前指定其他选项,例如将不透明度设置为1.0,将颜色设置为黑色并关闭消除锯齿。我们输出修改后的框架,插入此矩形,我将改变videoFrame
,以便您的代码需要最少的编辑。然后,您可以使用videoFrame
来检测下一个形状。