資源簡介
1. 本文檔包含:三維點云文件points.txt和C++項目文件CylinderFitting。
2. 本文檔通過對三維點云的圓柱擬合,得到圓柱的半徑、圓柱軸線單位方向向量和軸線起始位置三個主要參數。
3. 本文檔算法源自“學編程的小蜜蜂”的matlab程序:http://download.csdn.net/detail/erlongz/5815557

代碼片段和文件信息
//圓柱擬合程序:讀取points.txt文件中的點云數據,擬合得到圓柱半徑值.
//
//此程序依據“學編程的小蜜蜂”的matlab源程序:?http://download.csdn.net/detail/erlongz/5815557
//
//2014.12.24??By?HorizonDong.
#include?“cv.h“
#include?
#include????
#define??MAX_POINT_NUM?200000??//最大點數。若點數較之更大,則可能會導致堆棧溢出,此時需進行相應的堆棧設置。
using?namespace?std;
//函數聲明:
void?Reconstruction();
int?main(?)
{???
?????Reconstruction();????????????????????//三維點的重建、存儲??????
?????cout<<“done!“< ?????return?0;
}
////////////////////////////////////////////////////////////////////////////
//圓柱擬合程序
//輸入:??1、點云文件points.txt.
//???????????其存儲格式為?x1?y1?z1
//????????????????????????x2?y2?z2
//????????????????????????x3?y3?z3
//????????????????????????.
//????????????????????????.
//????????????????????????.
//輸出:??1、循環迭代次數loop_times;
//????????2、擬合得到的半徑R.
void?Reconstruction()???
{
?????int?i=0j=0;??????????????//循環用變量
?int?int_temp=0;???????????//用于存儲待擬合的點數
?int?loop_times=0pp=0;????//loop_time等價于t,表示迭代循環次數
?????double?a=1b=1c=1;
?double?x0=0y0=0z0=0;
?double?D=0s=0S=0dx=0dy=0dz=0;
?double?R=0;???????????????????????????????//半徑
?double?d_temp1=0d_temp2=0d_temp3=0;
?double?B[MAX_POINT_NUM][7]={0};
?double?L[MAX_POINT_NUM]???={0};
?????double?worldVetex[MAX_POINT_NUM][3]={0};??//用于存儲點坐標
?????double?mean_x=0mean_y=0mean_z=0;
?bool?while_flag=1;
?????CvMat*?C????=?cvCreateMat(?2?7?CV_64FC1?);
?????CvMat*?W????=?cvCreateMat(?2?1?CV_64FC1?);
?????CvMat*?N????=?cvCreateMat(?9?9?CV_64FC1?);
?CvMat*?N_inv=?cvCreateMat(?9?9?CV_64FC1?);
?CvMat*?UU???=?cvCreateMat(?9?1?CV_64FC1?);
?????CvMat*?para?=?cvCreateMat(?9?1?CV_64FC1?);?????//參數矩陣
?????//變量初始化
?????cvZero(C);cvZero(W);cvZero(N);cvZero(N_inv);cvZero(UU);
?????cvSetIdentity(para);
??????
////從points.txt文件讀入三維坐標點
???ifstream?Points_in(“points.txt“);
???int_temp=0;
???if?(Points_in.is_open())?
???{
?????while?(!Points_in.eof())???//尚未到達文件結尾
?{?
????????Points_in>>worldVetex[int_temp][0]>>worldVetex[int_temp][1]>>worldVetex[int_temp][2];
int_temp++;?
?}??
???}
???else
???{
????????cout<<“open?fail!“< ???}
???int_temp=int_temp-1;?????????//由于points.txt文件末行為空行,須扣除一個點
???//求解重心、初始化
?for(i=0;i ?{?
????????d_temp1+=worldVetex[i][0];
????????d_temp2+=worldVetex[i][1];
????????d_temp3+=worldVetex[i][2];
?}
?????mean_x=d_temp1/int_temp;?mean_y=d_temp2/int_temp;mean_z=d_temp3/int_temp;
?????x0=mean_x;y0=mean_y;z0=mean_z;
?????R?=20;
//迭代循環,最優化矩陣para
??while(while_flag==true)???????//即(max(abs(para(1:7)))>0.00001)???????????????
??{
//1.?a、b、c的符號修正
??if(a<0)?
??{
?????????a=-a;b=-b;c=-c;
??}
??????if(a==0)
??{?
?????????if(b<0)
?{
???????????b=-b;c=-c;
?}
?????????if(b==0)
?{
???if(c<0)
?????????????c=-c;
?}
??}?
???????s=sqrt(pow(a2)+pow(b2)+pow(c2))+0.0000001;???????//防止a?b?c?同時為0
???????a=a/s+0.0000001;b=b/s+0.0000001;c=c/s+0.0000001;
//2.?計算矩陣B和L
??????for(i=0;i
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7149??2014-12-24?21:08??Cylinderfitting\3D_reconstruction.cpp
?????文件???????3710??2013-10-26?16:42??Cylinderfitting\3D_reconstruction.dsp
?????文件????????559??2013-10-26?16:42??Cylinderfitting\3D_RECONSTRUCTION.DSW
?????文件?????115712??2014-12-24?21:09??Cylinderfitting\3D_reconstruction.ncb
?????文件??????54784??2014-12-24?21:09??Cylinderfitting\3D_RECONSTRUCTION.OPT
?????文件????????268??2014-12-24?21:09??Cylinderfitting\3D_reconstruction.plg
?????文件????8343552??2013-09-25?14:40??Cylinderfitting\3D_reconstruction.sdf
?????文件????????900??2013-09-25?14:28??Cylinderfitting\3D_reconstruction.sln
????..A..H.?????10752??2013-09-25?14:40??Cylinderfitting\3D_reconstruction.suo
?????文件???????6338??2013-09-25?14:39??Cylinderfitting\3D_reconstruction.vcxproj
?????文件????????143??2013-09-25?14:26??Cylinderfitting\3D_reconstruction.vcxproj.user
?????文件???????4553??2014-12-24?17:21??Cylinderfitting\CylinderFitting.dsp
?????文件????????555??2014-12-24?17:07??Cylinderfitting\CylinderFitting.dsw
?????文件??????33792??2014-12-24?17:21??Cylinderfitting\CylinderFitting.ncb
?????文件??????49664??2014-12-24?17:21??Cylinderfitting\CylinderFitting.opt
?????文件???????1837??2014-12-24?17:16??Cylinderfitting\CylinderFitting.plg
?????文件?????585802??2014-12-24?21:09??Cylinderfitting\Debug\3D_reconstruction.exe
?????文件?????846428??2014-12-24?21:09??Cylinderfitting\Debug\3D_reconstruction.ilk
?????文件?????357824??2014-12-24?21:09??Cylinderfitting\Debug\3D_reconstruction.obj
?????文件????2622312??2014-12-24?19:41??Cylinderfitting\Debug\3D_reconstruction.pch
?????文件????1147904??2014-12-24?21:09??Cylinderfitting\Debug\3D_reconstruction.pdb
?????文件??????99328??2014-12-24?21:09??Cylinderfitting\Debug\vc60.idb
?????文件?????143360??2014-12-24?21:09??Cylinderfitting\Debug\vc60.pdb
?????文件????1373720??2014-12-24?16:50??Cylinderfitting\points.txt
?????目錄??????????0??2014-12-24?21:09??Cylinderfitting\Debug
?????目錄??????????0??2014-12-24?21:09??Cylinderfitting
-----------?---------??----------?-----??----
?????????????15810946????????????????????26
- 上一篇:MFC各種按鈕美化源碼
- 下一篇:使用c++讀取圖像到二維矩陣
評論
共有 條評論