日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迭代最近点算法 Iterative Closest Points

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迭代最近点算法 Iterative Closest Points 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

研究生課程系列文章參見索引《在信科的那些課》

基本原理

假定已給兩個數據集P、Q,?,給出兩個點集的空間變換f使他們能進行空間匹配。這里的問題是,f為一未知函數,而且兩點集中的點數不一定相同。解決這個問題使用的最多的方法是迭代最近點法(Iterative Closest Points Algorithm)。

基本思想是:根據某種幾何特性對數據進行匹配,并設這些匹配點為假想的對應點,然后根據這種對應關系求解運動參數。再利用這些運動參數對數據進行變換。并利用同一幾何特征,確定新的對應關系,重復上述過程。


迭代最近點法目標函數

三維空間中兩個3D點,?,他們的歐式距離表示為:

三維點云匹配問題的目的是找到P和Q變化的矩陣R和T,對于?,,利用最小二乘法求解最優解使:

最小時的R和T。

數據預處理

實驗中采集了五個面的點如下所示: 由于第一組(第一排第1個)和第三組(第一排第三個)采集均為模型正面點云,所以選用一和三做后續的實驗。 首先利用Geomagic Studio中刪除點的工具,去除原始數據中的一些隔離的噪點,效果如下:


平行移動和旋轉的分離

