Numpy ndarrayを使用して、OpenCV にリンクされ、OpenCV のMatデータ型を使用する動的 C++ ライブラリ関数を Python 2.7に公開しようとすると、問題が発生しました。
ここで lightalchemist のソリューションに似たソリューションを思いつきました。また、この SO の質問で説明されているboost::python と boost::numpy (Python 2.7 にもリンクされています) を使用してみました。
今は前者を貫いています。iPython でモジュールをロードできるようになりました。また、inspectモジュールを使用して移植しようとしている関数が表示されます。それを呼び出して実行することもできます。ただし、NumpyAllocator ( lightalchemist のソリューションを参照) クラスを使用してMatオブジェクトを ndarray に変換しようとすると、特に問題が発生します。まず、外部の C++ 実行可能ファイルからpyopencv_from関数を呼び出そうとすると、NumpyAllocator がコード化されたとおりに使用され、セグメンテーション違反が発生します。
PyEnsureGIL gil;
、毎回メッセージなし。Lightalchemist のソリューションはpyopencv_to (編集: 渡された ndarray が既に割り当てられている場合) でそれを使用しておらず、機能しているようです。ただし、公式の OpenCV cv2.cpp はその中でもアロケーターを使用するため、その関数を使用しようとすると、入力 ndarray を Mat に変換することさえできません。
iPython からモジュールを使用しようとすると、関数が表示されます。繰り返しますが、正しく実行されます (進行状況がコンソールに出力されます) が、pyopencv_fromに到達すると、セグメンテーション違反が発生し、iPython シェルが強制終了されます。
編集:公式の OpenCV ポートと同じように、単一の関数を公開していることを除いて、lightalchemist とまったく同じソースを使用しています。
static PyMethodDef methods[] = {
{"findEdgesCGTG", (PyCFunction)pycvex_findEdgesCGTG, METH_KEYWORDS, "findEdgesCGTG(source) -> edgeGradient, edgeOrientations"},
{NULL, NULL}
};
extern "C"
#if defined WIN32 || defined _WIN32
__declspec(dllexport)
#endif
void initcvex()
{
import_array();
PyObject* m = Py_InitModule(MODULESTR, methods);
PyObject* d = PyModule_GetDict(m);
opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
PyDict_SetItemString(d, "error", opencv_error);
}
この変換の問題を解決する方法について手がかりを持っている人はいますか?