m 文件 dll matlab 中调用_《淫巧系列二》MATLAB中直接调用Python

d28a71145ab6309cca7fa5542acd4df3.png

软件环境:

windows 10

MATLAB 2016a

Python 3.8

代码功能简介:在Matlab中直接调用python函数,实现利用python的opencv模块计算输入两张图像直接的MV(flow)。

在MATLAB中查看python版本:

pyversion

be977c0fd7641ba4b4c42ecb741be359.png
isloaded表示是否已加载Python,如果已经调用了Python相关模块,isloaded就变为1

编写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类型通常可以自动转换不需要特殊处理,具体的转换规则见下图:

5ed61a19048b039e48605b9ec47de683.png
Matlab传参标量给Python的数据类型转换表

00e7e00bfe6f60b804e26faf18255de3.png
Matlab传参一维向量给Python的数据类型转换表

编写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:

24ce8c103bdc3b2f03fb9b37982fbd70.png

运行Matlab脚本后会生成2张分别在Python与Matlab中根据MV对参考图像进行Warp后的图像:

016ae66abaf7585f86c4db6d2b1d782a.png

图像内容基本一致,表示Matlab中调用Python函数成功且正确。

MATLAB与Python代码网盘链接,提取码:aesd

https://pan.baidu.com/s/16CnM8yTdV5BIVNRCfZfHvg​pan.baidu.com

一些重要提示:

MATLAB是读取连续内存按列存储到矩阵,因此需要注意数据的转换,可以在Debug窗口观察数据格式后在进行转换代码的编写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值