在OpenCV中应用掩码

问题描述 投票:0回答:1

我从这张图片开始:enter image description here

我想为此在车辆前面的车道标记上涂色(是的,这是针对Udacity在线课程的,但是他们希望我使用python做到这一点,但我宁愿在C ++中做到)]

找到正确的标记很容易:enter image description here

这可为标记着色:

  cv::MatIterator_<cv::Vec3b> output_pix_it = output.begin<cv::Vec3b>(); 
  cv::MatIterator_<cv::Vec3b> output_end = output.end<cv::Vec3b>();

  cv::MatIterator_<cv::Vec3b> mask_pix_it = lane_markers.begin<cv::Vec3b>(); 

  //auto t1 = std::chrono::high_resolution_clock::now();

  while (output_pix_it != output_end)
  {
    if((*mask_pix_it)[0] == 255)
    {
      (*output_pix_it)[0] = 0;
      (*output_pix_it)[1] = 0;
      (*output_pix_it)[2] = 255;
    }

    ++output_pix_it;
    ++mask_pix_it;
  }

正确产生enter image description here

但是我似乎有点慢,它对于960 x 540的图像需要1-2毫秒(在带有16gb ram的i7-7700HQ内核上,用-O3编译);>

此处遵循“有效方式”:https://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#howtoscanimagesopencv

我想出了:

    unsigned char *o; // pointer to first element in output Mat
    unsigned char *m; //pointer to first element in mask Mat
    o = output.data;
    m = lane_markers.data;
    size_t pixel_elements = output.rows * output.cols * output.channels();

    for( size_t i=0; i < pixel_elements; i+=3 )
    {
      if(m[i] == 255)
      {
        o[i] = 0;
        o[i+1] = 0;
        o[i+2] = 255;
      }
    }

大约快3倍...。但是无法产生正确的结果:enter image description here

所有cv :: Mat对象均为8UC3类型(标准BGR像素格​​式)。据我所知,Mat对象的基础数据应该是unsigned char的数组,其长度为像素宽度*像素高度*通道数。但似乎我缺少了一些东西。对于输出矩阵和掩码矩阵,isContinuous()为true。我在Ubuntu 18.04上使用openCV 3.4.4。我想念什么?

我从这张图片开始:我想为此直接在车辆前面的车道标记上涂色(是的,这是针对Udacity在线课程的,但是他们希望我用python做到这一点,但是我想要。 ..

c++ opencv
1个回答
0
投票

Mat的遮罩区域设置为特定值的典型方法是使用Mat::setTo功能:

Mat::setTo
© www.soinside.com 2019 - 2024. All rights reserved.