2014-07-02 43 views
1

我需要一個基本(我猜)C++問題的幫助。 我想使用C++函數來簡化ITK管道,但我不知道如何傳遞參數並獲取輸出。 我見過ITK的例子它是如何可以從主()函數(在這種情況下,如:http://www.itk.org/Wiki/ITK/Examples/ImageProcessing/LabelGeometryImageFilter)呼籲建立一個圖像在ITK管道中使用C++函數

我想什麼做的是一樣的東西這(僞代碼):

int main() 

{ 

Image = reader -> GetOutput(); 

function1 (input, ouput) // where input is Image 

function2 (input, ouput) // where input now is the output of function1 

and so on 

} 

void function1 
{ 
} 

void function2 
{ 
} 

乾杯

埃琳娜

+1

我不清楚如果你想擁有一個連接的管道,並讓這些函數在管道中創建連接的ProcessObject。這將完成啓用流或其他管道特定功能。或者如果你正在接近某個過濾器的過程接口。你鏈接的例子將是一個程序方法。如果您對ITK的程序方法感興趣,那麼SimpleITK可以提供您所需要的。 – blowekamp

回答

1

我的印象中,你是c-用ITK管道從一個長的「唯一主」功能開始,現在你想通過在一些函數中分解代碼來使代碼更具可讀性,並且你對C++不是很有信心。如果不是這樣,可能我的答案會重複你已經知道的東西。

首先,ITK有這個漂亮的流水線結構,這樣你就可以準備一個接一個連接過濾器的流水線,然後調用update過濾並獲取整個管道來處理圖像。如果將輸入更改爲第一個過濾器,並再次調用最後一個過濾器的更新,則會再次開始處理,因爲過濾器檢測到其輸入已從上次更改過。初學者的一個典型錯誤(至少對我來說)是嘗試在分配輸入之後立即獲得過濾器的輸出,而不確保從該過濾器或之後的過濾器更新。無論如何,你也可以在每個過濾器之後調用update,只是爲了確保一切順利(並且爲了更容易的調試)。我不確定是否存在性能問題,但在我的應用程序中我沒有注意到。
因此,當您從這些功能獲得輸出時,請記住這一點!其次,ITK智能指針可以簡化您的編程,因爲您不必在使用後記得刪除它們,而且您不必擔心從函數返回時它們會超出範圍。這也意味着有時候事情並沒有像預期的那樣得到更新,因爲它們仍然保留着舊數據(例如,如果在for循環中重置你的過濾器,如果它在外部聲明的話,你必須小心)。但通常他們會簡化你的生活。

在每個函數內部製作小型流水線並不困難:您的輸出將只是指向函數中最後一個篩選器的輸出的指針。您可以將此指針設置爲函數的返回值(另請參閱http://www.itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction)。或者你可以通過引用傳遞輸出圖像(如在你的僞代碼中,如果你傳遞了你已經通過引用傳遞的指針)。有關C++的更新,請參閱例如http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/。僞代碼:

int main() 
{ 
    ImageType::Pointer inputimage, output1, output2; 
    inputimage = reader -> GetOutput(); 
    output1 = function1 (inputimage) // where input is Image 
    function2 (output1, output2) // where input now is the output of function1 , pass argument by reference 
} 

ImageType::Pointer function1 (ImageType::Pointer aInput) 
{ 
    somefilter::pointer filter = somefilter::new() 
    filter ->SetInput(aInput); 
    filter->Update(); // unless you know what you are doing (you know that youe will access the data only at the end) 
    return filter->GetOutput() 
} 

void function2 (ImageType::Pointer aInput, ImageType::Pointer aOutput) 
{ 
    somefilter::pointer filter = somefilter::new() 
    filter ->SetInput(aInput); 
    filter->Update(); 

    aOutput = filter->GetOutput() 
} 

你甚至可以決定複製圖像(所以它的獨立從產生它的管道),並將其發送給另一個管道,看到http://www.itk.org/Wiki/ITK/Examples/SimpleOperations/ImageDuplicator

作爲一個側面說明,你也可以用itk過濾器作爲成員創建你自己的類,在初始化時創建管道,然後在你的方法中修改過濾器的輸入,而不是每次重新創建管道。