2012-03-11 15 views
1

私はC++コードをSWIGでうまくラップし、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 *' 

私がしようとするすべてのWebを中心に探していますこれを自分で解決することができますが、それは私の予想以上に困難になります。

私は、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

+0

このプログラムは、htmlフロントエンドを持つapacheサーバーを通じて複数のユーザーに使用されますが、リクエストごとに新しいプロセスを作成しているので、グローバル変数を定義しても問題ありません。 「真の並行性」を心配する – kersian

関連する問題