2016-12-27 30 views
1

考慮到兩個點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向量中的顏色值分析當前對象。這裏到達,arr1 ..是包含來自私密對象的點的索引的映射,這裏每當檢測到給定點模式p0,p1,p2,p3,p4時,它就從循環中出來。當我運行它時,它不能按預期正確工作。我懷疑,當物體的位置和礦化度發生變化時,給定4個體素的a,b顏色值也會發生變化(來自實驗室顏色),並且其(給定2/3/n體素)距離也以某種方式不會與先前保持相同像物理學中的測量問題一樣保存。 所以我主要困惑的是,當像素/體素的位置改變時,a和b的值是否會改變?我不使用L值,因爲亮度值可能會在環境中發生變化。

+0

你的概念似乎合理合理,但我幾乎沒有遵循你的代碼。你應該將你的數據存儲在某種類型的pcl點容器中(有一個用於xyzrgb,我認爲*有很多幫助)。 –

+0

你的abc矢量究竟是什麼......看起來你正在看圖像中每個像素的距離,這在這種情況下沒有任何敏感。 –

+0

p3不存在於此代碼片段中(儘管p1,p2,p4全部存在) –

回答

0

2建議:

使用近似距離(A> 19 & &一個< 21),(一== 20)是非常具體的,由於數字voxeling噪音取決於你的分辨率和對象的大小可能會失敗。

我認爲你需要檢查你的顏色是否匹配/是否是正確的顏色才能成爲合格的點,但我在代碼中看不到這個位置。

如果我正在編寫這個......我認爲我的第一步將分離出某個顏色範圍內的所有像素,然後我會通過這些點來查看它們之間的一組適當間隔的項目。

+0

我也這樣做了,但結果是:對象的對位和位置並不合適,儘管位置和直接位置的差別不大,但是當我將測試對象放在某些位置時,oriantaion會完全錯誤具體的oriantation。雖然我也會在這方面工作,這也是事實,他們必須在我的代碼中出現一些錯誤。 –

+0

我可以發佈我的所有代碼,直到我完成這個自己,所以我沒有發佈所有的代碼。 –

+0

是的,這個問題的步驟是:(1):證明你可以清楚地分割出你想要的顏色。 (2):做一個函數來獲得彩色羣集的中心,這樣你就可以得到代表你的基準點的點。 (3):實現適當的矢量數學計算從原點位置3點的變換... –