Kinect實現簡單的三維重建_第1頁
Kinect實現簡單的三維重建_第2頁
Kinect實現簡單的三維重建_第3頁
Kinect實現簡單的三維重建_第4頁
Kinect實現簡單的三維重建_第5頁
已閱讀5頁,還剩30頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Kinect實現簡單的三維重建Kinect實現簡單的三維重建標簽:Kinect三維重建OpenFrameworks2013-03-2913:028418人閱讀評論(71)收藏舉報分類:Kinect(1)OpenFrameworks (3)版權聲明:本文為博主原創文章,未經博主允許不得轉載。Kinect想必大家已經很熟悉了,最近基于Kinect的創意應用更是呈井噴狀態啊!看到很多國外大牛用Kinect做三維重建,其中最著名的要數來自微軟研究院的KinectFusion了,可以看看下面這個視頻/show/7q2Sa__pa4-rWcAVtB3Xuw...html,或者/v_show/id_XNDcxOTg3MzUy.html。可惜KinectFusion是不開源的,不過PCL實現了一個差不多的開源版本,/。有興趣同時電腦配置高的朋友可以研究一下。最近比較閑,有一點手癢,想自己做一個三維重建,不過肯定不會像KinectFusion 那么強大,只是自己練練手、玩玩而已。代碼在最后有下載。 1.獲取Kinect深度圖:首先我使用微軟官方的 KinectSDK 來控制Kinect,三維繪圖我選用了 OpenFrameworks 。OpenFrameworks (以后簡稱OF)是一個開源的公共基礎庫,將很多常用的庫統一到了一起,比如OpenGL,OpenCV,Boost等等,而且有大量的第三方擴展庫,使用非常方便。具體可見 。在一切開始之前,我們需要對

OpenGL

和三維場景做一些設置:[cpp]viewplaincopyvoidtestApp::setup(){ //Dosomeenvironmentsettings. ofSetVerticalSync(true);ofSetWindowShape(640,480); ofBackground(0,0,0);//TurnondepthtestforOpenGL.glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glShadeModel(GL_SMOOTH); //Putacamerainthescene. m_camera.setDistance(3);m_camera.setNearClip(0.1f); //Turnonthelight.m_light.enable(); //Allocatememorytostorepointcloudandnormals.m_cloud_map.Resize(DEPTH_IMAGE_WIDTH,DEPTH_IMAGE_HEIGHT);m_normal_map.Resize(DEPTH_IMAGE_WIDTH,DEPTH_IMAGE_HEIGHT); //InitializeKinect.InitNui(); }OF是使用OpenGL進行繪圖的,所以可以直接使用OpenGL中的函數(以gl開頭),為了方便,OF還自己封裝了一些常用函數(以

of

開頭)。在上面代碼的最后有一個

InitNui()

函數,在那里面我們會對

Kinect

