通過 TouchDesigner 提取 Kinect2 的點雲信息


在TouchDesigner(之后稱為TD)中提取Kinect2的點雲這個效果在很早之前就已經實現了。TD的靈活之處不再贅述,如果需要將大量點雲(准確來講這個案例有1920*1080=2,073,600個點)超過2M的點的深度和顏色渲染出來並到達每秒超過30幀的速度,目前我想到的方法有且只有使用TD中的GLSL shader。GLSL的優勢就是在於直接使用GUP並行處理所有的點,所以在這種應用中速度要比CUP快上成千上萬倍。大概方向講清楚了,先上個圖看看效果。

 

從kinect方面我們需要兩個圖像信息,第一個是深度圖,之后我們會使用這個深度圖的顏色值來確定每個點的位置。另一個是顏色圖也就是我們傳統的視頻畫面,使用這個視頻信息之后我們把每個像素點的顏色值傳遞到每個點上,讓點雲不僅有深度值也有顏色值。

在GLSL中我們同時需要使用vertex shader和fragmentshader,在vertex shader中把點雲的深度位置確定好,再傳遞到fragment shader中把視頻的顏色信息給點雲。

 

vertex shader中讀取深度圖中每個像素的深度信息,將其傳給已經創建好的grid的每一個點上,也就是說事先我們已經做好了一個1920*1080的grid。

//in vertex shader

uniform sampler2D sPointTex; uniform sampler2D sColorTex; uniform vec4 uPointRes;
out Vertex { vec4 color; }vVert; void main() { int id = gl_VertexID; vec2 posUV; posUV.t = id / int(uPointRes.p); posUV.s = id - (posUV.t * int(uPointRes.q)); posUV.t += 1; posUV *= uPointRes.st; vec4 newPos = texture(sPointTex, posUV); newPos.z *= -1; newPos.z += 2; vVert.color = texture(sColorTex, posUV); vec4 worldSpaceVert =TDDeform(newPos); vec4 camSpaceVert = uTDMat.cam * worldSpaceVert;
//if(newPos.z < -0){ // gl_PointSize = 1; //}else{ // gl_PointSize = 0.0; //} gl_Position = TDCamToProj(camSpaceVert); }

sPointTex 是深度貼圖的采樣,sColorTex 是顏色信息的采樣。通過grid上每個點的ID來確定該點是在哪一行哪一列,讓后確定該點在畫幅中uv位置,使用這個uv位置從采樣中拿到深度信息和顏色信息,深度信息直接應用到點的z軸上,顏色信息記錄下來並傳遞給fragment shader。 注釋掉的這段是應用在把背景信息隔離掉的。

在fragment shader中就容易多了,應為我們已經知道顏色值了,只需要賦值給最終的顏色變量上就好了。

//in fragment shader
in
Vertex { vec4 color; }vVert; // Output variable for the color layout(location = 0) out vec4 fragColor; void main() { fragColor[0] = vVert.color;
for (int i = 1; i < TD_NUM_COLOR_BUFFERS; i++) { fragColor[i] = vec4(0.0); } }
 
         
         
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM