Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert transposed NumPy array to CvMat type in Python using cv.fromarray

I am having a problem where some numpy arrays don't convert to cvMat using cv.fromarray(). It appears the problem occurs whenever the numpy array has been transposed.

import numpy as np
import cv

# This works fine:
b = np.arange(6).reshape(2,3).astype('float32')
B = cv.fromarray(b)
print(cv.GetSize(B))

# But this produces an error:
a = np.arange(6).reshape(3,2).astype('float32')
b = a.T
B = cv.fromarray(b)
print(cv.GetSize(B))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test_err.py", line 17, in <module>
    B = cv.fromarray(b)
TypeError: cv.fromarray array can only accept arrays with contiguous data

Any suggestions? Many of my arrays have been transposed at some point so the error is coming up frequently.

I'm using Python2.7 on MacOS X Lion with NumPy 1.6.2 and OpenCV 2.4.2.1 installed from MacPorts.

like image 210
David A Avatar asked Aug 20 '26 16:08

David A


1 Answers

You can check your arrays using the flags.contiguous attribute, and if they are not, make them be using copy():

>>> a = np.arange(16).reshape(4,4)
>>> a.flags.contiguous
True
>>> b = a.T
>>> b.flags.contiguous
False
>>> b = b.copy()
>>> b.flags.contiguous
True

When you ask for a transpose, numpy doesn't actually transpose the data, only the strides used to access it, unless you specifically trigger a copy with copy().

like image 168
Jaime Avatar answered Aug 22 '26 05:08

Jaime



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!