【问题标题】:Color sequence recognition using opencv使用opencv进行颜色序列识别
【发布时间】:2018-03-07 11:30:08
【问题描述】:

使用 opencv 进行正确颜色识别的可能机器视觉解决方案是什么?

我必须检查下面连接器的颜色顺序是否正确。 使用颜色识别技术还是模式匹配技术更好? 有没有更好的方法来解决这个问题?

下图是带彩色电线的连接器,如何检查电线的正确顺序?

【问题讨论】:

  • 如果一直是这个颜色的顺序并且在这个位置,你可以试试inRange函数(颜色可能会有一点点变化),比较大部分像素的位置。您也可以尝试检测线条并获取每条线的颜色。
  • 一个想法:如果您确定顶部连接器的位置,那么您就知道您可以下拉并选择一个仅包含电线的较小 ROI。此外,如果您确定了连接器的比例,那么您可以根据电线的数量将该 ROI 拆分为多个区域,然后像这样分离出每条电线。然后你会按顺序排列好多个小图像,其中只有一条线,然后颜色检测应该很容易。
  • 亚历山大雷诺兹:你的意思是这样的:dropbox.com/s/0zzlrbpllrgklmf/Brez%20naslova.png?dl=0
  • api55:好的..这是一个很棒的功能。那么首先我认为如果我想分别检查每种颜色,我应该如何更好地对比彩色电线。这里的问题是,如果我制作黑色背景,则不会看到黑线,白色背景也是如此 - 不会看到白线......我不知道如何解决的其他问题是:什么我应该在 C++ 中使用算法来确定颜色序列...

标签: c++ opencv computer-vision


【解决方案1】:

我建议执行以下步骤(使用简单的代码说明):

  1. 转换为 Lab 颜色空间;

    https://en.wikipedia.org/wiki/Lab_color_space/

    cv::cvtColor(img,img,CV_BGR2Lab);

  2. 获取仅包含电线的子图像

    img = img(cv::Rect(x,y,width,height)); // detect wires

  1. 计算每列的平均值并获得一维值向量

    std::vector<cv::Vec3f> aggregatedVector;
    for(int i=0;i<img.cols;i++)
    {
      cv::Vec3f sum = cv::Vec3f(0,0,0);
      for(int j=0;j<img.rows;j++)
      {
        sum[0]+= img.at<Vecb>(j,i)[0]);
        sum[1]+= img.at<Vecb>(j,i)[1];
        sum[2]+= img.at<Vecb>(j,i)[2];
      }
      sum = sum/img.rows;
      aggregatedVector.push_back(sum);
    }
    
  2. 使用梯度提取均匀场并获得 20 的向量 价值观

    std::vector<Vec3f> fields
    cv::Vec3f mean = 0;
    int counter =0;
    for(int i=0;i<aggregatedVector.size();i++)
       {
         mean+= aggregatedVector[i];
         if(cv::norm(aggregatedVector[i+1] - aggregatedVector[i]) > /*thresh here */
            {
              fields.push_back(mean/(double)counter);
              mean = cv::Vec3f(0,0,0);
              counter=0;
            }
          counter++
       }
    
  3. 计算计算向量和参考之间的颜色距离向量

      double totalError = 0;
      for(int i=0;i<fields.size();i++)
         {
            totalError+= cv::mean(reference[i]-fields[i]);
         }
    

    然后您可以根据误差向量值做出决定。玩得开心!

【讨论】:

  • 感谢您的回复。这对我来说似乎是全新的方法。能否请您提供有关此方法的更多信息?我对这 1-5 点了解不多 :)
  • @jok23 我为算法步骤说明添加了简单的源代码。
  • @KamilSzelag 你过去一天的所有帖子都很棒,很高兴有你在场。
  • Kamil 听起来很有趣,但我还是不明白你在第 4 点到底在做什么??
  • @jok23 我正在减少问题的维数 -> 从 2d 到 1d
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2010-12-30
  • 2019-03-15
  • 2011-06-30
  • 2014-01-20
  • 2011-08-01
相关资源
最近更新 更多