2016-12-27 4 views
1

Считайте, что две точки p0 и p1 находятся на эвклидовом расстоянии d1, а значение цвета Lab заданных двух пикселей/вокселей (L0, a0, b0) и (L1, a1, b1). Теперь, если я изменяю положение жесткого объекта, который содержит заданные две точки, чем не должно быть возможным обнаружить те точки на одном и том же расстоянии (мм) и с тем же значением цвета 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 vector. Здесь arri, arr1 .. являются картами, которые содержат индекс точки от частного объекта, здесь всякий раз, когда заданный паттерн p0, p1, p2, p3, p4 обнаруживается, он выходит из цикла. Когда я запускаю это, он работает не так, как ожидалось и правильно. Я сомневаюсь, что при изменении положения и оранения объекта значения цвета a, b данных 4 вокселей также меняются (из лабораторного цвета), а его (учитывая два/3/n вокселя) расстояние также как-то не остается таким же, как ранее так же как и проблема измерения в физике. Итак, моя главная путаница здесь в том, что значения a и b изменяются при изменении положения пикселя/вокселя? Я не использую значение L, поскольку значение освещенности может меняться в среде.

+0

Вы поняли, что разумно звучит, но я не следую вашему коду совсем не так. Вы должны хранить свои данные в каком-то контейнере pcl-точки (есть один для xyzrgb, который * я думаю * поможет много). –

+0

Что именно находится в ваших векторах abc ... Похоже, вы смотрите на расстояния каждого пикселя в изображении, что не вызывает чувства в этом контексте. –

+0

p3 нет в этом фрагменте кода (несмотря на то, что p1, p2, p4 все там) –

ответ

0

-предложения:

использовать приблизительные расстояния (а> 19 & & < 21), (а == 20) невероятно точен и может разрушаться из-за цифровой voxeling шум в зависимости от разрешения и размера объекта.

Я бы подумал, что вам нужно проверить, соответствует ли ваш цвет/правильному цвету, чтобы быть точными, но я не вижу этого в коде.

Если бы я писал это ... Я думаю, что мой первый шаг будет разделять все пиксели внутри определенного цветового диапазона, а затем я просмотрю эти точки для набора должным образом расположенных между ними элементов.

+0

Я тоже это сделал, но результат: аранжировка и положение объекта не срабатывают должным образом, хотя малое различие как в позиции, так и в аранжировке нормально, но oriantaion приходит совершенно неправильно, когда я помещаю тестовый объект в некоторый специфическая ориентация. хотя я буду работать и над этим, что тоже верно, их ошибка должна быть ошибкой в ​​моем коде. –

+0

Я могу опубликовать все мои коды, пока я не закончу это сам, поэтому я havent опубликовал все коды. –

+0

Да, шаги по этой проблеме imo: :(1): продемонстрировать, что вы можете четко сегментировать цвета, которые вы хотите. (2): Создайте функцию, чтобы получить центр цветных кластеров, чтобы теперь у вас были точки, которые представляют ваши фидуциалы. (3): Внедрить соответствующую векторную математику для вычисления трансформации этих трех точек из исходной позиции ... –

Смежные вопросы