基於VTK的任意平面切割

2021-06-19 06:48:33 字數 4799 閱讀 1175

// 切割介紹

// 對於乙個模型的切割需要怎麼辦呢,想想切西瓜就知道,首先需要有乙個模型、然後有乙個切割平面

// 接著對於每個切割操作來更新模型,這樣就可以得到切割的效果了

// 影象本身是與原始影象成某軸對稱因此不能在原圖中找中心點

waitkey();

#endif

/**做平滑處理**/

vtksmartpointersmooth = vtksmoothpolydatafilter::new();

smooth->setinput( skinextractor->getoutput());

smooth->setnumberofiterations( 100 );

//重新計算法向量

vtksmartpointerskinnormals =

vtksmartpointer::new();

skinnormals->setinputconnection(smooth->getoutputport());

skinnormals->setfeatureangle(60.0);

vtksmartpointerskinstripper = //create ******** strips and/or poly-lines 為了更快的顯示速度

vtksmartpointer::new();

skinstripper->setinputconnection(skinnormals->getoutputport());

vtksmartpointerskin =

vtksmartpointer::new();

vtksmartpointeroutlinedata =

vtksmartpointer::new();

outlinedata->setinputconnection(dicomreader->getoutputport());

mapoutline->setinputconnection(outlinedata->getoutputport());

vtksmartpointeroutline =

vtksmartpointer::new();

outline->getproperty()->setcolor(0, 0, 0);

vtksmartpointeracamera =

vtksmartpointer::new();

acamera->setviewup (0, 0, -1);

acamera->setposition (0, 1, 0);

acamera->setfocalpoint (0, 0, 0);

acamera->computeviewplanenormal();

acamera->azimuth(30.0);

acamera->elevation(30.0);

acamera->dolly(1.5);

arenderer->addactor(outline);

arenderer->addactor(skin);

arenderer->setactivecamera(acamera);

arenderer->resetcamera ();

arenderer->setbackground(.2, .3, .4);

arenderer->resetcameraclippingrange ();

renwin->setsize(640, 480);

vtksmartpointerstyle =

vtksmartpointer::new();

iren->setinteractorstyle( style );

/設定截面

vtksmartpointercliper = vtkclippolydata::new();

cliper->setinput(skinstripper->getoutput());

// 此平面box可以通過右鍵來進行放大縮小處理(只有當滑鼠控制區域只有切割體才單一有效)

vtksmartpointerimplicitplanewidget = vtkimplicitplanewidget::new();

implicitplanewidget->setinteractor(iren);

implicitplanewidget->setplacefactor(1.25);

//initially position the widget

implicitplanewidget->setinput(skinstripper->getoutput());

implicitplanewidget->placewidget();

//render2

vtksmartpointerconeskinactor = vtkactor::new();

vtksmartpointerrrenderer =

vtksmartpointer::new();

rrenderer->setbackground( 0.2, 0.3, 0.5 );

rrenderer->setviewport(0.5, 0.0, 1.0, 1.0);

rrenderer->addactor(coneskinactor);

vtksmartpointerpcall = buildvtkwidgetcall::new();

pcall->setactor(coneskinactor);

pcall->setcliper(cliper);

renwin->addrenderer(rrenderer);

///implicitplanewidget->addobserver(vtkcommand::endinteractionevent, pcall);

implicitplanewidget->on();

// render

renwin->render();

// initialize the event loop and then start it.

iren->initialize();

iren->start();

}

閾值的切割 基於opencv

一 基於固定閾值的分割 全域性 1 基本定義 固定閾值的分割是 最為簡單的一種影象分割方法,即選取乙個全域性閾值,然後就把整幅影象分成了非黑即白的二值影象。2 關鍵函式 ret,th cv2.threshold img,127,255,cv2.thresh binary ret return val...

基於OpenCV的任意方向投影

目前在opencv中,有reduce函式可以進行水平或者垂直方向的投影。c voidreduce inputarraymtx,outputarrayvec,intdim,intreduceop,intdtype 1 parameters reduction operation that could ...

求解任意多邊形的面積(平面內)

平面內多邊形的計算,也就是平面座標系內多邊形的計算,已知各定點座標,有順序的,逆時針或者順時針。根據給出座標求面積。這裡介紹一種比較簡單的方法,用積分求多邊形面積。對每條邊對x軸積分之和即可得出面積。注意如果按順時針方向求積分和得出的是面積,逆時針為面積的相反數。不明白的可以自己畫圖驗證,原理很簡單...