使用opencv进行颜色序列识别

时间:2017-09-26 09:48:32

标签: c++ opencv computer-vision

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

我必须检查以下连接器的颜色顺序是否正确。 使用颜色重新定位技术或模式匹配技术更好吗? 有没有更好的方法来解决这个问题?

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

enter image description here

1 个答案:

答案 0 :(得分:4)

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

  1. 转换为L a b色彩空间;

    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

  3. enter image description here

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

      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]);
           }
      

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