m 文件 dll matlab 中调用_《淫巧系列二》MATLAB中直接调用Python
软件环境:
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.shapeflow = 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窗口观察数据格式后在进行转换代码的编写。
m 文件 dll matlab 中调用_《淫巧系列二》MATLAB中直接调用Python相关推荐
- hfss matlab联合仿真_一文搞定matlab 与 STK 联合调试仿真环境配置(文末附软件下载链接)...
最近在做导师给的课题:卫星星座的快速优化设计. 需要用到matlab 和 STK 来进行联合调试仿真,但是这第一步的环境配置就让我头疼了几天.在好几次重装,失败和查找资料之后,我终于成功实现了matl ...
- burg算法的matlab代码实现_导向滤波算法及其matlab代码实现
导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...
- python文件都是脚本吗_脚本语言系列之Python | Python文件IO
Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习.语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会:Python 的极简风格对 ...
- matlab 图案 柱状图_值得收藏 | 如何用matlab做出酷炫的图像
1.基础知识 1.1 二维图形绘制 plot函数是Matlab绘制二维图形的常用函数,该函数将数组中的数据点绘连起来构成一条连续的曲线. plot(x,y,'PropertyName',Propert ...
- 手持gps坐标转换参数求解方法及在excel中的实现_分享∣Arcgis中62个常用技巧系列二(21-40技巧)...
二十一.融合后全部打散 ArcToolbox-> 数据管理 -> 属性 ->mergemultipart to singlepart 二十二.图层 关系处理 ArcToolbox-& ...
- 基类成员的public访问权限在派生类中变为_第17篇:C++继承中虚表的内存布局
我们已经表明,非虚类的对象实例不包含虚指针,编译器在编译阶段也没有为非虚类没有构建虚表.而本篇我们会从简单的单继承链分析虚类中虚表构造过程和内存布局.这一切假定你有如下基础 对gdb调试器使用有一个比 ...
- mysql中约束_【MySQL】:MySQL中四大约束
所有的关系型数据库都支持对数据表使用约束,在表上强制执行数据校验,保证数据的完整性. MySQL数据库支持以下四种约束形式: 非空约束 NOT NULL 所有数值类型的值都可以为null. 空字符串和 ...
- java中的原子操作_[Java并发系列] 2.Java中的原子操作类
1. 原子操作类的作用 当程序更新一个变量时,如果多个线程同时更新该变量,可能会得到期望以外的值.比如i=1, 线程A更新i+1, 同时线程B更新I+1,经过两个线程的操作,最终变量i的值可能不是3, ...
- matlab多种分配方案_分配问题匈牙利算法的Matlab实现
function [x,fVal]=Hungary(C) % 输出参数: % x--Decision Varables, n*n矩阵 % fval--Objective function Value ...
- matlab的程序设计实验报告答案,实验二 MATLAB程序设计(含实验报告).doc
实验二 MATLAB程序设计(含实验报告) 实验二 MATLAB程序设计 实验目的 1.掌握利用if语句实现选择结构的方法. 2.掌握利用switch语句实现多分支选择结构的方法. 3.掌握利用for ...
最新文章
- android 定位的几种方式介绍
- 云炬Android开发教程 Android Studio自带的AVD模拟器安装教程
- linux操作系统信号捕捉函数之sigaction用法小结
- 认识进程 java 1615387415
- ConcurrentHashMap 和 Collections.synchronizedMap(map) 比较
- SpringMVC接收json数据转对象中的一些问题(415错误的解决)
- 文本文件与二进制的区别
- mysql触发器实例 update_mysql触发器实例说明
- 批量检查pdb数据库某些蛋白质的pdb文件是否存在
- 推荐一些学习嵌入式经典的书籍
- 嵌入式计算机 硬盘录像机,嵌入式数字硬盘录像机安装步骤 硬盘安装及使用注意事项【详细介绍】...
- MOT 指标汇总 (详讲 说明 含义 )
- Gmail SMTP问题解决汇总
- 封装和继承作业(java)(一)
- C++利用SIO_GET_INTERFACE_LIST查询网关
- ubc计算机二学位培养方案,UT/McGill/UBC CS二学位(主要介绍多大二学位了)
- 【解决方案】智能UI自动化测试
- CTF常见加密方式汇总
- CocosCreator3D微信小游戏入门RunningBall(一): 物理
- 入门电机系列之5编码器