基于轮廓的三维骨架重建方法和核心代码

原创 2015年07月09日 17:05:06

 背景(为什么要这么做?):

        目前获取三维数据的方法很多,比如:双目视觉技术,深度相机等等。

        但是存在一个问题:数据量巨大!如果要做在线检测,那速度很可能达不到要求。

总思路:

        用二维的数据来表示三维数据(数据量从n3降到n2)

课题需求:

        本人的实验室目前的课题是要做马铃薯的形状检测。通过二维图像误差很大,通过传统三维方法达不到在线检测速度要求。

步骤:

1.推导出二维轮廓像素点到三维空间的坐标映射关系;

2.通过图像处理获取轮廓坐标;

3.转换到三维空间;

4.通过PCL点云数据库显示合成三维图像。

核心代码:

        //计算x,y轴的方向余弦
//p1表示上面点x,p2表示上面点y,p3表示下面点x,p4表示下面点y
float StaticClassify::DirectionCosineX(float angle,float p1,float p2,float p3,float p4)
{
float pp=p3-p1;
float ppp=sqrt(pow((p3-p1),2)+pow((p2-p4),2));
float Cosine;
if (angle<100)
{Cosine=-pp/ppp;

else
{Cosine=pp/ppp;
}
return Cosine;
}


    //轮廓的二维点到三维点转换

for (i0 = 0; i0 < length0; i0++)
{
point0[i0]=*CV_GET_SEQ_ELEM(CvPoint,contours0,i0);//在当前contour下一个一个的读取数据

point30[i0].x=(float)(point0[i0].x-x0);
point30[i0].y=(float)(point0[i0].y-y0);
point30[i0].z=(float)0;
}
for (i1 = 0; i1 < length1; i1++)
{
point1[i1]=*CV_GET_SEQ_ELEM(CvPoint,contours1,i1);
   point31[i1].x=((float)(point1[i1].x-x1))*0.92388;    //cos22.5°
   point31[i1].y=((float)(point1[i1].y-y1));
   point31[i1].z=((float)-(point1[i1].x-x1))*0.38268;   //sin22.5°
    }
for (i2 = 0; i2 < length2; i2++)
{
point2[i2]=*CV_GET_SEQ_ELEM(CvPoint,contours2,i2);


point32[i2].x=((float)(point2[i2].x-x2))*0.7071;
point32[i2].y=((float)(point2[i2].y-y2));
point32[i2].z=((float)-(point2[i2].x-x2))*0.7071;
}
for (i3 = 0; i3 < length3; i3++)
{
point3[i3]=*CV_GET_SEQ_ELEM(CvPoint,contours3,i3);

point33[i3].x=((float)(point3[i3].x-x3))*0.38268;
point33[i3].y=((float)(point3[i3].y-y3));
point33[i3].z=(float)-(point3[i3].x-x3)*0.92388;
}
for (i4 = 0; i4 < length4; i4++)
{
point4[i4]=*CV_GET_SEQ_ELEM(CvPoint,contours4,i4);

   point34[i4].x=(float)0;
   point34[i4].y=((float)(point4[i4].y-y4));
point34[i4].z=(float)-(point4[i3].x-x3);
}
for (i5 = 0; i5 < length5; i5++)
{
point5[i5]=*CV_GET_SEQ_ELEM(CvPoint,contours5,i5);

   point35[i5].x=((float)-(point5[i5].x-x5))*0.38268;
   point35[i5].y=((float)(point5[i5].y-y5));
   point35[i5].z=((float)-(point5[i5].x-x5)*0.92388);
}
for (i6 = 0; i6 < length6; i6++)
{
point6[i6]=*CV_GET_SEQ_ELEM(CvPoint,contours6,i6);

      point36[i6].x=(float)-(point6[i6].x-x6)*0.7071;
    point36[i6].y=((float)(point6[i6].y-y6));
    point36[i6].z=((float)-(point6[i6].x-x6))*0.7071;
}
for (i7 = 0; i7 < length7; i7++)
{
point7[i7]=*CV_GET_SEQ_ELEM(CvPoint,contours7,i7);

point37[i7].x=((float)-(point7[i7].x-x7))*0.92388;
    point37[i7].y=((float)(point7[i7].y-y7));
    point37[i7].z=((float)-(point7[i7].x-x7))*0.38268;
}
}


