在Matlab中处理时忽略图像中的某些区域(roi)

Ignore certain area(roi) in an image while processing in Matlab

我刚接触 Matlab。我正在尝试 vision.CascadeObjectDetector 在 Mat-lab 上使用 两次找出两个不同的对象(分别 受过训练),从视频中说出 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 被分配了 step(letterDetector_K, videoFrame) 正在执行。 bbox 的格式是 [xUpperLeft, yUpperLeft, width, 高度]。 我该怎么做。

这很容易做到。检测到第一个形状后,使用检测到的第一个对象的边界框 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 元素数组,即左上角的 xy,然后是矩形的宽度和高度。我们将在此位置放置一个填充的矩形。然后我们在绘制之前为矩形指定更多选项,例如将不透明度设置为 1.0,将颜色设置为黑色并关闭抗锯齿。我们输出插入了这个矩形的修改后的框架,我将在其中改变 videoFrame 以便您的代码需要最少的编辑。然后,您将使用 videoFrame 来检测下一个形状。