软件环境:
windows 10
MATLAB 2016a
Python 3.8
代码功能简介:在Matlab中直接调用python函数,实现利用python的opencv模块计算输入两张图像直接的MV(flow)。
在MATLAB中查看python版本:
pyversion
编写Python代码PYIO.py:
## 输入:一对图像与其高宽;
## 输出:图像直接的相对运动矢量;
def MATIO_Flow(base,ref,hgt,wid):
base = np.array(base) ##Matalb传参输入为一维array的类型,需要转为np.array的类型
##将一维数据转为图像的二维格式,需要注意Matlab中是按列存储数据,而Python中转为按行->(wid,hgt)
base = np.reshape(base,(wid,hgt))
base = np.transpose(base) ## 行转列,列转行完成格式转换
ref = np.array(ref)
ref = np.reshape(ref, (wid, hgt))
ref = np.transpose(ref)
H = getHomography(base, ref)
hgt, wid = base.shape
flow = Homography2Flow(H, hgt, wid)
interp_frame = cv2_warp(ref,flow)
cv2.imwrite('interp_ref2base_py.jpg',interp_frame)
return array.array('d',flow.flatten()) ## MATLAB支持array的返回类型且要为一维数据
常用的int、float类型通常可以自动转换不需要特殊处理,具体的转换规则见下图:
编写Matlab测试代码:
clc
clear all
%%%重载Python模块:便于py模块更新后重新加载
clear classes
obj = py.importlib.import_module('PYIO');
py.importlib.reload(obj);
%%%读取图像,只支持uint8的输入图像格式(opencv接口的限制)
base = imread('0001.jpg');
ref = imread('0002.jpg');
base = rgb2gray(base);
ref = rgb2gray(ref);
[hgt,wid] = size(base);
%%%matlab调用python只支持一维传参
baseVectot = base(:)';
refVector = ref(:)';
%%%调用python函数
flow = py.PYIO.MATIO_Flow(baseVectot,refVector,int16(hgt),int16(wid));
%%%将array格式转为matlab中的mat数据类型
flowVector = double(flow);
%%%转为原图尺寸(python变量内存中排列方式与MATLAB不一致需要转换)
flow = reshape(flowVector,[2,wid,hgt]);
flow = permute(flow,[3,2,1]);
flow_x = flow(:,:,1);
flow_y = flow(:,:,2);
[i,j] = ndgrid(1:hgt,1:wid);
X = flow_x + j;
Y = flow_y + i;
interp_frame = uint8(interp2(double(ref),X,Y));
imshow(interp_frame)
disp('done')
python传递参数转换规则表如下图,对于数组python需要转为一维数据(array或者listl类型)传回给Matlab:
运行Matlab脚本后会生成2张分别在Python与Matlab中根据MV对参考图像进行Warp后的图像:
图像内容基本一致,表示Matlab中调用Python函数成功且正确。
MATLAB与Python代码网盘链接,提取码:aesd
https://pan.baidu.com/s/16CnM8yTdV5BIVNRCfZfHvgpan.baidu.com一些重要提示:
MATLAB是读取连续内存按列存储到矩阵,因此需要注意数据的转换,可以在Debug窗口观察数据格式后在进行转换代码的编写。