天天看點

c++ 中 opencv Mat 與 python 矩陣格式 ndarry 互相轉換

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;
}