Cythonを使用して書かれたCのカメラドライバへのラッパーを構築しようとしています。私はCythonを新しくしました(2週間前に開始しました)。多くの苦労の後、私は構造体、1D配列のラッパーを開発することができましたが、今は2次元配列が残っています。Cython:Pythonから2D配列をCに渡して取得する
カメラのC APIの1つは、2D配列ポインタを入力として受け取り、キャプチャされた画像を割り当てます。この関数をPythonから呼び出す必要があり、出力イメージをPythonで処理/表示する必要があります。 Cythonのドキュメントやスタックオーバーフローに関するさまざまな記事を読んだ後、私はもっと混乱してしまいました。 Iは、ドライバのAPIルックス(幾分)このようなPythonとCの間の2Dアレイを通過する方法を見つけ出すことができなかった。
driver.h
void assign_values2D(double **matrix, unsigned int row_size, unsigned int column_size);
c_driver.pyd
cdef extern from "driver.h":
void assign_values2D(double **matrix, unsigned int row_size, unsigned int column_size)
test.pyx
from c_driver import assign_values2D
import numpy as np
cimport numpy as np
cimport cython
from libc.stdlib cimport malloc, free
import ctypes
@cython.boundscheck(False)
@cython.wraparound(False)
def assignValues2D(self, np.ndarray[np.double_t,ndim=2,mode='c']mat):
row_size,column_size = np.shape(mat)
cdef np.ndarray[double, ndim=2, mode="c"] temp_mat = np.ascontiguousarray(mat, dtype = ctypes.c_double)
cdef double ** mat_pointer = <double **>malloc(column_size * sizeof(double*))
if not mat_pointer:
raise MemoryError
try:
for i in range(row_size):
mat_pointer[i] = &temp_mat[i, 0]
assign_values2D(<double **> &mat_pointer[0], row_size, column_size)
return np.array(mat)
finally:
free(mat_pointer)
test_camera.py
コンパイルされたときb = np.zeros((5,5), dtype=np.float) # sample code
print "B Before = "
print b
assignValues2D(b)
print "B After = "
print b
、それがエラーを与える:実際に
Error compiling Cython file:
------------------------------------------------------------
...
if not mat_pointer:
raise MemoryError
try:
for i in range(row_size):
mat_pointer[i] = &temp_mat[i, 0]
^
------------------------------------------------------------
test.pyx:120:21: Cannot take address of Python variable
、上記のコードは、スタックオーバーフローpostから採取しました。私はいくつかの方法を試しましたが、誰も働いていません。 2D画像をどのようにしてPythonに変換できるか教えてください。前もって感謝します。
私の推測では、これはコンパイル時に最初に表示されるエラーメッセージではない可能性があり、以前のエラーメッセージがより有益である可能性があります。 – DavidW
しかしおそらく問題は、 'tmp_mat'が' np.ndarray [double ...]ではなく 'np.ndarray [np.double_t ...']として定義されているということでしょう。 – DavidW
あなたの素早い応答のために@DavidWに感謝します。コンパイラエラー。 – DVS