无法检测具有给定颜色和距离的相同像素
cant detect same pixels with given color and distance
考虑两个点 p0 和 p1 的欧氏距离为 d1,并且给定两个 pixels/voxels 的 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.. 是包含来自私有对象的点的索引的映射,这里每当检测到给定的点模式 p0、p1、p2、p3、p4 时,它就会从循环中出来。当我 运行 它没有按预期正常工作。我怀疑当对象的位置和方向发生变化时,给定 4 体素的 a、b 颜色值也会发生变化(从实验室颜色)及其(给定 two/3/n 体素)距离也不会与以前保持相同保存类似于物理学中的测量问题。
所以我在这里的主要困惑是当 pixel/voxel 的位置改变时 a 和 b 的值是否改变?我没有使用 L 值,因为亮度值会在环境中发生变化。
2条建议:
使用近似距离 (a>19 && a<21),(a==20) 非常具体,可能会因数字体素噪音而失败,具体取决于您的分辨率和对象大小。
我认为您需要检查您的颜色是否匹配/是否是获得合格分数的正确颜色,但我在您的代码中没有发现这一点。
如果我正在写这篇文章...我认为我的第一步是分离出特定颜色范围内的所有像素,然后我会在这些点中寻找一组适当间隔的项目。
考虑两个点 p0 和 p1 的欧氏距离为 d1,并且给定两个 pixels/voxels 的 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.. 是包含来自私有对象的点的索引的映射,这里每当检测到给定的点模式 p0、p1、p2、p3、p4 时,它就会从循环中出来。当我 运行 它没有按预期正常工作。我怀疑当对象的位置和方向发生变化时,给定 4 体素的 a、b 颜色值也会发生变化(从实验室颜色)及其(给定 two/3/n 体素)距离也不会与以前保持相同保存类似于物理学中的测量问题。 所以我在这里的主要困惑是当 pixel/voxel 的位置改变时 a 和 b 的值是否改变?我没有使用 L 值,因为亮度值会在环境中发生变化。
2条建议:
使用近似距离 (a>19 && a<21),(a==20) 非常具体,可能会因数字体素噪音而失败,具体取决于您的分辨率和对象大小。
我认为您需要检查您的颜色是否匹配/是否是获得合格分数的正确颜色,但我在您的代码中没有发现这一点。
如果我正在写这篇文章...我认为我的第一步是分离出特定颜色范围内的所有像素,然后我会在这些点中寻找一组适当间隔的项目。