先對平移向量T進行初始的估算,具體方法是分別得到點集P和Q的中心:
?
分別將點集P和Q平移至中心點處:
則上述最優化目標函數可以轉化為: ?
最優化問題分解為:
  • 求使E最小的?
  • 求使?
  • 平移中心點的 具體代碼為:
    [cpp]?view plaincopy
  • //計算點云P的中心點mean??
  • void?CalculateMeanPoint3D(vector<Point3D>?&P,?Point3D?&mean)??
  • {??
  • ????vector<Point3D>::iterator?it;??
  • ????mean.x?=?0;??
  • ????mean.y?=?0;??
  • ????mean.z?=?0;??
  • ????for(it=P.begin();?it!=P.end();?it++){??
  • ????????mean.x?+=?it->x;??
  • ????????mean.y?+=?it->y;??
  • ????????mean.z?+=?it->z;??
  • ????}??
  • ????mean.x?=?mean.x/P.size();??
  • ????mean.y?=?mean.y/P.size();??
  • ????mean.z?=?mean.z/P.size();??
  • }??
  • 初始平移效果如下:

    利用控制點求初始旋轉矩陣

    在確定對應關系時,所使用的幾何特征是空間中位置最近的點。這里,我們甚至不需要兩個點集中的所有點。可以指用從某一點集中選取一部分點,一般稱這些點為控制點(Control Points)。這時,配準問題轉化為: 這里,pi,qi為最近匹配點。
    在Geomagic Studio中利用三個點就可以進行兩個模型的“手動注冊”(感覺這里翻譯的不好,Registration,應該為“手動匹配”)。

    我們將手動選擇的三個點導出,作為實驗初始的控制點:

    對于第i對點,計算點對的矩陣 Ai:
    ?,為的轉置矩陣。
    (*這里在査老師的課上給了一個錯誤的矩陣變換公式) 對于每一對矩陣Ai,計算矩陣B:?
    [cpp]?view plaincopy
  • double?B[16];??
  • ????????for(int?i=0;i<16;i++)??
  • ????????????B[i]=0;??
  • ????????for(itp=P.begin(),itq=Q.begin();itp!=P.end();itp++,itq++?){??
  • ????????????double?divpq[3]={itp->x,itp->y,itp->z};??
  • ????????????double?addpq[3]={itp->x,itp->y,itp->z};??
  • ????????????double?q[3]={itq->x,itq->y,itq->z};??
  • ????????????MatrixDiv(divpq,q,3,1);??
  • ????????????MatrixAdd(addpq,q,3,1);??
  • ????????????double?A[16];??
  • ????????????for(int?i=0;i<16;i++)??
  • ????????????????A[i]=0;??
  • ????????????for(int?i=0;i<3;i++){??
  • ????????????????A[i+1]=divpq[i];??
  • ????????????????A[i*4+4]=divpq[i];??
  • ????????????????A[i+13]=addpq[i];??
  • ????????????}??
  • ????????????double?AT[16],AMul[16];??
  • ????????????MatrixTran(A,AT,4,4);??
  • ????????????MatrixMul(A,AT,AMul,4,4,4,4);??
  • ????????????MatrixAdd(B,AMul,4,4);??
  • ????????}??

  • 原最優化問題可以轉為求B的最小特征值和特征向量,具體代碼:
    [cpp]?view plaincopy
  • //使用奇異值分解計算B的特征值和特征向量??
  • ????????double?eigen,?qr[4];??
  • ????????MatrixEigen(B,?&eigen,?qr,?4);??

  • [cpp]?view plaincopy
  • //計算n階正定陣m的特征值分解:eigen為特征值,q為特征向量??
  • void?MatrixEigen(double?*m,?double?*eigen,?double?*q,?int?n)??
  • {??
  • ????double?*vec,?*eig;??
  • ????vec?=?new?double[n*n];??
  • ????eig?=?new?double[n];??
  • ????CvMat?_m?=?cvMat(n,?n,?CV_64F,?m);??
  • ????CvMat?_vec?=?cvMat(n,?n,?CV_64F,?vec);??
  • ????CvMat?_eig?=?cvMat(n,?1,?CV_64F,?eig);??
  • ????//使用OpenCV開源庫中的矩陣操作求解矩陣特征值和特征向量??
  • ????cvEigenVV(&_m,?&_vec,?&_eig);??
  • ????*eigen?=?eig[0];??
  • ????for(int?i=0;?i<n;?i++)??
  • ????????q[i]?=?vec[i];??
  • ????delete[]?vec;??
  • ????delete[]?eig;??
  • }??
  • ??
  • //計算旋轉矩陣??
  • void?CalculateRotation(double?*q,?double?*R)??
  • {??
  • ????R[0]?=?q[0]*q[0]?+?q[1]*q[1]?-?q[2]*q[2]?-?q[3]*q[3];??
  • ????R[1]?=?2.0?*?(q[1]*q[2]?-?q[0]*q[3]);??
  • ????R[2]?=?2.0?*?(q[1]*q[3]?+?q[0]*q[2]);??
  • ????R[3]?=?2.0?*?(q[1]*q[2]?+?q[0]*q[3]);??
  • ????R[4]?=?q[0]*q[0]?-?q[1]*q[1]?+?q[2]*q[2]?-?q[3]*q[3];??
  • ????R[5]?=?2.0?*?(q[2]*q[3]?-?q[0]*q[1]);??
  • ????R[6]?=?2.0?*?(q[1]*q[3]?-?q[0]*q[2]);??
  • ????R[7]?=?2.0?*?(q[2]*q[3]?+?q[0]*q[1]);??
  • ????R[8]?=?q[0]*q[0]?-?q[1]*q[1]?-?q[2]*q[2]?+?q[3]*q[3];??
  • }??

  • 平移矩陣計算

    2.4中可以得到選擇矩陣的4元數表示,由于在"平行移動和旋轉的分離"中,我們將最優問題分解為:
  • 求使E最小的?
  • 求使?
  • 因此還需要通過中心點計算平移矩陣。
    [cpp]?view plaincopy
  • //通過特征向量計算旋轉矩陣R1和平移矩陣T1??
  • ????????CalculateRotation(qr,?R1);??
  • ????????double?mean_Q[3]={_mean_Q.x,_mean_Q.y,_mean_Q.z};??
  • ????????double?mean_P[3]={_mean_P.x,_mean_P.y,_mean_P.z};??
  • ????????double?meanT[3]={0,0,0};??
  • ????????int?nt=0;??
  • ????????for(itp=P.begin(),itq=Q.begin();itp!=P.end();itp++,itq++?){??
  • ????????????double?tmpP[3]={itp->x,itp->y,itp->z};??
  • ????????????double?tmpQ[3]={itq->x,itq->y,itq->z};??
  • ????????????double?tmpMul[3];??
  • ????????????MatrixMul(R1,?mean_P,?tmpMul,?3,?3,?3,?1);??
  • ????????????MatrixDiv(tmpQ,tmpMul,3,1);??
  • ????????????MatrixAdd(meanT,tmpQ,3,1);??
  • ????????????nt++;??
  • ????????}??
  • ????????for(int?i=0;?i<3;?i++)??
  • ????????????T1[i]?=?meanT[i]/(double)(nt);??

  • 一次旋轉計算得到的矩陣如下:
    效果在Geomagic Studio中顯示如圖:

    迭代最近點

    在初始匹配之后,所點集P`中所有點做平移變化,在比較點集合P`和Q`的匹配度,(或迭代次數)作為算法終止的條件。
    具體為對點集P中每個點,找Q中離他最近的點作為對應點。在某一步利用前一步得到的,求使下述函數最小的:
    這里,? [cpp]?view plaincopy
  • //計算誤差和d??
  • ????????d?=?0.0;??
  • ????????if(round==1){??
  • ????????????FindClosestPointSet(data,P,Q);??
  • ????????}??
  • ????????int?pcount=0;??
  • ????????for(itp?=?P.begin(),itq=Q.begin();itp!=P.end();?itp++,?itq++){??
  • ????????????double?sum?=?(itp->x?-?itq->x)*(itp->x?-?itq->x)?+?(itp->y?-?itq->y)*(itp->y?-?itq->y)???
  • ????????????????+?(itp->z?-?itq->z)*(itp->z?-?itq->z);??
  • ????????????d?+=?sum;??
  • ????????????pcount++;??
  • ????????}??
  • ????????d=d/(double)(pcount);??

  • 循環結束后能得到較好的匹配效果:

    封裝后的效果圖:

    from:?http://blog.csdn.net/xiaowei_cqu/article/details/8470376

    總結

    以上是生活随笔為你收集整理的迭代最近点算法 Iterative Closest Points的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚色中文字幕 | av影院在线播放 | 久久噜噜噜精品国产亚洲综合 | 爽爽影院免费观看 | 快播视频在线观看 | 少妇无码av无码专区在线观看 | 美女精品网站 | jizz日本18| av片在线免费观看 | 午夜性福利 | 午夜不卡福利 | 中国毛片基地 | 亚洲精品在线免费播放 | 日韩欧美大片在线观看 | 日韩av无码久久 | 人妖交videohd另类 | 天天舔天天爱 | 在线天堂6 | 日韩中文在线观看 | 亚洲综合在线五月 | 黄色一级a毛片 | 婷婷影音 | 亚洲午夜精品久久久久久浪潮 | 免费观看国产精品 | 国产黄色片免费看 | 欧美激情一区在线 | 天降女子在线观看 | 欧美日韩一区二区三区视频 | 国产一级视频在线观看 | 久久久精品人妻av一区二区三区 | n0659极腔濑亚美莉在线播放播放 | 一区二区三区观看 | 亚洲黄片一区二区三区 | 日韩在线不卡视频 | 久久精品牌麻豆国产大山 | 特级特黄刘亦菲aaa级 | 成人tiktok黄短视频 | 欧美另类z0z变态 | 久久瑟瑟 | 美女脱了内裤喂我喝尿视频 | 怡红院成人网 | 中文字幕高清在线播放 | 亚洲欧美一区二区三区四区 | 永久免费看黄网站 | 久久午夜网站 | 国产又粗又猛又大爽 | 亚洲成人免费网站 | 在办公室被c到呻吟的动态图 | 欧洲女同同性吃奶 | 日韩欧美国产精品综合嫩v 国产小毛片 | 野花av | 日本a级黄 | 美女网站免费视频 | 亚洲特黄视频 | 奇米狠狠干 | 精品人妻一区二区三区三区四区 | 51成人做爰www免费看网站 | 手机在线毛片 | 日韩毛片在线免费观看 | 久久国产精品毛片 | 激情婷婷色 | 日韩狠狠操 | 欧美日韩少妇精品 | 精品国产一区二区三区久久狼黑人 | 亚洲欧美一二三区 | 国产xxxxx视频 | 国产精品无码久久久久成人app | 久久视频精品 | 久操香蕉| 麻豆成人精品国产免费 | 妺妺窝人体色www在线下载 | 欧美专区在线播放 | 亚洲国产剧情在线观看 | 亚洲免费色视频 | 国产一区二区三区精品在线观看 | 天堂久久爱 | 日韩av中文字幕在线播放 | 国产免费激情视频 | 美女xx00 | 欧美乱强伦 | 手机在线中文字幕 | 国产女人精品视频 | 欧美大奶在线 | 91精品国产一区 | 91浏览器在线观看 | 国产精品午夜电影 | 中文字幕在线观看网站 | 成人字幕| 久草福利资源站 | 日本一区二区免费电影 | 少妇高潮喷水在线观看 | 韩日成人 | 韩日一级片 | 国产农村妇女精品久久久 | 久久看看 | 黄色在线观看网站 | 疯狂伦交| 国产三级视频网站 | 黄色一级免费大片 |