Сохранение numpy homographi c ndarray в файл - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь сохранить таблицу numpy ndarray homographi c в файл (чтобы использовать ее позже при необходимости), используя:

h.tofile("h.h", sep=",", format="%s")

Но когда я позже загружаю его и пытаюсь использовать его В моих вычислениях, используя:

h = np.fromfile('h.h')

Я получаю следующую ошибку:

OpenCV Error: Assertion failed (scn + 1 == m.cols) in perspectiveTransform, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/core/src/matmul.cpp, line 2268
Traceback (most recent call last):
  File "...camera_to_point.py", line 166, in draw_circle2
    pointOut = cv2.perspectiveTransform(a, h)
cv2.error: /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/core/src/matmul.cpp:2268: error: (-215) scn + 1 == m.cols in function perspectiveTransform

Интересно то, что при проверке матрицы homographi c перед сохранением в файл и после извлекая его из файла, я получаю:

Перед сохранением:

h
array([[ 1.86326937e-02, -1.16700086e-02,  2.66963340e+00],
       [-7.51402803e-03, -3.88364336e-02,  1.69502899e+01],
       [-1.05249671e-03,  1.47791921e-02,  1.00000000e+00]])
[0:3] : [array([ 0.01863269, ...6696334 ]), array([-7.51402803e-...2899e+01]), array([-0.0010525 , ...        ])]
dtype: dtype('float64')
max: 16.950289865517334
min: -0.038836433627212195
shape: (3, 3)
size: 9
__internals__: {'T': array([[ 1.86326937e...000e+00]]), 'base': None, 'ctypes': <numpy.core._interna...ff8179b90>, 'data': <read-write buffer f...ff81797f0>, 'dtype': dtype('float64'), 'flags':   C_CONTIGUOUS : Tru...PY : False, 'flat': <numpy.flatiter obje...0x2f69850>, 'imag': array([[0., 0., 0.],... 0., 0.]]), 'itemsize': 8, 'nbytes': 72, 'ndim': 2, 'real': array([[ 1.86326937e...000e+00]]), 'shape': (3, 3), 'size': 9, ...}

После извлечения:

h
array([7.12605079e-67, 1.18069470e-95, 9.95130728e-43, 9.95309333e-43,
       5.40222957e-62, 4.32553942e-91, 2.74137239e-57, 3.06246782e-57,
       7.11172728e-38, 8.16641713e-43, 1.83288526e-76, 9.92883300e-96,
       1.69053846e-52, 9.34287548e-67, 9.05446937e-43, 7.11877246e-67])
[0:16] : [7.126050789796848e-67, 1.1806946993563433e-95, 9.951307279141174e-43, 9.95309332763986e-43, 5.402229572720159e-62, 4.325539416797926e-91, 2.741372385066056e-57, 3.0624678193742925e-57, 7.111727282221548e-38, 8.16641712557458e-43, 1.8328852622133153e-76, 9.928833002794128e-96, 1.690538456980108e-52, 9.342875479816443e-67, ...]
dtype: dtype('float64')
max: 7.111727282221548e-38
min: 9.928833002794128e-96
shape: (16,)
size: 16
__internals__: {'T': array([7.12605079e-6...7246e-67]), 'base': None, 'ctypes': <numpy.core._interna...ff8179790>, 'data': <read-write buffer f...ff8179470>, 'dtype': dtype('float64'), 'flags':   C_CONTIGUOUS : Tru...PY : False, 'flat': <numpy.flatiter obje...0x2f68e00>, 'imag': array([0., 0., 0., 0..., 0., 0.]), 'itemsize': 8, 'nbytes': 128, 'ndim': 1, 'real': array([7.12605079e-6...7246e-67]), 'shape': (16,), 'size': 16, ...}

Который показывает две разные матрицы.

Итак, как я могу сохранить numpy ndmatrix в файл и получить его успешно?

Я использую opencv2 с python2 .7

1 Ответ

0 голосов
/ 27 февраля 2020

При h.tofile("h.h", sep=",", format="%s") текстовый файл со всеми числами, разделенными запятыми, сохраняется, но информация о размере массива теряется.
h = np.fromfile('h.h') приводит к получению выходного файла. Если вместо этого вы используете
h = np.fromfile('h.h', sep=","), а затем измените размер h как
h.resize((3, 3)), вы получите желаемый результат.

Если вы используете двоичный формат файла, информация о массиве может быть получена.

np.arrays может храниться в двоичном формате файла с использованием библиотеки pickle:
скрипт выполняется в python 2.7 и 3.8

from pickle import dump, load
from numpy import array

def save_h():

    h = array([[1.86326937e-02, -1.16700086e-02,  2.66963340e+00],
           [-7.51402803e-03, -3.88364336e-02,  1.69502899e+01],
           [-1.05249671e-03,  1.47791921e-02,  1.00000000e+00]])

    with open("save.h", "wb") as f:
        dump(h, f)
    with open("save.h", "rb") as f:
        h1 = load(f)
    return h, h1

if __name__ == "__main__":
    stored, loaded = save_h()
    print(stored)
    print(loaded)

Вывод:

[[ 1.86326937e-02 -1.16700086e-02  2.66963340e+00]
 [-7.51402803e-03 -3.88364336e-02  1.69502899e+01]
 [-1.05249671e-03  1.47791921e-02  1.00000000e+00]]
[[ 1.86326937e-02 -1.16700086e-02  2.66963340e+00]
 [-7.51402803e-03 -3.88364336e-02  1.69502899e+01]
 [-1.05249671e-03  1.47791921e-02  1.00000000e+00]]
...