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