進行初始化:[cpp]viewplaincopyvoidtestApp::InitNui(){m_init_succeeded=false;m_nui=NULL;intcount=0;HRESULThr;hr=NuiGetSensorCount(&count);if(count<=0){cout<<"Nokinectsensorwasfound!!"<<endl;gotoFinal;}hr=NuiCreateSensorByIndex(0,&m_nui);if(FAILED(hr)){cout<<"CreateKinectDeviceFailed!!"<<endl;gotoFinal;}//Weonlyjustneeddepthdata.hr=m_nui->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH);if(FAILED(hr)){cout<<"InitializeKinectFailed!!"<<endl;gotoFinal;}//Resolutionof320x240isgoodenoughtoreconstructa3Dmodel.hr=m_nui->NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH,NUI_IMAGE_RESOLUTION_320x240,0,2,NULL,&m_depth_stream);if(FAILED(hr)){cout<<"OpenStreamsFailed!!"<<endl;gotoFinal;}m_init_succeeded=true;Final:if(FAILED(hr)){if(m_nui!=NULL){m_nui->NuiShutdown();m_nui->Release();m_nui=NULL;}}}接下來我們需要將每一幀的深度信息保存到我們自己的buffer中,專門寫一個函數來做這件事情:[cpp]viewplaincopybooltestApp::UpdateDepthFrame(){ if(!m_init_succeeded)returnfalse;HRESULThr; NUI_IMAGE_FRAMEimage_frame{0}; NUI_LOCKED_RECTlocked_rect={0};hr=

=m_nui->NuiImageStreamGetNextFrame(m_depth_stream,0,&image_frame);//Ifthere'snonewframe,wewillreturnimmediately.if(SUCCEEDED(hr)){hr=image_frame.pFrameTexture->LockRect(0,&locked_rect,NULL,0);if(SUCCEEDED(hr)){//Copydepthdatatoourownbuffer.memcpy(m_depth_buffer,locked_rect.pBits,locked_rect.size);image_frame.pFrameTexture->UnlockRect(0);}//Releaseframe.m_nui->NuiImageStreamReleaseFrame(m_depth_stream,&image_frame);}if(SUCCEEDED(hr))returntrue;returnfalse;}通過上面幾步,我們已經可以拿到一幅深度圖了。 在OF中,每一幀更新時, update()函數都會被調用,我們可以把所有需要適時更新的代碼都寫在里面:[cpp]viewplaincopyvoidtestApp::update(){

//GetanewdepthframefromKinect.

m_new_depth=UpdateDepthFrame();

if(m_new_depth){

Matdepth_frame=Mat(DEPTH_IMAGE_HEIGHT,DEPTH_IMAGE_WIDTH,CV_16UC1,m_depth_buffer); <spanstyle="white-space:pre"></span>imshow("DepthFrame",depth_frame); } }現在編譯并運行程序,我們可以看到通過 OpenCV 畫出來的深度圖:但你會發現,這樣的深度圖具有很多小孔和噪點,邊緣也不平滑。因此要對圖像進行濾波,為了使邊緣不被模糊掉,這里最好使用中值濾波。修改一下上面的 update()數,使用5x5的窗口進行中值濾波:[cpp]viewplaincopyvoidtestApp::update(){ //GetanewdepthframefromKinect. m_new_depth=UpdateDepthFrame();if(m_new_depth) { Matsmoothed_depth

函=V_16UC1,m_depth_buffer);medianBlur(smoothed_depth,smoothed_depth,5);imshow("DepthFrame",smoothed_depth); } }再次運行程序,得到的深度圖就變成下面這樣了,感覺好了很多!!2.通過深度圖得到點云:為了得到點云,我專門寫了一個類來完成這一操作。這個類不僅會根據深度圖計算點云,還會將得到的點云以矩陣的形式存放起來,矩陣中每一個元素代表一個點,同時對應深度圖中具有相同行列坐標的像素。而計算點云的方法, KinectSDK 自身有提供,即NuiTransformDepthImageToSkeleton() 函數,具體用法可看官方文檔。下面是這個類中生成點云的代碼:[cpp]viewplaincopyvoidPointCloudMap::Create(Mat&depth_image,USHORTmax_depth,floatscale){USHORT*depth_line=(USHORT*)depth_image.data;UINTstride=depth_image.step1();//m_pointsistheplacewherewestorethewholepointcloud.ofVec3f*points_line=m_points;Vector4vec;for(DWORDy=0;y<m_height;y++){for(DWORDx=0;x<m_width;x++){ofVec3fpoint(0);USHORTreal_depth=(depth_line[x]>>3);if(real_depth>=800&&real_depth<max_depth){//Foreachpixelinthedepthimage,wecalculateitsspacecoordinates.vec=NuiTransformDepthImageToSkeleton(x, y,depth_line[x] );//Savethepointwithascale. point.x=vec.x*scale; point.y=vec.y*scale;point.z=-vec.z*scale; }points_line[x]=point; } depth_line+=stride; points_line+=m_width; } }拿到點云后,我們可以考慮對點云進行三角化了。一提到三角化,很多人腦海中的第一印象是復雜、計算量大等等,我個人也是這樣。但是, Kinect返回的點云是結構化的,并不是無序點云,也就是說每一個點在空間中與其他點的相互關系我們是知道的,因此可以用一些簡單的方法來實現三角化,雖然這樣的三角化結果不是最優的,但是簡單快速,60fps毫無壓力。首先,我們的點云是存放在一個矩陣中的,而且矩陣的大小與深度圖完全一樣(行x列),因此我們將點云視為一幅圖,每一個像素存放的是點的空間坐標。我們可以像遍歷一般圖像的像素一樣遍歷點云圖,從而得到空間中某一點的所有相鄰點。然后,我們使用 OpenGL的連線功能,每畫一個點就與它之前的兩個點連成一個三角面。如下圖,點旁邊的序號是畫點的順序:這樣我們就可以一行一行的將點云三角化,但注意當一行結束時,要讓OpenGL停止連線,否則這一行最后的點會和下一行第一個點連在一起。以上過程我直接寫在了主程序的draw方法中,OF在每一幀調用完update方法后,就會調用draw方法:[cpp]viewplaincopyvoidtestApp::draw(){if(!m_init_succeeded)return;m_camera.begin();ofVec3f*points_line=m_cloud_map.m_points;ofVec3f*points_next_line=m_cloud_map.m_points+DEPTH_IMAGE_WIDTH;boolmesh_break=true;for(inty=0;y<m_cloud_map.m_height-1;y++){for(intx=0;x<m_cloud_map.m_width;x++){ofVec3f&space_point1=points_line[x];ofVec3f&space_point2=points_next_line[x];if(abs(space_point1.z)<=FLT_EPSILON*POINT_CLOUD_SCALE||abs(space_point2.z)<=FLT_EPSILON*POINT_CLOUD_SCALE){ if(!mesh_break){ //Ifthere'snopointhere,themeshshouldbreak. mesh_break=true; glEnd(); }continue; } if(mesh_break){ //Startconnectingpointstoformmesh.glBegin(GL_TRIANGLE_STRIP);mesh_break=false; }//Drawthepointandsetitsnormal.glColor3f(0.7,0.7,0.7);glVertex3f(space_point1.x,space_point1.y,space_point1.z);//Drawthepointbelowtheprioronetoformatriangle.glColor3f(0.7,0.7,0.7);glVertex3f(space_point2.x,space_point2.y,space_point2.z); } if(!mesh_break){ //Attheendoftheline,webreakthemesh.glEnd(); mesh_break=true; }points_line+=DEPTH_IMAGE_WIDTH;points_next_line+=DEPTH_IMAGE_WIDTH; }m_camera.end(); //Drawframerateforfun!ofSetColor(255);ofDrawBitmapString(ofToString(ofGetFrameRate()),10,20)}再次編譯并運行程序,在 OF的窗口中,我們會看到如下結果:怎么看起來是一張平面圖,一點 3D感覺都沒有,呵呵因為我們還沒有給頂點設置法向。OpenGL會根據頂點法線來計算該點的光照,如果沒有法線,光照是失效的,也就是我們看到的白茫茫一片。3.計算頂點法向法線的計算可以非常簡單,比如對每一個點,取和它相鄰的兩個點組成三角形,計算這個三角形的法向,即作為該點的法向。但這種方法太不精確了,而且其中一個點的坐標稍有變化,就會影響最終法線的方向,光照效果會很不穩定。我打算考慮一個點周圍所有的點,并使用最小二乘法來擬合一個最佳平面,這個平面的法向即為該點的法向。我們希望該點包括周圍的領點到這個平面的距離之平方和最小,即使下式最小:其中a,b,c是決定這個平面的參數,也就是這個平面的法矢量(a,b,c)。x,y,z是點的坐標。為了求出適合的abc值,分別對這三個變量求偏導:要求最小值,就要使下面三式成立:這樣我們就得到一個關于 a,b,c的三元一次線性方程組, 表示為矩陣形式即如下: 根據Cramer法則,這個方程組的解可以表示為:其中:,即系數矩陣的行列式計算這些行列式的值后, 就可解出 a,b,c。但是這里要注意,使用Cramer法則時,D不能為零,也就是說我們所期望的平面不能過原點。而過原點這種事情是很可能發生的,這時我們怎么辦呢?當平面過原點時,上面的三元一次方程組可簡化為一個齊次方程組:若上面系數矩陣的每一行所構成的向量共面但不共線,則a,b,c是有唯一解的,而其他情況下,只有零階或無窮多個解。后者在實際應用中一般是不會出現的。因此我們只考慮前一種情況。這種情況的解,就是三個行向量所在面的法線。因此我們將這三個行向量兩兩作叉積(外積),得到三個垂直于該面的法線,取模最大的一個作為我們的解。現在考慮什么點可以作為所求點的領點,由于點云是一幅圖,我們可以借鑒二維圖像濾波器的思想,將所求點周圍的8領域點作為領點。(圖畫得丑,還請諒解):但是我們的點是有深度的,所以還需對以上領域點判斷一下深度,只有某一點的深度與中心點的深度接近時,才能真正當做領點。現在還有最后一個問題,通過上面的方法算出來的法線方向是不定的(有可能是你想要的法向的反方向) ,因此我們還需要一個方法讓所有法線的朝向一致,我這里就簡單的選擇了朝向攝像機。將上面的所有方法寫在了一個類中,這個類根據點云圖計算法線,并像點云圖一樣將所有法線保存為一副法線圖。下面是計算法線和調整朝向的代碼:[cpp]viewplaincopyvoidNormalsMap::Create(PointCloudMap&point_cloud,floatmax_distance)//創建一副法線圖{if(point_cloud.m_height!=m_height||point_cloud.m_width!=m_width)throwexception("NormalsMaphasdifferentsizewidththePointCloudMap");ofVec3f*points_line0=point_cloud.m_points;ofVec3f*points_line1=points_line0+m_width;ofVec3f*points_line2=points_line1+m_width;ofVec3f*norms_line=m_normals+m_width;vector<ofVec3f>neighbors;inty_line0=0;inty_line1=y_line0+m_width;inty_line2=y_line1+m_width;for(inty=1;y<m_height-1;y++){for(intx=1;x<m_width-1;x++){neighbors.clear();norms_line[x]=ofVec3f(0);if(points_line1[x].z==0)continue;neighbors.push_back(points_line1[x]);//Addallneighborpointstothevector.if(IsNeighbor(points_line0[x-1],points_line1[x],max_distance)){ neighbors.push_back(points_line0[x-1]); } if(IsNeighbor(points_line0[x],points_line1[x],max_distance)){ neighbors.push_back(points_line0[x]); } if(IsNeighbor(points_line0[x+1],points_line1[x],max_distance)){ neighbors.push_back(points_line0[x+1]); } if(IsNeighbor(points_line1[x-1],points_line1[x],max_distance)){ neighbors.push_back(points_line1[x-1]); } if(IsNeighbor(points_line1[x+1],points_line1[x],max_distance)){ neighbors.push_back(points_line1[x+1]); } if(IsNeighbor(points_line2[x-1],points_line1[x],max_distance)){neighbors.push_back(points_line2[x-1]);}if(IsNeighbor(points_line2[x],points_line1[x],max_distance)){neighbors.push_back(points_line2[x]);}if(IsNeighbor(points_line2[x+1],points_line1[x],max_distance)){neighbors.push_back(points_line2[x+1]);}if(neighbors.size()<3)continue;//Toosmalltoidentifyaplane.norms_line[x]=EstimateNormal(neighbors);}points_line0+=m_width;points_line1+=m_width;points_line2+=m_width;norms_line+=m_width;y_line0+=m_width;y_line1+=m_width;y_line2+=m_width;}}inlineboolNormalsMap::IsNeighbor(ofVec3f&dst,ofVec3f&ori,floatmax_distance)//判斷是否是領點{if(abs(dst.z-ori.z)<max_distance)returntrue;returnfalse;}ofVec3fNormalsMap::EstimateNormal(vector<ofVec3f>&points)//使用最小二乘法計算法線{ofVec3fnormal(0);floatx=0,y=0,z=0;floatx2=0,y2=0,z2=0;floatxy=0,xz=0,yz=0;for(inti=0;i<points.size();i++){floatcx=points[i].x;floatcy=points[i].y;floatcz=points[i].z;x+=cx;y+=cy;z+=cz;x2+=cx*cx;y2+=cy*cy;z2+=cz*cz;xy+=cx*cy;xz+=cx*cz;yz+=cy*cz;}floatD=x2*y2*z2+2*xy*xz*yz-x2*yz*yz-y2*xz*xz-z2*xy*xy;if(abs(D)>=FLT_EPSILON){//Useleastsquarestechniquetogetthebestnormal.floatDa=x*(yz*yz-y2*z2)-y*(yz*xz-z2*xy)+z*(y2*xz-xy*yz); floatDb=x2*(z*yz-y*z2)-xy*(z*xz-x*z2)+xz*(y*xz-x*yz); floatDc=x2*(y*yz-z*y2)-xy*(x*yz-z*xy)+xz*(x*y2-y*xy);normal.x=Da/D; normal.y=Db/D;normal.z=Dc/D; normal.normalize(); }else { /*D==0,itmeanssomeaxes(x,yorz)areonthenormalplane. Weneedanotherwaytocalculatenormalvector.*/ ofVec3frow0(x2,xy,xz); ofVec3frow1(xy,y2,yz);ofVec3frow2(xz,yz,z2); ofVec3fvec1=row0.getCrossed(row1); ofVec3fvec2=row0.getCrossed(row2); ofVec3fvec3=row1.getCrossed(row2); floatlen1=vec1.lengthSquared(); floatlen2=vec2.lengthSquared(); floatlen3=vec3.lengthSquared(); if(len1>=len2&&len1>=len3) normal=vec1/sqrt(len1); elseif(len2>=len1&&len2>=len3) normal=vec2/sqrt(len2); else normal=vec3/sqrt(len3); } returnnormal; }voidNormalsMap::FlipNormalsToVector(ofVec3fmain_vector)//調整法線朝向,是其全部指向 main_vector 方向 { ofVec3f*normal=m_normals; for(inti=0;i<m_width*m_height;i++) { if((*normal).dot(main_vector)<0) (*normal)*=-1; normal++; } }全部放在一起:將以上全部放在一起,并修改一下我們的 draw函數,以使其設置頂點的法向:[cpp]viewplaincopyvoidtestApp::draw(){if(!m_init_succeeded)return;m_camera.begin();ofVec3f*points_line=m_cloud_map.m_points;ofVec3f*points_next_line=m_cloud_map.m_points+DEPTH_IMAGE_WIDTH;ofVec3f*normals_line=m_normal_map.m_normals;boolmesh_break=true;for(inty=0;y<m_cloud_map.m_height-1;y++){for(intx=0;x<m_cloud_map.m_width;x++){ofVec3f&space_point1=points_line[x];ofVec3f&space_point2=points_next_line[x];if(abs(space_point1.z)<=FLT_EPSILON*POINT_CLOUD_SCALE||abs(space_point2.z)<=FLT_EPSILON*POINT_CLOUD_SCALE){if(!mesh_break){//Ifthere'snopointhere,themeshshouldbreak.mesh_break=true;glEnd();}continue;}if(mesh_break){//Startconnectingpointstoformmesh.glBegin(GL_TRIANGLE_STRIP);mesh_break=false; }//Drawthepointandsetitsnormal.glColor3f(0.8,0.8,0.8);glNormal3f(normals_line[x].x,normals_line[x].y,normals_line[x].z);glVertex3f(space_point1.x,space_point1.y,space_point1.z);//Drawthepointbelowtheprioronetoformatriangle.glColor3f(0.8,0.8,0.8);glVertex3f(space_point2.x,space_point2.y,space_point2.z); } if(!mesh_break){ //Webreakthemeshattheendoftheline,.glEnd(); mesh_break=true; }points_line+=DEPTH_IMAGE_WIDTH;points_next_line+=DEPTH_IMAGE_WIDTH;normals_line+=DEPTH_IMAGE_WIDTH; }m_camera.end(); //Drawframerateforfun!ofSetColor(255);ofDrawBitmapString(ofToString(ofGetFrameRate()),10,20)}最后編譯運行,我們的目標就達到了! !!!作為一個自娛自樂的小程序,感覺還不錯吧!!!注意看左上角的幀率, 60fps妥妥的。小結:做這個完全是為了學習和興趣,不要說我是重復造輪子啊。寫這個程序復習了很多線性代數的知識,溫故而知新,感覺還是很有收獲的。最后的效果還可以改進,最大的改進點就是三角化的方法,以后發現快速且效果好的三角化方法再和大家分享。最后給出代碼的下載地址

點擊打開鏈接代碼在

Windows7ultimate

,OpenFrameworks0073

,KinectSDK1.7

下編譯通過。編譯有問題的可以看看下面的評論。頂

29踩

0我的同類文章 Kinect(1)OpenFrameworks (3)·Kinect深度圖與攝像頭 RGB的標定與配主題推薦kinect函數colorsdk三維開源微軟opencv猜你在找OpenGLES2.0

基礎

OpenGLES2.0

中級篇OpenSceneGraph

QOpenglWidget

結合

擁抱開源:Github

使用指南基于

J2EE

實現

Webservice

項目實戰

ATM查看評論35樓

u0102077422015-08-0715:10

發表

[回復]

我有兩個問題想問問,您這個程序計算法向量時邊緣一圈法向量的值全是0,還有最終的 draw()函數中的最后一行的點云都沒有法向量,這些不會影響重建的效果嗎?34樓liuyongqiang952015-06-0821:21發表[回復]博主你好,我編譯你的工程遇到這個問題LINK:fatalerrorLNK1104:無法打開文件“PocoFoundationd.lib”,這是怎么回事Re:啊hualitlc2015-08-0316:39 發表 [回復]回復liuyongqiang95 :這個單獨編譯的時候我也遇到了,我猜是工程放的位置不對,你最好直接用 openFramework 的projectGenerator 生成模板,把代碼加進去,然后再編譯就沒問題了。另外一定要注意vs的版本問題,和你的openFramework是否匹配。33樓

Bogart20152015-06-0607:54

發表

[回復]

博主,求教kinect2.0

的數據提取,用的是哪個函數啊

32樓

hust_twj2015-04-0113:13

發表

[回復

]

學長,您好~給您私信了,不知看到沒有哦

31樓

dnf200938452015-01-0722:38

發表[回復]

樓主,小白也想做想關方面東西,希望能加下您

qq,遇到問題時可以向您請教!

我的

qq:51680636630

樓FightForProgrammer2014-12-1717:27 發表 [回復]lz加個朋友啊。我是武大的,我也在研究這方面的技術。已通過私信聯系你啦。望回復 ~29樓xiah_sunny2014-12-0315:53

發表

[回復]

原來還需要一個

kinect

硬件啊

...傷不起28樓

u0104287882014-08-3116:41

發表

[回復]

博主你好,我想問下程序運行后,三維重建顯示的圖像有一定的深度范圍,即在一定的深度范圍內才能顯示最終的那幅圖,超過一定的距離就看不到了,想問下這個深度范圍有辦法調整嗎?Re:adiaa2014-08-3119:14 發表 [回復]回復u010428788:voidPointCloudMap::Create(Mat&depth_image,USHORTmax_depth,floatscale)里面的max_depth 控制最大有效深度。請問你運行這個程序有達到 60FPS嗎?Re:waner12312014-09-0209:52 發表 [回復]回復u013591471:感謝你的提示~^_^Re:waner12312014-09-0209:43 發表 [回復]回復u013591471:沒有那么高的運行速度,有的時候只是個位數~Re:adiaa2014-09-0217:17 發表 [回復]回復waner1231:不謝.另外我發現一個小問題對程序運行速度影響很大,就是用VS的時候編譯模式要選RELEASE而不要用DEBUG.我這邊DEBUG模式下兩幀左右,RELEASE模式下六七十幀每秒.好像DEBUG會比RELEASE慢幾乎是公認的常識了,不過我是新手,剛剛學到.希望對你有幫助 .Re:xiah_sunny2014-12-0315:54

發表

[回復]

回復u013591471

:vs

用的不行啊

哈哈

debug

模式包含了很多debug

信息

代碼是沒有優化過的

所以生成的

bin

很慢

發布的話一定要用 releaseRe:u0104287882014-09-1216:49發表 [回復]回復u013591471:恩恩,還真是,灰常感謝,我是純新手啊

~27

adiaa2014-08-3012:33

發表

[回復]因為

openframeworks

一直配置不好,而程序中要求

of

必不可少的也就是 ofVec3f 這個類的相關運算。所以我用Vector4 這個類替代了 ofVec3f,自已定義了 ofVec3f 里面的相關運算,其它諸如 opencv、opengl 我都配置好了。對博主程序的改動包括更換 ofVec3f 類以及加入了一些opengl 的設置。 另外硬件上我這里是 2.5GHz的雙核 i5cpu。但是跑這個程序十幀都不到,程序的 cpu占用已經達到50%,也就是接近單核滿負荷運行了。現象就是這樣,想向博主請教的是1.博主CPU主頻多少?2.OpenFrameworks 是否有做過某些優化?還請博主幫忙想想這么卡到底是什么原因。 Re: 昊言 2015-04-0319:51發表 [回復]回復u013591471:請問你有這個軟件么。。OpenFrameworks0073 。。。麻煩您發一份到我的郵箱上來吧,,謝謝了您了! 378420393@Re:adiaa2014-09-0217:23 發表 [回復]回復u013591471:已經解決.VS下把DEBUG改為REALEASE,60FPS 沒問題.26樓adiaa2014-08-3012:33 發表 [回復]因為openframeworks一直配置不好,而程序中要求 of必不可少的也就是ofVec3f 這個類的相關運算。所以我用 Vector4 這個類替代了ofVec3f,自已定義了ofVec3f里面的相關運算,其它諸如opencv、opengl我都配置好了。對博主程序的改動包括更換ofVec3f類以及加入了一些opengl的設置。另外硬件上我這里是2.5GHz的雙核i5cpu。但是跑這個程序十幀都不到,程序的cpu占用已經達到50%,也就是接近單核滿負荷運行了。現象就是這樣,想向博主請教的是1.博主CPU 主頻多少?2.OpenFrameworks 是否有做過某些優化?還請博主幫忙想想這么卡到底是什么原因。

25樓

insaneguy2014-08-0811:19

發表

[回復

]

好文章!謝謝博主分享!

24樓

zwy1archer2014-07-0220:32

發表

[回復

]

博主,你好,請問這個問題錯誤 1errorLNK1104: 無法打開文件“PocoFoundationd.lib ”C:\openframework\apps\myApps\Reconstruction3D\Reconstruction3D\LINKReconstruction3D ,是為何?我發現POCO的lib文件下沒有PocoFoundationd.lib 啊23樓飄香一劍 2014-06-2016:48發表 [回復]博主,你好!memcpy(m_depth_buffer,locked_rect.pBits,locked_rect.size);然后我用cvDepth=cv::Mat(dlg->m_cDepthHeight,dlg->m_cDepthWidth,CV_16UC1,dlg->m_Depth_buffer);imwrite(fileDepth,cvDepth);保存后,怎么顯示的圖片是 二值化圖片呢? 22樓WWLTH2014-06-1618:05 發表 [回復]樓主同求代碼啊 回去學習一下QQ499293591 謝謝啦哈 Re:aipiano2014-06-1620:43發表 [回復]回復WWLTH:鏈接已更新 Re:WWLTH2014-06-1705:23 發表 [回復]回復AIchipmunk:謝謝啦 不過這個未找到導入的項目“C: OpenCV_Dps”。請確認 Import>聲明中的路徑正確,且磁盤上存在該文件到底怎么解決啊我已經下載了 opencv了也在vs里配置過了,但怎么配置到項目里呢?還有就是電腦里是

sdk1.8

是不也要在

XML

文檔里修改路徑呢?

21樓飄香一劍

2014-06-1216:38

發表[回復]

博主,你好!能不能發一份你的代碼呢?

QQ:478737422先謝過了哈

~Re:aipiano2014-06-1620:42

發表

[回復]

回復scliu12345:鏈接已更新Re:飄香一劍2014-06-1708:42發表 [回復]回復AIchipmunk:先謝過了哈~20樓飄香一劍2014-06-0914:46發表[回復]博主,你好~給的鏈接現在下載不了呢?然后問一下,獲取到的深度圖顯示的時候為什么會有黑邊呢? 19樓ilovejzw2014-06-0422:25發表 [回復]樓主好,你能把 code發我一份嗎,我郵箱是447613192@18 樓huadong722014-05-2812:54發表 [回復]樓主,不是很明白結構化點云位置關系已知,這種位置關系存在哪里的,直接一排排連接點就可以了?Re:aipiano2014-05-2814:34 發表 [回復]回復huad72:由于點云是從深度圖得來的,點云中的點在順序上和深度圖的像素一一對應,所以順序結構是已知的,因此,就可以簡單的一行一行進行三角化了,不需要領域搜索等復雜技術。17樓zpzxd2014-04-2415:30 發表 [回復]博主,你好,我下載了你的代碼不知道怎么運行啊?那個 openframeworks我是第一次接觸,好多地方都不會,希望樓主詳細介紹一下, ,我的qq是1125681496,希望能和樓主私聊。 Re:飄香一劍2014-06-1108:29 發表 [回復]回復zpzxd:你好~能不能把博主的代碼發一份呢?扣扣: 478737422麻煩了哈~16樓睿睿咩 2014-04-0621:40 發表 [回復]樓主您好,我在用點云做小車控制,試圖把生成的點云數據實時地保存成 txt文檔,但是嘗試了很久沒有結果,怎么能刷新一幀保存一幀數據,并且是連續保存呢 ?樓主能不能幫忙看看怎么寫,我是新手研究了很久了一直沒有進展。謝謝樓主。15樓睿睿咩 2014-03-2817:10 發表 [回復]1>c:\openframework\libs\openframeworks\types\oftypes.h(188):errorC2061: 語法錯誤:標識符“_Dynamic_tag”1>c:\openframework\libs\openframeworks\types\oftypes.h(203):參見對正在編譯的類 模板 實例化“ofPtr<T> ”的引用1>c:\openframework\libs\openframeworks\types\oftypes.h(188):errorC2535:

“ofPtr<T>::ofPtr(constofPtr<Tp1>&)

已”經:定義或聲明成員函數1>c:\openframework\libs\openframeworks\types\oftypes.h(166):參見“ofPtr<T>::ofPtr ”的聲明1>c:\openframework\libs\openframeworks\types\oftypes.h(188):errorC2039: “_Dynamic_tag不是”“:std”的成員1>c:\openframework\libs\openframeworks\utils\oflog.h(101):參見對正在編譯的類 模板 實例化“ofPtr<T> ”的引用謝謝樓主,這些問題怎么解決呢 Re:aipiano2014-03-2817:31發表 [回復]回復u014416715:沒遇到過這樣的問題。可能是OF版本與VS版本不匹配,或項目沒有放對位置。14樓baidongfang1232014-03-1209:06 發表 [回復]tApp.cpp1>c:\openframework\libs\openframeworks\types\oftypes.h(188):errorC2061: 語法錯誤:標識符“_Dynamic_tag”1>c:\openframework\libs\openframeworks\types\oftypes.h(203):參見對正在編譯的類 模板 實例化“ofPtr<T> ”的引用1>c:\openframework\libs\openframeworks\types\oftypes.h(188):errorC2535:

“ofPtr<T>::ofPtr(constofPtr<Tp1>&)

已”經:定義或聲明成員函數1>c:\openframework\libs\openframeworks\types\oftypes.h(166):參見“ofPtr<T>::ofPtr ”的聲明1>c:\openframework\libs\openframeworks\types\oftypes.h(188):errorC2039: “_Dynamic_tag不是”“:std”的成員1>c:\openframework\libs\openframeworks\utils\oflog.h(101):參見對正在編譯的類 模板 實例化“ofPtr<T> ”的引用請問遇到了這樣的問題怎么解決呢, 我用的VS2010 的版本,謝謝樓主!13樓畫圈畫圈畫圈 2014-03-0423:18 發表 [回復]博主你好,我剛剛接觸這方面的知識,很多不懂不好意思,要問一個很弱智的問題。為什么我在網下下載到的OPENFRAMEWORKS 庫里面就只有。 .cpp和.h文件呢?電腦上還需要有 openGL是么?Re:aipiano2014-03-0511:56發表 [回復]回復q122351298:Openframeworks 是要自己編譯的,而且本身就以 OpenGL為基礎的,不需要做額外的配置了,直接編譯就行。 Re:畫圈畫圈畫圈2014-03-1523:47 發表 [回復]回復AIchipmunk:那電腦上要再安裝

OPENGL

是么

Re:aipiano2014-03-1617:50

發表[回復]

回復

q122351298

:不需要

12樓

dashenlinshitou2014-01-2420:07 發表 [回復]博主好! 請問 通過深度圖取得點云時 point.z 為什么要取負值?//Savethepointwithascale.point.x=vec.x*scale;point.y=vec.y*scale;point.z=-vec.z*scale;Re:aipiano2014-01-2420:31 發表[回復]回復u012404749:OpenFrameworks 中的攝像機默認是從原點看向 Z的負方向的,我偷懶,所以直接將點云畫在負軸區域了。11樓calvin4222013-12-1815:50 發表 [回復]正好需要,下載看看10樓songmaoxuan2013-12-0915:32發表[回復]求助樓主大神用opengl編寫一個畫出雙曲拋物面z=xy的程序,用曲面體的離散法實現消隱。愚剛學計算機圖形學,老師布置了一個任務,做不了啊9樓lz04992013-12-0713:38 發表 [回復]博主,你好!我想問問,你做的這個三維重建,得到的點云數據你是否進行了Kinect的標定?Re:aipiano2013-12-0714:11 發表 [回復]回復lz0499:沒有自己進行標定,我直接使用深度圖,然后通過SDK里面的MapDepthCoordinateToSkeleton 方法(好像是這個名字吧),得到空間當中的點云坐標。Re:lz04992013-12-0714:50發表[回復]回復AIchipmunk:謝謝你的及時回復。還有個問題,我看你是Kinect關于骨骼的一個函數,是否意味著你的這個程序只能對人體進行三維重建,而對非人體的物體對象不能進行三維重建,或者說要是對物體進行三維重建的話得用另外的方法啦? Re:aipiano2013-12-0716:05發表[回復]回復lz0499:對任何物體都可以。函數名里面的Skeleton指的是骨架所在的空間,也就是原點在Kinect,Y軸向上,X軸向左,Z軸向前的空間。Re:lz04992013-12-0721:22 發表 [回復]回復AIchipmunk:好的,理解啦!此外,我們是否能通過 OpenGL添加上紋理信息呢?這樣的話,三維顯示效果更佳! Re:aipiano2013-12-0811:20發表[回復]回復lz0499:可以8樓Day_plot2013-12-0112:47發表[回復]lz,我跑你的程序只有1.54fps,這差距也太大了啊7樓CSD95272013-11-0410:03發表 [回復]樓主,你好!在函數 voidPointCloudMap::Create(Mat&depth_image,USHORTmax_depth,floatscale)中Vector4vec得到的是坐標系在Kinect上的骨骼坐標系嗎?scale因子是什么作用呢?是為了轉為繪圖顯示時的坐標嗎?如果我只需要實際的坐標信息是不是就不需要縮放 scale了呢?6樓wang1987yi2013-10-3111:40 發表 [回復]博主你好,請問你是

vs2010

還是

vs2012

版本的呢?

OpenFrameworks

庫怎么配置的呢?謝謝

Re:aipiano2013-10-3117:44

發表[回復]

回復

wang1987yi

:我用的是

VS2012

,現在OpenFrameworks 支持VS2012了,幾乎不需要配置, 看看官網上面的教程就會了。 Re:wang1987yi2013-11-0110:38發表 [回復]回復AIchipmunk:謝謝博主!我的是在vs2010平臺,可以編譯的嗎?還請問是不是需要安裝openGL?能和博主您私聊的嗎?謝謝了! Re:aipiano2013-11-0300:00發表 [回復]回復wang1987yi:OF也支持VS2010的。不需要單獨配置 OpenGL,OF都幫你做好一切了。 Re:wang1987yi2013-11-0419:54

發表

[回復]

回復AIchipmunk

:博主,你好!找你前面說的“把

nuisensor.h

這個文件里面的interface關鍵字前全部加雙下劃線。。。”后運行還是出現以下三個報錯:1>c:\programfiles\microsoftsdks\kinect\v1.7\inc\nuisensor.h(411):errorC2143:語法錯誤:缺少“;”(在“*”)的前面1>c:\programfiles\microsoftsdks\kinect\v1.7\inc\nuisensor.h(411):errorC4430:缺少類型說明符-假定為int。注意:C+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論