Создание массива numpy из ctypes POINTER с использованием ctypes.memmove () дает неверные результаты

Я использую ctypes для вызова функции C ++ и вычисления гомографии. Затем он был преобразован в массив NumPy. Гомография, напечатанная на C ++, верна. Однако в python это совершенно неправильно после преобразования в массив numpy с помощью ctypes.memmove ().

Например, в C ++ гомография:

[[0.999931, 3.05449e-06, 0.0219359],

[-3,46952e-05, 1,00004, 0,0162477],

[-1.20569e-08, -6.80167e-09, 1]]

В Python trs_matrix (гомография):

[[3.36311631e-44, 0,00000000e + 00, 2,25339716e + 12] [4.59163468e-41,2.25339612e + 12, 4.59163468e-41] [2.25339821e + 12,4.59163468e-41, 2.24207754e-44]]

Код Python:

def find_homo(self, numLoops=1000, minScore=0.85, maxAmbiguity=0.95, thresh=5.0):

homography = ctypes.POINTER(ctypes.c_float)()

num_match = _LIB.FindHomography_C(
ctypes.byref(self),
ctypes.byref(homography),
ctypes.c_int(numLoops),
ctypes.c_float(minScore),
ctypes.c_float(maxAmbiguity),
ctypes.c_float(thresh)
)

trs_matrix = ctypes2numpy(homography, 9, np.float32).reshape((3, 3))

return trs_matrix, num_matchdef ctypes2numpy(cptr, length, dtype):
#Convert a ctypes pointer array to a numpy array

if not isinstance(cptr, ctypes.POINTER(ctypes.c_float)):
raise RuntimeError('Expected float pointer')

res = np.zeros(length, dtype=dtype)

if not ctypes.memmove(res.ctypes.data, cptr, length * res.strides[0]):
raise RuntimeError('memmove failed')

return res

Код C ++:

int FindHomography_C(SiftData &data, float** out_homo, int numLoops, float minScore, float maxAmbiguity, float thresh){
//API_BEGIN();
int numMatches = 0;

float homography[9];

FindHomography(data, homography,  &numMatches, numLoops, minScore, maxAmbiguity, thresh);

*out_homo = &homography[0];

return numMatches;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]