我遇到了一個問題,試圖公開與OpenCV鏈接並使用OpenCV的數據類型OpenCV的動態C++庫函數,使用Numpy ndarray。將基於OpenCV的C++函數與Mat/Numpy轉換爲Python
我拿出類似lightalchemist's solution here一個解決方案,我已經使用boost ::蟒蛇和boost :: numpy的(也與Python 2.7版)described in this SO question.
現在我有堅持也嘗試前者。我已經到了可以在iPython中加載模塊的地步,並且我看到了一個函數,我試圖使用檢查模塊進行移植,我甚至可以調用它並執行。但是,特別是當我嘗試使用NumpyAllocator(see lightalchemist's solution)類將對象轉換回到ndarray時,會發生此問題。 首先,當我嘗試從外部C++可執行調用pyopencv_from功能,它採用了NumpyAllocator,因爲它的編碼,它出現segfaults在
PyEnsureGIL gil;
,沒有消息,每一次。 Lightalchemist的解決方案不使用它在pyopencv_to(編輯:如果ndarray傳入已被分配),它似乎工作。然而,官方OpenCV cv2.cpp也使用allocator,所以如果我嘗試使用該函數甚至不能將輸入的ndarray轉換爲Mat。
當我嘗試使用iPython中的模塊時,它會看到該函數。再次,它正確地執行它(打印進程到控制檯),但是當它到達pyopencv_from時,它會發生段錯誤並殺死iPython shell。
編輯:我使用exaclty相同源lightalchemist,除了我露出一個功能單一,方式與官方OpenCV的端口相同的作用:
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);
}
有沒有人對如何任何線索解決這個轉換問題?
嗨。也許你可以提供更多的語境你的構建參數,調用代碼等等。你提到在iPython中運行代碼時會崩潰。將它作爲獨立運行,即使用普通的Python解釋器怎麼樣?在這種情況下它也會崩潰嗎? – lightalchemist
@lightalchemist,我會在問題中發佈構建參數和代碼。謝謝你回到我身旁。它並不真正崩潰在ipython(只是外部測試可執行文件),只是給我「沒有例外設置的錯誤返回。」 –