Đối với phiên bản 2.1 của OpenCV, nếu bạn cần phải phần bộ nhớ và nếu bạn không quan tâm đến một chút về lập trình C và SWIG gói, bạn có thể thử giải pháp này mà tôi sử dụng trong một thời gian:
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;
}
Tạo một tiêu đề, ví dụ, 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);
và một tập tin giao diện (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
Cuối cùng, bạn có thể làm công cụ của bạn:
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)
Cảm ơn bạn !!! Đó là cách dễ nhất! – PinkyJie
tôi kiểm tra câu trả lời của bạn trên PC của tôi với opencv 2.1, nó không hoạt động. Phụ thêm ** [:,:] ** vào ma trận vẫn cho đầu ra sai như mảng đối tượng , là phiên bản opencv của bạn giống với của tôi? – PinkyJie
@PinkyJie, xin lỗi khi biết điều đó vẫn không hoạt động. Tôi đang sử dụng OpenCV 2.1 trên Ubuntu. Sự khác biệt có thể liên quan đến phiên bản Numpy bạn đang sử dụng (sử dụng 'np.version.version' để tìm hiểu - tôi đang sử dụng phiên bản 1.3). – rroowwllaanndd