Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于OpenCV的激光测线_C++_Opencv - Fatal编程技术网

C++ 基于OpenCV的激光测线

C++ 基于OpenCV的激光测线,c++,opencv,C++,Opencv,我正在做一个项目,在这个项目中,我需要检测图像中的红色激光线。这是我心目中的战略 分离图像中的R、G、B通道 以高强度值设置图像阈值 使用生成的3个二进制图像,执行元素操作r&!g&&!B(&&符合逻辑,而,!不符合逻辑) 得到的矩阵是一个二值图像,其中1位于激光器所在区域 这在Matlab上使用了一些测试图像。但我的问题是,这需要在C/C++中使用OpenCV实现。 我已经尝试过大多数库函数,但似乎没有直观/简单的方法来处理二进制图像并对其执行逻辑操作 有人能告诉我一些你认为有用的OpenCV

我正在做一个项目,在这个项目中,我需要检测图像中的红色激光线。这是我心目中的战略

  • 分离图像中的R、G、B通道
  • 以高强度值设置图像阈值
  • 使用生成的3个二进制图像,执行元素操作r&!g&&!B(&&符合逻辑,而,!不符合逻辑)
  • 得到的矩阵是一个二值图像,其中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];
      }
    }
    

    这可能更适合于。如果你认为它可能更合适的话,也许已经移植到那里了。不过先检查一下。我没有参加,所以我可能错了。(请不要交叉张贴)。你能举一个图片的例子吗?还真的考虑迁移这个问题到DSP,你的问题只是关于数字信号处理。我可以看到这个问题在这里是如何适用的。据我所知,他并不是在要求检测激光的技术,他已经发展了他的技术。他所要求的是关于使用openCV实现该技术的信息。@Hammer:啊,这样我应该对你的答案投赞成票:)@ffriend我想我确实有点利益冲突:)Hammer,谢谢你的回复。是的,这正是我想要的。我会处理这件事,然后给你回复。你建议使用cv::Mat而不是IplImage?@tetradeca7tope这只是一个偏好问题。CV::MAT是新的C++接口,另一个是C接口。我只有C++的经验,所以我不能真正地告诉你这些差异。我听说你应该避免把它们混在一起,所以如果你已经承诺使用Iplimage,也许你应该坚持。您可以直接访问其.imageData而不是.data for cv::Mati。此外,使用cv::bitwise\u not/和。。。如果您最终同时尝试这两种操作,请让我们知道哪一种最快:“适合您”:)结果是cv::按位操作更快。我正在处理VGA图像,所以我不确定它们是如何放大的。谢谢大家@不客气。对SO说谢谢的一个好方法是接受/投票回答。
    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