我使用cython memoryviews來引用一些灰度圖像。我已經在我編寫的一些圖像處理代碼中成功地使用了它。現在,我需要使用一些OpenCV功能。 不幸的是,我發現我無法將這些memoryviews作爲圖像參數傳遞給OpenCV函數。代碼編譯,但當它運行它停止在OpenCV函數調用與「TypeError:不是一個numpy陣列」將Cyclic Memoryviews傳遞給OpenCV函數
我可以將memoryview轉換回numpy陣列與np.asarray(my_memoryview)。這工作,但它複製數據,速度很慢。
在memoryview文檔中,他們談論的是強制轉換爲http://docs.cython.org/src/userguide/memoryviews.html#coercion-to-numpy ,好像我應該能夠在沒有複製內存的情況下將內存視圖強制轉換爲numpy數組。但是,如果我寫:
im = np.asarray(<np.uint8_t[:, :]> my_memoryview)
它會導致編譯錯誤:「只能創建指針或數組cython.array」
關於如何將memoryview傳遞給函數OpenCV的任何幫助,或如何強制內存視圖到一個numpy數組而不復制數據將不勝感激!
你從哪裏得到原始的內存視圖? – r3m0t
我得到一個numpy數組(這是一個openCV圖像)的原始memoryview像這樣: cdef np.uint8_t [:,:1] im2 = im 然後,我操作im2,基本上提取一個子窗口(一個memoryview)然後我傳遞給cv2.matchTemplate此刻我使用np.asarray(子窗口),因爲我無法直接傳遞memoryview。 我想我可能錯誤地解釋了numpy文檔示例的強制性,在這個示例中,他們將一個指向memoryview的指針,然後用np.asarray將其轉換爲numpy數組,這與我正在做的是相同的。但是,我不確定它是強制還是複製。 – martinako