生活随笔
收集整理的這篇文章主要介紹了
VTK:VTK嵌入MFC成功
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????????? VTK作為醫學顯示庫,得到較多使用。作為較為上層的設計,對OpenGL進行了封裝,并且有Windows、Linux、安卓等開發版本,可移植性較強。
????????? 不過VES暫時沒有編譯成功。
????????? 以下是嵌入MFC-IDC代碼,有個缺陷,暫時沒能修改。
代碼:
showPointsInVtk(short* &depthImage, int HeightDepth, int WidthDepth,int IDCX)
{//double arr[3];vtkPoints * points = vtkPoints::New();int n = 0; int idx = 0; int Length = 3 * HeightDepth*WidthDepth;//首先讀取點云數據到點表points同時指定點對應的id:for (int i = 0; i < HeightDepth; ++i){int LastPixel = i* WidthDepth;for (int j = 0; j < WidthDepth; ++j){int y = depthImage[3 * (j + LastPixel)];int x = depthImage[3 * (j + LastPixel) +1];int z = depthImage[3 * (j + LastPixel) +2];points->InsertPoint(n, x, y, z);n++;}}printf("%d\n", n);vtkPolyVertex * polyvertex = vtkPolyVertex::New();polyvertex->GetPointIds()->SetNumberOfIds(n);int i = 0; //建立拓撲關系for (i = 0; i < n; i++){polyvertex->GetPointIds()->SetId(i, i);}vtkUnstructuredGrid * grid = vtkUnstructuredGrid::New();grid->SetPoints(points);grid->InsertNextCell(polyvertex->GetCellType(),polyvertex->GetPointIds());vtkDataSetMapper *map1 = vtkDataSetMapper::New();map1->SetInputData(grid);vtkActor *actor1 = vtkActor::New();actor1->SetMapper(map1);actor1->GetProperty()->SetColor(0.194, 0.562, 0.75);vtkRenderer *ren = vtkRenderer::New();ren->AddActor(actor1);ren->SetBackground(0, 0, 0);//renWin和iren分別是vtkWin32OpenGLRenderWindow, vtkWin32RenderWindowInteractorvtkWin32RenderWindowInteractor *iren = vtkWin32RenderWindowInteractor::New();vtkWin32OpenGLRenderWindow *win = vtkWin32OpenGLRenderWindow::New();vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();win->Clean();win->SetSize(480, 360);win->BordersOn();win->AddRenderer(ren);iren->SetRenderWindow(win);iren->SetInteractorStyle(style);//搭上一個顯示用的MFC窗口框架。CWnd *viewer_Wnd;viewer_Wnd = this->GetDlgItem(IDCX); HWND hWnd = (HWND)viewer_Wnd->m_hWnd;HWND hParent = ::GetParent(hWnd);//::ShowWindow(hParent, SW_HIDE);::ShowWindow(hParent, 1);win->SetParentId(this->m_hWnd);iren->Start();map1->Delete();grid->Delete();actor1->Delete();polyvertex->Delete();ren->Delete();win->Delete();iren->Delete();return 1;
}
顯示效果:
?
?注意事項:
使用
iren->Start();導致renter不能更行,修改為以下代碼可以完成動態更新:
把?render和win放在初始對話框初始化,其他代碼修改為:
this->win->Render();
//在 對話框初始化時初始化Render
inline int Ciisu2vrMfcsDlg::showPointsInVtkG(short* &depthImage, int HeightDepth, int WidthDepth, int IDCX)
{//double arr[3];vtkPoints * points = vtkPoints::New();int n = 0; int idx = 0; int Length = 3 * HeightDepth*WidthDepth;//首先讀取點云數據到點表points同時指定點對應的id:for (int i = 0; i < HeightDepth; ++i){int LastPixel = i* WidthDepth;for (int j = 0; j < WidthDepth; ++j){int y = depthImage[3 * (j + LastPixel)];int x = depthImage[3 * (j + LastPixel) + 1];int z = depthImage[3 * (j + LastPixel) + 2];//這里壓縮四倍是比較好的方法//int z = (depthImage[(j + LastPixel)]) ;points->InsertPoint(n, x, y, z);n++;}}vtkPolyVertex * polyvertex = vtkPolyVertex::New();polyvertex->GetPointIds()->SetNumberOfIds(n);int i = 0;//建立拓撲關系for (i = 0; i < n; i++){polyvertex->GetPointIds()->SetId(i, i);}vtkUnstructuredGrid * grid = vtkUnstructuredGrid::New();grid->SetPoints(points);grid->InsertNextCell(polyvertex->GetCellType(),polyvertex->GetPointIds() );vtkDataSetMapper *map = vtkDataSetMapper::New();map->SetInputData(grid);vtkActor *actorG = vtkActor::New();actorG->SetMapper(map);actorG->GetProperty()->SetColor(0.194, 0.562, 0.75);vtkRenderer *ren = vtkRenderer::New();ren->AddActor(actorG);ren->SetBackground(0.13, 0.40, 0.15);this->win->AddRenderer(ren);this->win->Render();//自己寫一個重載-更新函數!map->Delete();grid->Delete();actorG->Delete();polyvertex->Delete();return 1;
}
后記:
??????? 效果還不錯,就是和OpenCV結合時有點麻煩,命名空間沖突。
總結
以上是生活随笔為你收集整理的VTK:VTK嵌入MFC成功的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。