使用OpenCV进行激光线检测
Laser line detection using OpenCV
我正在做一个项目,我需要检测图像中的红色激光线。这就是我想到的策略。
- 分离图像中的R,G,B通道。
- 将图像阈值设置为高强度值。
- 使用生成的 3 个二进制图像,执行元素明智的操作 r&&!g &&!b.(&&是逻辑 AND,! 是逻辑 NOT)。
- 得到的矩阵是一个二值图像,在激光存在的区域上有1。
这适用于 Matlab 上的一些测试图像。但我的问题是这需要在C/C++中使用OpenCV来实现。
我已经尝试了大多数库函数,但似乎没有直观/简单的方法来处理二进制图像并对其执行逻辑操作。
有人可以指出我您认为我可能会发现有用的OpenCV函数/方法吗?我认为cvThresholdImage
可用于阈值设置,但仅此而已。
那么你已经弄清楚了 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
相关文章:
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- 如何在OpenCV中检测这是谁的脸?
- 如何在 ORB 检测 OpenCV ++ 中获取校正角度?
- OpenCV代码不会检测人脸的数量,也不会在脸周围放一个圆圈
- 检测 OpenCV C++窗口上的触摸
- 使用opencv的C++图像检测
- 如何以及在何处使用带QT的Basler Cam实现opencv人脸检测代码
- 在不使用经过训练的模型的情况下检测/分割面部和面部特征:openCV C++
- Opencv cascade.detectMultiScale 不检测眼睛
- 无法使用 OpenCV 3.1.0 检测 ArUco 标记
- 如何将此项目更改为 OpenCV 实时人脸检测应用程序?
- 检测 OpenCV 中"average"的颜色范围
- 检测OpenCV C (移动相机)上的运动
- 如何使用 SVMLIGHT 模型文件通过 C++ 检测 OpenCV 中的对象
- 内存分配错误/圆检测/openCV / C ++
- 我需要修改 Sobel 内核以进行对角线边缘检测.OpenCV和C++
- 检测opencv中的黄色
- 人脸检测OpenCV + Qt + cvMat
- 边缘检测opencv android
- 卡边缘检测OpenCV