【发布时间】:2012-10-10 19:32:06
【问题描述】:
我正在使用 cython memoryviews 来引用一些灰度图像。我已经在我编写的一些图像处理代码中成功地使用了它。现在,我需要使用一些 OpenCV 函数。 不幸的是,我发现我无法将内存视图作为图像参数传递给 OpenCV 函数。代码可以编译,但运行时会在 OpenCV 函数调用处停止,并显示“TypeError: is not a numpy array”
我可以使用 np.asarray(my_memoryview) 将 memoryview 转换回 numpy 数组。这可行,但它复制数据并且速度很慢。
在 memoryview 文档中,他们谈到强制转换为 numpy http://docs.cython.org/src/userguide/memoryviews.html#coercion-to-numpy 似乎我应该能够在不复制内存的情况下将 memoryview 强制为 numpy 数组。但是,如果我写:
im = np.asarray(<np.uint8_t[:, :]> my_memoryview)
导致编译错误:“Can only create cython.array from pointer or array”
任何有关如何将 memoryview 传递给 OpenCV 函数,或如何在不复制数据的情况下将 memoryview 强制转换为 numpy 数组的帮助将不胜感激!
【问题讨论】:
-
你从哪里得到原始内存视图?
-
我从一个numpy数组(这是一个openCV图像)中得到原始的memoryview如下: cdef np.uint8_t[:, ::1] im2 = im 然后我操作im2,基本上提取了一个子窗口(a memoryview) 然后我传递给 cv2.matchTemplate 目前我正在使用 np.asarray(subwindow) 因为我无法直接传递 memoryview。我想我可能误解了强制转换为 numpy 文档示例,在该示例中,他们将指针转换为 memoryview,然后使用 np.asarray 将其转换为 numpy 数组,这与我正在做的相同。但是,我不确定它是强制还是复制。
标签: opencv numpy cython memoryview