//三维点云显示
void StaticClassify::OnBnClickedButtonThreeDimensional()
{
pcl::PointXYZ p;
// TODO: 在此添加控件通知处理程序代码
TwoPointToThreePoint();

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud0(new pcl::PointCloud<pcl::PointXYZ>);   //Ptr是一种指针
cloud0->reserve(contours0->total);                                                //reserve开辟空间
for(int i=0;i<contours0->total;i++)
{
p.x=point30[i].x;
p.y=point30[i].y;
p.z=point30[i].z;
cloud0->push_back(p);
}

pcl::visualization::CloudViewer viewer("点云");
viewer.runOnVisualizationThreadOnce(viewerOneOff);
viewer.showCloud(cloud0,"cloud0");

while(!viewer.wasStopped())
{
}
}


遍历三维骨架

type def struct edge { int adjvex; int weight; struct edge *next; }ELinkl 1、图的概念 1.1 ...
  • swfa1
  • swfa1
  • 2014年04月03日 13:44
  • 601

三维图像细化算法

  • 2012年07月07日 16:57
  • 5.07MB
  • 下载

Kinect实现简单的三维重建

Kinect想必大家已经很熟悉了,最近基于Kinect的创意应用更是呈井喷状态啊!看到很多国外大牛用Kinect做三维重建,其中最著名的要数来自微软研究院的Kinect Fusion了,可以看看下面这...
  • AIchipmunk
  • AIchipmunk
  • 2013年03月29日 13:02
  • 17354

浅析基于二维轮廓线重构表面算法

轮廓线重构算法   由一组二维轮廓线重建出物体的三维表面是三维数据场可视化中的一种表面绘制方法。在医学图像可视化以及其他可视化领域中有着广泛的应用。三维表面重建实际上是对物体表面进行三角形划分,...
  • u013339596
  • u013339596
  • 2014年02月13日 17:04
  • 1338

常见三维重建算法及其实现(含源码下载链接)

这里三维重建,输入的是断层图像切片,节选于自己毕业设计,文末贴出一些关键代码。 三维重建的方法大概有两种:直接将体素投影到计算机显示平面的方法被称为体绘制(Volume Rendering),也可...
  • bizer_csdn
  • bizer_csdn
  • 2016年10月01日 17:36
  • 5989

三维重建过程与算法介绍

一、图像预处理  图像预处理的目的在于改善图像的视觉效果,提高图像的清晰度,有选择的突出某些感兴趣的信息,抑制  无用的信息,以提高图像的使用价值。    图像平滑处理:中值滤波、形...
  • kksc1099054857
  • kksc1099054857
  • 2017年08月15日 11:35
  • 778

三维重建算法

1、三维重建的基本概念 1.1摄影空间 1.2摄像机成像模型 1.3对极几何约束 1.3.1对极几何 1.3.2基本矩阵 1.3.3本质矩阵...
  • blank_screen
  • blank_screen
  • 2015年08月05日 22:15
  • 3355

前两年做了个三维重建程序

适用范围主要只针对相机标定好、点也匹配好的情况下的简单的多视图重建。特别地,对于牛津大学的Zissermann小组公开的多视图数据集工作效果最好。对于100%100\%的数据都能够高效地达到数值意义上...
  • stereohomology
  • stereohomology
  • 2016年04月10日 22:03
  • 3494

基于轮廓的三维骨架重建方法和核心代码

背景(为什么要这么做?):         目前获取三维数据的方法很多,比如:双目视觉技术,深度相机等等。         但是存在一个问题:数据量巨大!如果要做在线检测,那速度很可能达不到要求。 总...
  • zju_ComputerVision
  • zju_ComputerVision
  • 2015年07月09日 17:05
  • 688

三维网格的骨架提取

       经过这段时间的努力,骨架提起终于有了点成果。这次编码吸取上次失败的经历,在代码规范上下了大功夫,算法上,在导师的帮助下彻底弄明白了。      算法:         1,体素化    ...
  • zhu_nn
  • zhu_nn
  • 2010年08月08日 09:39
  • 1597
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于轮廓的三维骨架重建方法和核心代码
举报原因:
原因补充:

(最多只允许输入30个字)