PyObject *PyFunction::matToNdarray(Mat mat,int NPY_TYPE = NPY_FLOAT32)//Mat轉Ndarray
{
if (!mat.isContinuous()) { mat = mat.clone(); }//判斷是否是連續的MAT,如果是ROI則不連續,需要将記憶體進行拷貝
vector<npy_intp> dims_vector;
for (int i = 0;i < mat.dims;++i) { dims_vector.push_back(mat.size[i]); }
npy_intp *dim_np = new npy_intp[sizeof(dims_vector)];
if (!dims_vector.empty()) { memcpy(dim_np, &dims_vector[0], dims_vector.size() * sizeof(npy_intp)); }
PyObject *pythonValue = PyArray_SimpleNewFromData(mat.dims, dim_np, NPY_TYPE, mat.data);
return pythonValue;
}
Mat PyFunction::ndarrayToMat(PyObject *python_value, int MAT_TYPE = CV_32F)//Ndarray轉Mat
{
PyArrayObject *array_value;
PyArray_OutputConverter(python_value, &array_value);
npy_intp *shape = array_value->dimensions;
int dim_lentgh = array_value->nd;//獲得ndarray中有幾個次元
vector<int> dims_vector;
for (int i = 0;i < array_value->nd;++i) { dims_vector.push_back(shape[i]); }
int *dim_mat = new int[sizeof(dims_vector)];
if (!dims_vector.empty()) { memcpy(dim_mat, &dims_vector[0], dims_vector.size() * sizeof(int)); }
Mat mat(array_value->nd, dim_mat, MAT_TYPE, PyArray_DATA(array_value));
return mat;
}