【问题标题】:cant detect same pixels with given color and distance无法检测给定颜色和距离的相同像素
【发布时间】:2016-12-27 12:19:11
【问题描述】:

考虑两个点 p0 和 p1 在欧几里德距离 d1 处,给定两个像素/体素的 Lab 颜色值为 (L0,a0,b0) 和 (L1,a1,b1)。现在,如果我更改包含给定两个点的刚性对象的位置,那么就不可能在相同的距离(mm)和相同的 Lab 颜色值处检测到这些点。 我正在使用 pcl 来完成 3d 对象识别的计算机视觉任务。在这里,当我尝试查找先前在距离 d1 处检测到的两个点及其颜色时,如果我更改给定两个点的对象的位置和方向,则未检测到,这里分析了体素。对象未定向,我正在使用的 kinect 相机看不到相同的两个点。

 iv=1; int p0, p1, p2, p0obj, p1obj, p2obj;
 for(p0=0;p0<a.size() && ros::ok() && iv==1;p0++) {
    for(p1=0;p1<a.size() && ros::ok() && iv==1;p1++) {
       int d1 = sqrt(pow(a.at(p1)-a.at(p0),2)+pow(b.at(p1)-b.at(p0),2)+pow(c.at(p1)-c.at(p0),2))*1000; 
       if(d1==20) { 
         for(p2=0;p2<a.size() && ros::ok() && iv==1;p2++) { 
            int d2 = sqrt(pow(a.at(p2)-a.at(p0),2)+pow(b.at(p2)-b.at(p0),2)+pow(c.at(p2)-c.at(p0),2))*1000;
            int d1d = sqrt(pow(a.at(p2)-a.at(p1),2)+pow(b.at(p2)-b.at(p1),2)+pow(c.at(p2)-c.at(p1),2))*1000;
            if(d2==20 && d1d==20) {
              float a1 = a.at(p1)-a.at(p0); float b1 = b.at(p1)-b.at(p0); float c1 = c.at(p1)-c.at(p0);
              float a2 = a.at(p2)-a.at(p0); float b2 = b.at(p2)-b.at(p0); float c2 = c.at(p2)-c.at(p0);
              float a3r = b1*c2-b2*c1; float b3r = a2*c1-a1*c2; float c3r = a1*b2-a2*b1;
              float a3, b3, c3;
              if(c3r>0) {
                a3 = a3r/sqrt(a3r*a3r+b3r*b3r+c3r*c3r);
                b3 = b3r/sqrt(a3r*a3r+b3r*b3r+c3r*c3r);
                c3 = -c3r/sqrt(a3r*a3r+b3r*b3r+c3r*c3r);
              }
              else {
                  a3 = a3r/sqrt(a3r*a3r+b3r*b3r+c3r*c3r);
                  b3 = b3r/sqrt(a3r*a3r+b3r*b3r+c3r*c3r);
                  c3 = c3r/sqrt(a3r*a3r+b3r*b3r+c3r*c3r);
              }
              float x3 = (a.at(p0)+a.at(p1)+a.at(p2)/3)+0.02*a3;
              float y3 = (b.at(p0)+b.at(p1)+b.at(p2)/3)+0.02*b3;
              float z3 = (c.at(p0)+c.at(p2)+c.at(p2)/3)+0.02*c3;
              for(int p4=0;p4<a.size() && ros::ok() && iv==1;p4++) {
                 int d0r = sqrt(pow(a.at(p4)-a.at(p0),2)+pow(b.at(p4)-b.at(p0),2)+pow(c.at(p4)-c.at(p0),2))*1000;
                 int d1r = sqrt(pow(a.at(p4)-a.at(p1),2)+pow(b.at(p4)-b.at(p1),2)+pow(c.at(p4)-c.at(p1),2))*1000;
                 int d2r = sqrt(pow(a.at(p4)-a.at(p2),2)+pow(b.at(p4)-b.at(p2),2)+pow(c.at(p4)-c.at(p2),2))*1000;
                 int d4r = sqrt(pow(x3-a.at(p1),2)+pow(y3-b.at(p1),2)+pow(z3-c.at(p1),2)); 
                 if(d0r>0 && d1r>0 && d2r>0 && d4r>0 && d0r<=70) {
                      cout<<p0<<endl;
                      d[0]=p0; d[1]=p1; d[2]=p2; d[3]=d0r; d[4]=d1r; d[5]=d2r; d[6]=d4r; d[7]=ac.at(p0); d[8]=bc.at(p0);
                   d[9]=ac.at(p1); d[10]=bc.at(p2); d[11]=ac.at(p2); d[12]=bc.at(p4); d[13]=ac.at(p4); d[14]=bc.at(p4); 
                   int j = arri(1,d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14]);
                   for(int k=1;k<=j;k++) { iv=0;
                      p0obj=arr0(k,d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14]);
                      p1obj=arr1(k,d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14]);
                      p2obj=arr2(k,d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14]);
                      //cout<<j<<":"<<p0obj<<"\t"<<p1obj<<"\t"<<p2obj<<"\n"<<p0<<"\t"<<p1<<"\t"<<p2<<endl;
                   }
                 }
               }
             }
           }
        }
     }
  }

