使用OpenCV进行激光线检测

时间:2012-08-15 15:38:12

标签: c++ opencv

我正在开展一个项目,我需要在图像中检测到红色激光线。这是我想到的策略。

  1. 分离图像中的R,G,B通道。
  2. 以高强度值对图像进行阈值处理。
  3. 使用生成的3个二进制图像,执行元素操作r&& !g&& !湾(&&是逻辑AND,!是逻辑NOT)。
  4. 得到的矩阵是二元图像,在激光存在的区域上有1个。
  5. 这在Matlab上使用了一些测试图像。但我的问题是需要在C / C ++中使用OpenCV来实现。

    我尝试了大部分库函数,但似乎没有直观/简单的方法来处理二进制图像并对它们执行逻辑运算。

    有人可以指出我认为我觉得有用的OpenCV功能/方法吗?我认为cvThresholdImage可以用于阈值处理,但这几乎就是关于它的。

1 个答案:

答案 0 :(得分:3)

那么你已经在openCV中找到了步骤1和2了吗?如果您只是尝试使用逻辑运算符,openCV可让您访问原始数据,然后您可以使用逻辑运算符对其进行操作。假设你已经分成三个通道并加以阈值化

//three binary images in the format you specified above
cv::Mat g;
cv::Mat b;
cv::Mat r;
uchar* gptr = g.data();
uchar* bptr = b.data();
uchar* rptr = r.data();

//assuming the matrix data is continuous you can just iterate straight through the data
if(g.isContinuous()&&r.isContinuous()&&b.isContinuous())
{  
  for(int i = 0; i < g.rows*g.cols; i++)
  {
     rptr[i] = rptr[i]&&!bptr[i]&&!gptr[i];
  }
}

r现在包含您描述的输出。如果您不想覆盖r。

,也可以将其复制到新矩阵中

有几种方法可以迭代cv :: Mat并访问所有数据点,C ++提供了你想要的所有逻辑运算符。据我所知,openCV不提供矩阵逻辑运算符函数,但您可以非常轻松地编写自己的函数,如上所示。

修改 正如QuentinGeissmann所建议的那样,你可以使用bitwise_not和bitwise_and函数完成同样的事情。我不知道他们存在。我怀疑使用它们会因为数据必须迭代的次数而变慢,但可以用更少的代码完成。

cv::bitwise_not(g,g);
cv::bitwise_not(b,b);
cv::bitwise_and(b,g,b);
cv::bitwise_and(r,b,r);
//r now contains r&&!b&&!g