Для версии OpenCV 2.1, если вам нужно долю памяти и если вы не заботитесь о немного программирования C и SWIG упаковка, вы можете попробовать это решение, которое я использовал в течение некоторого времени:
CvMat * npymat_as_cvmat_32f(float * npymat_float, int rows, int cols)
{
CvMat * cvmat;
cvmat = cvCreateMatHeader(rows, cols, CV_32FC1);
cvSetData(cvmat, npymat_float, cols * sizeof(float));
return cvmat;
}
Создать заголовок, например, mat_conversion.h:
/* npymat_as_cvmat_32f
*
* Create an OpenCV CvMat that shared its data with the input NumPy double array
*/
CvMat * npymat_as_cvmat_32f(float * npymat_float, int rows, int cols);
и файл интерфейса (numpy_meets_opencv.i):
/* numpy_meets_opencv */
%module numpy_meets_opencv
%{
#define SWIG_FILE_WITH_INIT
#include <cv.h>
#include "mat_conversion.h"
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (float* INPLACE_ARRAY2, int DIM1, int DIM2) {(float* npymat_float, int rows, int cols)};
%include "mat_conversion.h"
Compile:
numpy_meets_opencv: numpy_meets_opencv.i mat_conversion.c
swig -python -classic numpy_meets_opencv.i
$(CC) $(NPY_CFLAGS) -fPIC -fno-stack-protector -c mat_conversion.c `pkg-config --cflags $(PKGS)`
$(CC) $(NPY_CFLAGS) -fPIC -fno-stack-protector -c numpy_meets_opencv_wrap.c `pkg-config --cflags $(PKGS)`
ld -shared mat_conversion.o numpy_meets_opencv_wrap.o `pkg-config --libs $(PKGS)` -o _numpy_meets_opencv.so
Наконец, вы можете сделать свой материал:
In [1]: import numpy_meets_opencv as npyocv
In [2]: import opencv as cv
In [4]: import numpy as npy
In [12]: Inpy = npy.zeros((5,5), dtype=npy.float32)
In [13]: Iocv = npyocv.npymat_as_cvmat_32f(Inpy)
In [14]: Inpy
Out[14]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]], dtype=float32)
In [15]: Iocv
Out[15]: <opencv.cv.CvMat; proxy of <Swig Object of type 'CvMat *' at 0x30e6ed0> >
In [17]: cv.cvSetReal2D(Iocv, 3,3, 255)
In [18]: Inpy
Out[18]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 255., 0.],
[ 0., 0., 0., 0., 0.]], dtype=float32)
Спасибо !!! Это самый простой способ! – PinkyJie
Я тестирую ваш ответ на своем ПК с opencv 2.1, это не сработало. Добавление ** [:,:] ** к матрице все же дало неверный результат, например массив объектов, ваша версия opencv такая же, как у меня? – PinkyJie
@PinkyJie, жаль слышать, что он все еще не работает. Я использую OpenCV 2.1 на Ubuntu. Разница может быть связана с версией Numpy, которую вы используете (используйте 'np.version.version', чтобы узнать - я использую версию 1.3). – rroowwllaanndd