那么你已经想出了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
这可能更适合[DSP Stack Exchange](http://dsp.stackexchange.com/faq)。如果你认为它可能更适合,也许它会在那里迁移。首先检查。我不参加,所以我可能是错的。 (请勿交叉邮寄)。 – Bart 2012-08-15 15:40:53
你能展示一个图片的例子吗?也真的考虑将此问题迁移到DSP,您的问题就是关于数字信号处理。 – ffriend 2012-08-15 17:27:03
我可以看到这个问题在这里是如何适用的。据我了解,他并不是要求检测激光的技术,他已经开发了他的技术。他所要求的是关于使用openCV来实现该技术的信息。 – Hammer 2012-08-15 19:27:54