以上是我的 c++ 程序的主要部分。在这里,此步骤分析当前对象,其坐标位于 a、b、c 向量中,颜色值位于 ac、bc、cc 向量中。这里 arri, arr1.. 是包含来自 privious 对象的点的索引的映射,这里每当检测到给定的点模式 p0,p1,p2,p3,p4 时,它就会从循环中出来。当我运行它时,它没有按预期正常工作。我怀疑当对象的位置和方向发生变化时,给定 4 个体素的 a、b 颜色值也会发生变化(来自实验室颜色),并且它的(给定两个/3/n 体素)距离也不知何故与以前不一样保存类似于物理学中的测量问题。 所以我在这里的主要困惑是,当像素/体素的位置改变时,a 和 b 的值会改变吗?我没有使用 L 值,因为亮度值会随着环境而变化。

【问题讨论】:

  • 您的概念似乎相当合理,但我几乎不遵循您的代码。您应该将数据存储在某种类型的 pcl 点容器中(有一个用于 xyzrgb,我认为会有很大帮助)。
  • 您的 abc 向量中到底有什么...看起来您正在查看图像中每个像素的距离,这在这种情况下毫无意义。
  • p3 在此代码 sn-p 中不存在(尽管 p1、p2、p4 都在那里)
  • 我正在集成 ROS 和 PCL 来执行 3d 对象识别任务,首先我首先读取类型为 const sensor_msgs::PointCloud2ConstPtr& 输入的点云,以从相机订阅点云,然后将其转换为PCL 数据类型 pcl::PointXYZRGB 使用 pcl::PointCloud<:pointxyzrgb> 输出; pcl::fromROSMsg(*输入,输出);
  • 好的,但是如果你有 pcl 点,为什么要生成这些令人困惑的属性向量,而不是仅仅使用 PCL 内置的点函数,如 pt.distance(pt)...

标签: colors cielab


【解决方案1】:

2 条建议:

使用近似距离 (a>19 && a

我认为您需要检查您的颜色是否匹配/是否是合格点的正确颜色,但我在您的代码中看不到这一点。

如果我正在写这篇文章...我认为我的第一步是分离出某个颜色范围内的所有像素,然后我会在这些点中查找一组适当间隔的项目。

【讨论】:

  • 我也这样做了,但是结果:物体的方向和位置没有正确,虽然位置和方向的差异很小,但是当方向完全错误时我把测试对象放在某个特定的方向上。虽然我也会研究这也是正确的,但它们一定是我的代码中的一些错误。
  • 我可以发布所有代码,直到我自己完成,所以我没有发布所有代码。
  • 是的,这个问题的步骤 imo::(1):证明你可以清楚地分割出你想要的颜色。 (2):创建一个函数来获取彩色集群的中心,这样你现在就有了代表你的基准点的点。 (3):实施适当的向量数学来计算这 3 个点从原点位置的变换...
猜你喜欢
  • 2016-02-16
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2023-03-19
  • 1970-01-01
  • 2016-07-14
相关资源
最近更新 更多