c++ - 使用 OpenCV 进行激光线检测

标签 c++ opencv

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

  1. 分离图像中的 R、G、B channel 。
  2. 以高强度值对图像进行阈值处理。
  3. 使用生成的 3 个二进制图像,执行元素明智的操作 r && !g && !b。 (&& 是逻辑与,! 是逻辑非)。
  4. 生成的矩阵是二值图像,其中 1 位于激光出现的区域。

这适用于 Matlab 上的一些测试图像。但我的问题是,这需要在 C/C++ 中使用 OpenCV 来实现。

我已经尝试过大多数库函数,但似乎没有直观/简单的方法来处理二进制图像并对它们执行逻辑操作。

有人可以向我指出您认为我可能会觉得有用的 OpenCV 函数/方法吗?我认为 cvThresholdImage 可用于阈值处理,但仅此而已。

最佳答案

那么您已经了解了 openCV 中的第 1 步和第 2 步?如果您只是尝试使用逻辑运算符,openCV 可以让您访问原始数据,然后您可以使用逻辑运算符对其进行操作。假设您已经分成三个 channel 并设置了阈值

//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

关于c++ - 使用 OpenCV 进行激光线检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972457/

相关文章:

python - 使用 opencv 和 python 进行多色跟踪

python - 检测连续图像的非/最小变化像素的最快方法

c++ - 如何将多个用户输入添加到数组?

c++ - 我可以在等待/信号信号灯中切换测试和修改部分吗?

c++ - Qt_USE_MATH_DEFINES

android - OpenCV Android 坐标错误

c++ - std::initializer_list 会导致生命周期问题吗?

c++ - 在#define 中给定文本,它能以某种方式传递给模板吗?

c++ - 使用 ARUCO 的一个标记来估计引用系统中的相机位姿

visual-c++ - Visual c++ OpenCV 2.1 contains()