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

提交评论