2012-03-11 37 views
1

我已經成功用SWIG封裝了我的C++代碼,並且它可以很好地加載到Python中。我正在使用Olena library for image processing通過引用從Python調用C++函數

但是,我不知道如何調用我的函數,需要一個指向圖像的指針!

舉例來說,我對侵蝕圖像功能的原型如下:內的Python運行我的代碼的

mln::image2d<mln::value::int_u8> imErossion(
    const mln::image2d<mln::value::int_u8> *img, int size, int nbh 
); 

結果:

from swilena import * 
    from algol import * 

    image = image2d_int_u8 
    ima = image.load("micro24_20060309_grad_mod.pgm") 

    eroded_ima = imErossion(ima,1,8) 
    >>>> Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    TypeError: in method 'imErossion', argument 1 of type 
     'mln::image2d<mln::value::int_u8 > const *' 

我一直在尋找所有網絡上嘗試並自己解決這個問題,但它變得比我想象的更難。

我不知道如何從Python中傳遞一個指針 - 這個C的等效++代碼:

eroded_ima = imErossion(&ima,1,8) 

回答

3

我和我在大學教授檢查,我們決定這將是更好的implemente一個函數,當這個被加載並聲明爲全局時將返回指向圖像的指針:

mln::image2d<mln::value::int_u8> working_img; 

mln::image2d<mln::value::int_u8> *imLoad(const std::string path){ 
    mln::io::pgm::load(working_img, path); 
    return &working_img; 
} 

void imSave(const std::string path){ 

    mln::io::pgm::save(working_img, path); 

} 

您對此有何看法?

+0

我寫了一個叫做LikeMagic的C++綁定庫,它的用途與SWIG類似。我不能說你是如何做這是最好的做法,但你在這個答案中提出的解決方案是我所做的並且還沒有親自解決它的問題。我寫了LikeMagic來自動處理大多數類型轉換的情況,但也有一些情況是讓庫處理它不方便,然後我只用C++編寫一個輔助函數。 – Dennis 2012-03-14 21:03:29

+0

該程序將通過一個帶有html前端的apache服務器用於多個用戶,但我認爲當我們爲每個請求創建一個新進程時,可能會有一個全局變量定義,我不應該擔心「真正的併發」 – kersian 2012-03-14 22:16:16