【问题标题】:Multi region mask OpenCV多区域掩码 OpenCV
【发布时间】:2014-11-27 19:30:02
【问题描述】:

我想在 OpenCV 中创建一个包含一些完整矩形区域(比如 1 到 10 个区域)的蒙版。将其视为显示图像上感兴趣特征位置的掩码。我知道每个区域角落的像素坐标。

现在,我首先将 Mat 初始化为 0,然后循环遍历每个元素。使用“if”逻辑,如果它们属于该区域,我将每个像素设置为 255,例如:

for (int i = 0; i<mymask.cols, i++) {
   for (int j = 0; j<mymask.rows, j++) {
      if ( ((i > x_lowbound1) && (i < x_highbound1) &&  
         (j > y_lowbound1) && (j < y_highbound1)) || 
         ((i > x_lowbound2) && (i < x_highbound2) &&  
         (j > y_lowbound2) && (j < y_highbound2))) {
         mymask.at<uchar>(i,j) = 255;
      }
   }
}

但这很笨拙,我认为效率低下。在这种情况下,我用 255 “填充”了 2 个矩形区域。但是除了使用 switch-case 并重复代码 n 次之外,没有可行的方法来更改我填充的区域数。

有没有人在想更聪明的事情?我宁愿不使用第 3 方的东西(除了 OpenCV ;)),我正在使用 VisualStudio 2012。

【问题讨论】:

  • mymask.at&lt;i*mymask.rows + j&gt; = 255; - 不应该是mymask.at&lt;some_type&gt;(j,i) = 255; 吗?
  • 是的,当我写这个问题时,我无法访问我的代码,所以我写了我记得的......
  • 好吧,“是的,可能”我的意思是你完全正确;)谢谢,我会纠正它!

标签: c++ opencv mask mat


【解决方案1】:

使用cv::rectangle():

//bounds are inclusive in this code!
cv::Rect region(x_lowbound1, y_lowbound1,
                x_highbound1 - x_lowbound1 + 1, y_highbound1 - y_lowbound1 + 1)
cv::rectangle(mymask, region, cv::Scalar(255), CV_FILLED);

【讨论】:

  • 谢谢。您是否知道如何轻松调整代码以迭代多个子区域?
  • 您当前如何存储区域?将每个存储为 Rect 可能是有意义的。然后你可以将它们全部放在一个向量(或其他容器)中,然后遍历它,为每个调用 cv::rectangle()
  • 好的,我会这样做的。我担心的是我事先不知道会有多少个矩形(它是用户输入,以及矩形的坐标和尺寸),但我会在一个向量中迭代,它肯定会很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2019-04-12
  • 2011-06-08
相关资源
最近更新 更多