Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Colors 无法检测具有给定颜色和距离的相同像素_Colors_Cielab - Fatal编程技术网

Colors 无法检测具有给定颜色和距离的相同像素

Colors 无法检测具有给定颜色和距离的相同像素,colors,cielab,Colors,Cielab,假设两点p0和p1位于欧几里德距离d1处,给定两个像素/体素的实验室颜色值为(L0、a0、b0)和(L1、a1、b1)。现在,如果我改变一个刚性物体的位置,它包含两个给定的点,那么就不可能在相同的距离(mm)和相同的实验室颜色值下检测到这些点。 我正在使用pcl做3d物体识别的计算机视觉任务。这里,当我试图找到之前在距离d1处检测到的两个点及其颜色时,如果我改变给定两点的对象的位置和方位,则未检测到,这里的体素被分析。对象没有定向,因此我使用的kinect相机看不到相同的两点 iv=1; in

假设两点p0和p1位于欧几里德距离d1处,给定两个像素/体素的实验室颜色值为(L0、a0、b0)和(L1、a1、b1)。现在,如果我改变一个刚性物体的位置,它包含两个给定的点,那么就不可能在相同的距离(mm)和相同的实验室颜色值下检测到这些点。 我正在使用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;
                   }
                 }
               }
             }
           }
        }
     }
  }
iv=1;int p0,p1,p2,p0obj,p1obj,p2obj;
对于(p0=0;p00&&d4r>0&&d0r2)建议:

使用近似距离(a>19&&a2建议:


使用近似距离(a>19&&a您的概念似乎相当合理,但我根本没有严格遵循您的代码。您应该将数据存储在某种类型的pcl点容器中(我认为xyzrgb有一个容器非常有用).你的abc向量中到底是什么…看起来你在看图像中每个像素的距离,这在上下文中没有意义。p3不在这个代码片段中(尽管p1、p2、p4都在那里)我正在集成ROS和PCL以执行3d对象识别任务,首先我要读取const sensor_msgs::PointCloud2ConstPtr&input类型的点云,以从相机订阅点云,然后使用PCL::PointCloud output;PCL::fromROSMsg(*输入,输出)将其转换为PCL数据类型PCL::PointXYZRGB;好的,但如果你有pcl点,为什么要生成这些令人困惑的属性向量,而不是仅仅使用pcl内置的点函数,如pt.distance(pt)…你的概念似乎合理,但我一点也不严格遵循你的代码。你应该将数据存储在某种类型的pcl点容器中(对于xyzrgb,我认为有一个非常有用)。abc向量中到底有什么…看起来像是在查看图像中每个像素的距离,这在上下文中没有意义。p3不存在于此代码段中(尽管p1、p2、p4都存在)我正在集成ROS和PCL以执行3d对象识别任务,首先我要读取const sensor_msgs::PointCloud2ConstPtr&input类型的点云,以从相机订阅点云,然后使用PCL::PointCloud output;PCL::fromROSMsg(*输入,输出)将其转换为PCL数据类型PCL::PointXYZRGB;好的,但是如果您有pcl点,为什么要生成这些令人困惑的属性向量,而不仅仅是使用pcl内置的点函数,如pt.distance(pt)…我也这样做了,但结果是:物体的方位和位置没有正确地确定下来,虽然方位和方位的差别不大,但当我把测试物体放在某个特定的方位时,方位是完全错误的。虽然我也会做这件事,这也是正确的,但他们必须在我的代码中可能有一些错误。在我自己完成之前,我可以发布所有代码,所以我还没有发布所有代码。是的,解决此问题的步骤如下:(1):演示您可以清楚地分割出所需的颜色。(2):制作一个函数以获取彩色簇的中心,这样您现在就有了表示基准点的pts。(3):实现适当的向量数学,以计算从原点位置到这3个点的变换…我也这样做了,但结果是:对象的方向和位置没有正确到达,虽然位置和方向都没有太大差异,但在我进行测试时,方向是完全错误的虽然我也会处理同样正确的cas,但它们一定是我代码中的错误。我可以发布所有代码,直到我自己完成此操作,所以我还没有发布所有代码。是的,解决此问题的步骤如下:(1):证明你可以清楚地分割出你想要的颜色。(2):创建一个函数来获取彩色簇的中心,这样您现在就有了表示基准点的pts。(3):实现适当的向量数学来计算这3个点从原点位置的变换。。。