精华内容
下载资源
问答
  • Matlab使用教程

    2019-04-14 17:40:12
    该书作为Matlab在化工应用中基础经典教材,理论详实,并结合工程实际问题,提供了很好的解决问题的理论和思路。
  • MATLAB使用教程

    2008-09-06 05:18:31
    4.5 使用者自定函数 4.6 乱数 4.6.1 均匀乱数 4.6.2 常态乱数 4.7 矩阵运算函数 4.8 回圈 4.8.1 For 回圈 4.8.2 While 回圈 第五章 线性代数与矩阵 --- 蛋白质分子量分析 5.1 矩阵运算 5.1.1 基本矩阵运算...
  • MATLAB实用教程(第二版)全面介绍了MATLAB在科学计算,图形和程序设计等方面的应用。 是一本matlab基础入门的书籍,讲解清晰明了
  • matlab是一个很强大的计算软件,合理使用会给我们的学习带来极大的方便之处,本人旨在提供一个零基础的matlab学习博文,供大家学习交流。谢谢大家支持。
    • 前言:

    在这里,本人默认大家已经安装好了MATLAB软件,如果没有,则大家有两条选择:

    if you.身份 == 学生 {
        请到matlab官网申请学生使用,是免费的,但是需要一些时间
    } else {
        某个公众号有破解版,请于下载后24小时内删除。
        支持正版。支持正版。
    }

     

    • 注意事项:

    新手容易犯错,打开MATLAB之后,请按CTRL+Q这个组合键,是不是发现你的MATLAB关闭了?

    对,没事不要按这一套组合键,这一套组合键是关闭MATLAB的

    另:本人不会一下子列出很多东西命令让大家记忆,因为实践出真知,只有用到这个东西的时候,我才会教大家怎么使用,如果大家需要,请留言,我专门出一个文章,列出所有命令。

    本人的MATLAB版本是2016RA.

    • 开始了:

    如上图,建议大家选择一个自己喜欢的路径作为工作路径,并且在每次使用前检查自己的路径。这是非常重要的!!!

    记住:每次打开前检查自己的路径。


    运行程序有两种方法,一种是文件式的,一种是命令行式的,今天这次,我先使用命令行式的,以后使用文件式的!!!


    第一个事情:变量!!!!

    先学会声明变量,才是重头戏,在matlab中没有变量声明语句,当使用一个名字的时候,matlab会搜索这个名字,当没有这个名字的时候,默认自动生成,比如:

    在上图中,语句1和2是等效的。都是,给变量赋值为 Chuckie(同时注意,使用的是单引号,双引号不可以哦,至于双引号的用途,以后讲)(同时右边工作区,可能你的在左边,多了一个变量,叫做name,值是Chuckie) ,但是,细心的你可能会发现,语句1执行后,下面显示了结果,语句2执行后,却什么也没显示。

    这是因为:::如果语句后面不加分号(;),matlab会以交互式来执行程序,所以每执行一步,都会输出,而类似与语句2,我们有了分号,matlab会执行这个语句,并且会继续执行,除非我们打印结果,否则不会显示到屏幕上。

    同样,我们也可以直接给命名为数字,而不是字符。如下图:


     

    第二个事情:删除变量!!!

    现在已经有变量了,我们如何去删除变量呢?

    使用 clear 关键字(或者说内置函数,只要大家能理解就行)。

    比如接着上面的加法,如果我仅仅想删除num1 这个变量,我使用这句话:

    如果我们直接使用 clear ,那么所有的变量将会全部删除,如下图:


    第三个事情:清屏!!!

    现在屏幕里东西确实太多了,看着碍眼,一句话,全部就能清除:clc

    没有额外的参数,就是三个字幕,clc,请大家注意区分clear和clc的区别,一不小心弄错了,就会把变量全部删除了,大家千万小心!!!!!

    clear: 删除变量。

    clc: 清除屏幕的内容,但是不会清除已经存在的变量。


    第四个事情:查看我们现在拥有的变量!!!

    who 、whos

    上面两个命令,可以查看当前我们有的所有变量,比如:

    (如果我们在一行中以 ; 分割,那么每个单独语句会被单独执行)

    上面的栗子中,我们可以清楚地看到who 和 whos 的区别,who这个命令仅仅是列出变量的名字,而whos这个命令,显示的信息更加的全面,包括数据的大小(由于matlab默认用二维数组存放,所以对于数字,就是一行一列的数组,就是单个的值),类型,占了多少空间等数据。


    最后一件事情:自己动手时间到了!!!

    问题是:大家现在都会定义变量了,那么,我们可不可以变量之间进行强制类型转换呢?

    大家自己尝试以下代码:

    baseNum = 123.456;
    toUint8 = uint8(baseNum);
    toUint32 = uint32(baseNum);%这个是注释的符号%
    whos;
    

    大家也可以扩展一下,同时还有,int8 - 64,uint8-64,uint是无符号整型,是非负的。

    展开全文
  • matlab使用教程

    2011-12-18 11:31:03
    本书基于MATLAB 5.2版,提供了使用MATLAB的实践性指导。MATLAB已成为适合多学科、多种工作平台的功能强大、界面友好、语言自然并且开放性强的大型优秀应用软件,同时也已成为国内外高等院校高等数学、数值分析、数字...
  • MATLAB使用教程.rar

    2021-05-30 08:21:35
    非常实用的MATLAB使用教程
  • 新手简明入门级matlab使用教程

    万次阅读 多人点赞 2020-06-08 22:46:02
    matlab之所以强大,就是因为提供大量的函数,你也可以建立自定义函数,方法是:Home->New->function。自定义函数一般保存在工作路径下。函数文件的特征是:扩展名m,内容的第一行以function开头,后续内容是...

    一、软件中的基本概念
    1 函数
    matlab之所以强大,就是因为提供大量的函数,你也可以建立自定义函数,方法是:Home->New->function。自定义函数一般保存在工作路径下。函数文件的特征是:扩展名m,内容的第一行以function开头,后续内容是“输出变量=函数名(输入变量)”。且函数名和文件名相同。
    每个函数在Command Window中运行,用来完成特定的计算任务,运行方式是输入“输出变量=函数名(输入变量)”,然后按回车。例如有个系统自带的函数是用来求绝对值的,函数名abs,所以在Command Window里输入“a=abs(-1)”,就会显示运算结果为“a=1”。且运算结果会在Workspace里出现一个变量a,双击后可看到a的值是1。
    2 脚本
    可以理解为特殊的函数,这种函数内容的开头没有function那行,因此没有输入、输出变量,也没有函数名。文件扩展名和函数一样是m,也需要在Command Window里运行。脚本都是用户建立的,方法是:Home->New Script。一般保存在工作路径下。脚本的功能就是完成用户需要的、复杂的计算任务,通常脚本里会调用很多函数。
    3 GUI
    一般翻译为界面,就是人机交互界面的意思。写脚本处理问题的方法有点麻烦,让人看起来更像是码农,所以现在很多问题可以通过界面点点鼠标解决。这时候就需要打开界面,打开方法是:在APPS标签里可以找到所有已安装的GUI工具,单击即可。注意右边有个小三角可以点开。和函数一样,用户也可以自己建立自定义GUI,这部分较为复杂,对新手而言有点遥远。
    4 toolbox
    一般翻译成工具箱,matlab将功能相近或者应用上自成体系的一组函数和GUI打包成一个toolbox。正版的matlab在购买时,几乎每一个toolbox都是要单独收费的,所以toolbox也可以理解为matlab产品的模块,一个工具箱就是一个产品/商品。
    5 simulink
    一般用matlab解决问题的过程是:用户自定义脚本,在Command Window里运行脚本。而脚本的运行逻辑是顺序执行,和一般的编程一样。simulink则提供另一种思路,图形化编程,有点像labview,这种方法很适合于物理模型的仿真,因此有时用“matlab编程”和“simulink仿真”强调。使用方法是在home标签下点击simulink。

    二、命令窗口的基本配置
    1、format命令
    进行数据类型转换,行间距调节等功能时,用

        format + 关键词 回车
    

    eg:format long 回车 //将数据变为长整型

        format compat/loose 回车  //调节行间距紧密/松散
    

    2、clc命令
    清屏。即清理当前屏幕上的内容,屏幕上没有了,但保留在内存中了

    3、clear命令
    删除某一变量,或清空工作区

    clear + 变量名 回车
    
    eg:clear a 回车  //删除工作区中的a变量
    
            clear或者clear all //清空工作区。建议在刚打开matlab窗口时先清空一下工作区。
    

    4、whos命令
    查看某变量详细信息

    4.1 whos 回车 //查看所有变量信息
    4.2 whos + 变量名 回车 // 查看该变量详细信息
    eg:whos a 回车

    5、x/ylable命令 //给xy轴加横纵坐标说明
    eg:xlable (‘x轴’) 回车

    6、disp() //屏幕输出函数,类似于c语言中的printf()函数
    disp函数直接将内容输出在Matlab命令窗口中,关键是看disp函数怎么把字符和数字在一起进行显示。
    disp(X)函数只有一个输入,当你有多个字符串作为输入时就会报错。
    例如:
    disp(‘Alice is ’ , num2str(12) , ’ years old!’ );
    就会报错–输入参数过多。
    但是将里边的内容用中括号一括就成了一个字符串,
    例如:

    str=['Alice is ' num2str(12) ' years old!'];
    
    disp(str);
    

    上边这句话也就等价于:

    disp=(['Alice is ' num2str(12) ' years old!']);
    

    三、工作界面
    在这里插入图片描述
    ps:这里程序运行出来是一个爱心❤哟~

    还可以在命令行窗口中输入有效的表达式,例如 -
    Trial>> 5 + 5
    在这里插入图片描述
    如果语句后面不加分号(;),matlab会以交互式来执行程序,所以每执行一步,都会输出。我们有了分号,matlab会执行这个语句,并且会继续执行,除非我们打印结果,否则不会显示到屏幕上。

    四、MATLAB依次运行多个脚本.m文件
    方法一:新建一个脚本文件,编写下面的代码:

    clc
    clear
    close all
     
    file1 % 第一个脚本文件的名字(注:直接写下脚本文件的名字,无需用单引号括起来,无需.m后缀。下同)
     
     
    clear % 清除第一个脚本文件执行过程中的所有变量
    file2 % 第二个脚本文件的名字(要求同上)
     
    clear % 清除第二个脚本文件执行过程中的所有变量
    file3 % 第三个脚本文件的名字(要求同上)
     
    % 下面如果还有其他脚本文件,则都可以如法炮制
    

    方法二:使用 run() 函数

    clc
    clear
    close all
    run( 'file1.m' ) % 运行第一个脚本文件
    clear % 清除第一个脚本文件执行过程中的所有变量
    run( 'file2.m' ) % 运行第二个脚本文件
    clear % 清除第二个脚本文件执行过程中的所有变量
    run( 'file3.m' ) % 运行第三个脚本文件
    % 值得一提的是:这些个脚本文件可以在不同的文件夹下。比如一个在D盘某个文件夹下,一个在F盘某个文件夹下。
    % 这时,只需要在run()语句的字符串中加入脚本文件的绝对路径即可。脚本文件执行时,也不会受到当前路径的影响。
    % 例如:run( 'D:\file1.m' );
     
     
     
    % 下面如果还有其他脚本文件,则都可以如法炮制
    

    注:尽管有时要运行的脚本文件不在MATLAB的当前路径下。只要在run()语句的字符串中加入脚本文件的绝对路径,则在脚本文件执行时,就不会受到当前路径的影响。
    另外,可以使用命令“doc run”查看run函数的详细使用说明。

    五、MATLAB 能做什么?
    在mablab命令行输入‘xpbombs’, 重温经典扫雷游戏;
    输入‘spy’, 与可爱的doge相视凝望;
    有问题,输入 ‘why’。,看看MATALB的回答;
    输入‘earthmap’,看看到这个小破球正常自转…

    展开全文
  • 桌面包括下列面板: 当前文件夹 - 访问您的文件。 命令行窗口 - 在命令行中输入命令(由提示符 (>>) 表示)。 工作区 - 浏览您创建或从文件导入的数据。...使用 MATLAB 时,可发出创建变量和调用函数的命令。
  • MATLAB 应用教程

    2018-10-15 20:43:40
    属于matlab基础及应用教程,学习质料,是经过自学,总结质料
  • 使用matlab时的注意事项,比如不能按CTRL+Q 语句后面加分号,不是交互式,不加分号,会同时打印结果,即交互式。 字符串使用单引号才可以。 变量赋值不需要提前声明,随时使用。 clear清除变量,clc清除屏幕。 ...

    ·前言

    在上一篇文章中,我们学习了

    1. 如何调整自己的工作区
    2. 使用matlab时的注意事项,比如不能按CTRL+Q
    3. 语句后面加分号,不是交互式,不加分号,会同时打印结果,即交互式。
    4. 字符串使用单引号才可以。
    5. 变量赋值不需要提前声明,随时使用。
    6. clear清除变量,clc清除屏幕。
    7. who和whos查看我们已经拥有的变量的各项树形。
    8. 类型强制转换。

    ·本讲准备

    把matlab编码调整为utf-8编码

    首先,删除这个部分(一定先备份这个lcdata.xml文件,备份就是拷贝一个副本),我的是2016版,大概在这里,你们可以搜索以下:

    然后,找到这个部分,增加一行:

    最后,重启matlab软件,即可把编码更改为utf-8编码。 

    ·本讲开始

    在别的语言中,都能使用文件写代码,然后使用解释器运行或者使用编译器编译运行,比如 .c .cpp .py .go等,matlab也是一门语言,也可以使用文件来编程,在matlab中使用文件编程有以下注意事项:

    1. 后缀名是 .m
    2. 注释符号是 %
    3. 建议在所有语句后面加分号(;),否则运行时会当作交互式命令输出结果,从而掩盖我们的重要信息。
    4. 文件名仅包含字母、下划线、数字且不能以数字开头。
    5. 编写文件前检查自己是否在工作目录

    编写文件时,我们可以选择使用matlab本身的编辑文档编写,也可以选择自己的喜爱的编辑器比如vim,如下图所示:

    如果使用edit后面没有加文件名,情况如下图所示:

    当我们没有键入文件名字,需要按下保存键去保存。

    ·开始编程

    下面以m01_hello.m文件为例,首先打开文件写入如下代码(建议选择matlab本身编辑,有自动补全。当然也可以使用别的编辑器)

    % 这里是注释行,这个文件演示如何使用文件编辑代码
    disp('首先演示后面都加了分号的代码');
    age = 20;
    name = 'chuckiezhu';
    sentence = '你好啊!';
    print_str = sprintf('%s年龄是%d.他说:"%s"\n', name, age, sentence);
    % sprintf是格式化字符串的函数,返回一个格式化后的字符串
    disp(print_str);  % 显示目标字符串
    disp('---------------分割线---------------------')
    disp('然后演示后面都不加分号的代码')
    age = 20
    name = 'chuckiezhu'
    sentence = '你好啊!'
    print_str = sprintf('%s年龄是%d.他说:"%s"\n', name, age, sentence)
    % sprintf是格式化字符串的函数,返回一个格式化后的字符串
    disp(print_str)  % 显示目标字符串

    ·运行程序

    matlab运行程序时要有以下注意事项:

    1. 文件名只能包含数字、下划线、字母且只能以字母开头
    2. 文件要包含在工作目录内,即使用ls命令能看到,如下图
    3. 输入文件名然后回车直接运行程序,如图

    下面是上面代码的运行结果:

    可以看到运行出了结果,至于行尾加不加分号,凭个人喜好,但是我这里有两点建议:

    1. 调试程序时,最好不要加分号,这样可以看到每一步的运行结果和自己的想法是否符合。 
    2. 实际运行程序时,加分号,防止交互式输出影响我们的结果观测。

    ·知识点小结

    今天我们学习了如下知识:

    1. 如何在matlab中显示一句话(使用disp函数)
    2. 怎么格式化一个字符串(使用sprintf函数)
    3. 如何在文件中编写matlab代码(包括使用注释)
    4. 如何调整matlab中的字符编码为utf-8
    5. 编写.m文件时,行尾的分号什么时候使用效果最佳

    ·文末彩蛋

    表白神器,代码如下:

    [x,y,z]=meshgrid(linspace(-1.3,1.3)); 
    val=(x.^2 + (9/4)*y.^2 + z.^2 - 1).^3 - x.^2.*z.^3 - (9/80)*y.^2.*z.^3;
    isosurface(x,y,z,val,0)
    axis equal 
    view(-10,24)
    colormap flag 
    camlight
    lighting phong

    运行效果如图:

    下期再见! 

    ----------------------------------------------2020年6月6日更新

    关于代码中第六行sprintf的用法:

    先给各位道歉,我以为你们都有C语言的基础,以后我会注意这些问题。

    sprintf函数的使用,现在的阶段我们可以理解为这样(如果以后需要用到更高级的用法再讲,一切实用为主):

    sprintf(p1[, p2 ...]);

    这里的p1是必需的,代表我们的原来的、未经处理的字符串。方括号内是可选的,用于添加参数,比如文章中的代码:

    sprintf('%s年龄是%d.他说:"%s"\n', name, age, sentence);

    %s %d 是“占位符”,就是说占着这个位置,然后用后面的多余的参数来填。

    %s占一个字符串的位置,%d占一个整数的位置.

    \n则是一个换行,类似的有\t(一个制表符位),\r (回车)等。

    sprintf返回一个字符串,就是结果字符串。

     

    disp则是将某个字符串显示到终端中。

    展开全文
  • 里面讲述了数组与矩阵的构建,以及Matlab绘图指导,还有Matlab在《微积分》中的应用,非常适合初学者,值得一看!
  • matlab开发教程 MATLAB基本操作 MATLAB数值计算 MATLAB符号计算 MATLAB图形处理 MATLAB程序设计 MATLAB实际应用
  • 信号和系统matlab使用教程.ppt
  • Matlab标定工具箱使用教程 这个教程将带你完整地利用20到25张平面棋盘格图像进行相机标定。 这个教程将让你学会如何使用所有工具箱的特征:载入图像、提取图像角点、运行标定引擎、显示结果、控制精度 添加和删减...

    Camera Calibration Toolbox for Matlab使用教程

    这个教程将带你完整地利用20到25张平面棋盘格图像进行相机标定。
    这个教程将让你学会如何使用所有工具箱的特征:载入图像、提取图像角点、运行标定引擎、显示结果、控制精度
    添加和删减图像、图像矫正、导出标定不同格式的数据...这个教程对于刚开始使用工具箱的人来说非常重要。
    
    首先下载Matlab标定工具箱:
    [http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html]
    (http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html)
    
    将其解压到Matlab的工作目录下,然后将其包含到matlab的工作路径下。
    运行calib_gui就可以打开matlab标定工具箱主界面:
    

    1、将标定用的图像单独存放于calib_example文件夹中。
    2、在matlab中,进入到calib_example文件夹中。
    
    3、读取图像:
    
        点击标定工具窗口中的“Image names”按钮。输入标定图像的基名和图像的格式(例如标定图像的名称分别是
        Img1.jpg,Img2.jpg,Img3.jpg...基名就是Img 图像格式就是jpg)
        然后所有的标定图像都将加载进来,其对应的变量名分别是I_1,I_2,...图像数量对应的变量是n_ima。
        载入完图像之后的图像如下:
    

    之后载入的图像将以缩略图的形式显示出来:
    

    一些图像内存不足的问题在此就不作详细的介绍了,现在一般的电脑RAM都是足够来做标定的。
    

    4、提取角点:
    点击标定工具箱上的“Extract grid corners”按钮。在matlab命令行会出现如下提示信息:
    

    直接按“Enter”(没有参数)选择所有的图像,否则就需要输入图像索引如[2 5 8 10 12]来提取这些图像中的
    角点。然后通过直接输入“Enter”来选择默认的角点寻找窗口尺寸:wintx=winty=5。这就产生了一个11X11个像素
    有效的窗口尺寸:
    

    角点提取引擎有一个对网格中的方格个数进行计数的自动机制。这个工具尤其对于图像数量大的时候非常便利,因为
    用户不需要手工地输入X和Y方向方格的数量。然而对于极少数场合,这个工具可能不能得到正确的方格数量,这种情况
    只有当镜头有很大的畸变。在这种情况下,角点提取这个过程,工具箱提供了一个可选项可供用户关闭自动计数方格。
    在这个特殊的模式下,使用者优先对每张图像使用方格自动计数功能,因此,直接按“Enter”键默认。(通常情况
    下都使用默认形式,然后如果确实有需要,再重新处理几张有问题的图像。)
    

    然后第一张标定图像就会显示出来:
    

    然后点击长方形棋盘格的四个边角点。选择的位置在下图中显示出来(注意:尽量精确地点击这四个角点,控制
    在实际角点的5个像素范围内,否则一些角点可能会被检测器丢失掉)
    
    点击的顺序规则:第一个点被用来作为棋盘格坐标系的原点。其他三个点可以以任何顺序点击。第一个点击的的点
    非常重要,尤其是对于多相机的情况(例如当计算几个相机在空间之间的相互关系的时候)。当处理多相机系统时
    对于不同的相机标定图像需要总是选择同一个棋盘格坐标系。三维标定可以运行stereo_gui.m.
    

    第一个点的选择非常重要,一定要注意

    经过上面的步骤之后,标定棋盘的边界就显示出来了:
    

    输入网格中每个方格在X和Y方向上的尺寸dX和dY(在这里,dX=dY=30mm=default values):
    

    注意:你可以直接输入“Enter”直接用默认参数,程序会自动对各个方向的方格数进行计数,然后在显示出没有
    畸变的预估角点。
    

    如果预估的角点很接近实际的图像角点,则下面的步骤就可以略过了(如果没有那么大的图像畸变)。在现在的
    图像中:预估的角点足够接近实际的图像角点。因此,没有必要通过输入一个猜测的径向畸变系数去帮助软件去
    检测图像角点。直接输入“Enter”,会使用这些初始的预估角点作为提取的角点:
    

    然后图像角点就被自动地提取出来了,然后显示出来,如下图所示:
    

    角点以大约0.1个像素的精度被提取出来。
    对第2、3、4...图像采用上述同样的步骤。如下图是将图像2、3、4..图像的角点提取出来:
    

    从上面观察到方格尺寸dX、dY总是被保持在它们的初始值(30mm).
    
    有时,预估的角点不是那么足够地接近实际图像角点,在这种情况下,就有必要通过输入一个镜头畸变系数来调整
    预估角点。第15张图像就是这种情况,在这张图像中,预估角点的图像如下图所示:
    

    可以看到一些预估角点和实际图像的角点的差距很大,这样就会导致错误的角点提取。而这产生的原因就是因为
    图像畸变。为了帮助系统更好地判断角点的位置,用户可以手动地输入一个镜头畸变系数Kc.为了输入镜头畸变
    系数,我们需要在那个问题“Need of an initial guess for distortion?”这里输入一个非空参数,这里
    我们输入畸变系数Kc=-0.3(一般这个系数在-1到1之间)。如下图所示:
    

    根据这个畸变系数,新的预估角点位置如下图所示:
    

    如果新的预估角点足够接近实际的图像角点(如上图所示),则输入任何不为空的字符(如1)作为问题“Satisfied
    with distortion?”的回答。然后亚像素角点的位置就会使用新的带有图像畸变的预估位置进行计算。
    

    如果我们还不满意,我们可以输入一个空的字符串作为问题"Satisfied with distortion?"(直接输入“Enter”)
    然后尝试一个新的畸变系数Kc。你可能会重复很多次这样的过程直到对结果满意为止。
    

    注意:上面用到的畸变的值仅仅是用来帮助提取角点,其不会影响下面主要的标定过程。换句话说,这里的畸变系数并不会作为最终的畸变结果,也不会用于优化畸变系数的初始值

    最后检测到的角点如下图所示:
    

    对剩下的几张图片重复上述过程(图片16-20).然而对这些图像,不要使用预先的畸变系数这个选项,尽管提取的
    角点不是很正确。在下面的步骤中,我们将纠正它们(在这个例子中,我们不会使用畸变系数这个选项用于图像15
    但是这样对于我们证明很有用)。
    

    在角点提取之后,就会自动产生一个calib_data.mat的matlab数据文件。这个文件包含了整个角点提取过程中
    的所有信息(图像坐标,对应的3D网格坐标,网格尺寸....)。这个文件是为了防止matlab突然崩溃而创立的。
    载入这个文件可以避免你又重复一遍上面的过程。
    
    在你自己标定的过程中,当图像中有大的畸变的时候,这个程序可能不能够在网格中自动对方格进行计数,在这种
    情况下,X和Y方向的方格数量必须手动输入。这在这个例子中没有出现这种情况。
    
    在你自己做标定的时候,还有一种情况会出现。如果镜头畸变非常严重(像鱼眼镜头),这个基于单个畸变系数的
    简化的指导工具对角点的初始预估可能就不够用。
    对于这几种麻烦的情况,在工具箱中的一个脚本程序支持完全手动的角点提取(例如每次点击一个角点)。脚本文
    件叫做“manual_corner_exteaction.m”(在内存优化模式下,你可以使用"manual_corner_
    extraction_no_read.m"),并且应该在传统的角点提取代码运行之后才能执行这个代码。(因为它基于传统的
    角点提取的一些数据)。
    
    显然,这种角点提取的方法当图像数量多的时候是非常耗时的。因为它作为当前面的尝试都失败的情况下的一种
    救命稻草。但完全可以不用太担心这个,在这个例子中不会出现这种情况。
    

    主要的标定步骤:

    在角点提取完之后,就可以单击标定工具箱面板上的“Calibration”来运行主要的相机标定程序。
    
    标定主要通过两个步骤来完成:初次初始化以及非线性优化。
    初始化步骤中对标定参数进行闭环计算,这个过程不包括任何镜头畸变(程序名:init_calib_param.m)
    非线性优化过程中将对所有的标定参数最小化总体映射误差(从最小二乘的角度出发)(9个内参以及6X20=129、
    个外参)。优化是对特定雅可比矩阵进行计算然后往梯度下降的方向进行的。
    

    标定参数存储在一系列变量中。注意切向畸变系数和第6个径向畸变系数没有没有被估算(这是默认的模式)。因此
    在像素坐标中X和Y之间是90°。在大多数实际情况中,这是一个很理想化的设想。然而,接下来,将会讲述一种介绍
    在优化中切向畸变alpha_c的方法。
    
    从上图中我们可以注意到:为了达到最小值,只用了11次梯度迭代。这就意味着只有11次对映射函数、雅可比计算
    以及求逆的评估。快速收敛的一个原因就是初始化程序所要计算的参数的有一个好的初始预估值。
    现在,忽略推荐的可以减少畸变的模型的系统。对一个模型的复杂性进行判断的映射误差仍然很大。这主要是因为
    对于一些图像一些网格角点并没有被精确地提取。
    
    单击面板上的“Reproject on images”来将网格角点映射到原始图像中。这些映射是基于当前的内参和外参计算
    出来的。输入一个空字符(直接按"Enter")作为“Number(s) of image(s) to show([]=all images)”来
    表示你想查看所有图像:
    

    下面的图像显示了最初的四张检测到的角点的图像(红色的叉)以及映射的网格角点(圆)。
    

    映射误差也以有颜色的叉叉显示在图中:
    

    为了退出误差分析工具,在图像上的任何位置右击(稍后你将会理解这个选项的使用)。
    
    在面板中单击“Show Extrinsic”。外参(棋盘格相对于相机的相对位置)就以3D的形式显示出来了:
    

    在上图中,坐标系(Oc,Xc,Yc,Zc)是相机的参考坐标系。红色的金字塔状的就是由图像平面定义的相机的有效
    视场。可以在相机坐标系视角或者世界坐标系视角之间切换:
    

    在这个视角里面,每个相机的位姿都用绿色的金字塔表示。
    
    现在我们回到前面的误差分析那一段,注意到在很多图像中的投影误差是非常大的。原因就是我们在一些高度畸变
    的图像的角点提取工作做得不到位。然而,我们现在可以通过对所有图像重新计算图像角点来进行矫正。接下来需要
    做的就是:单击面板中的“Recomp. corners”按钮,然后再次选择角点检测器的窗口尺寸(wintx=winty=5这个
    默认值)。
    

    对于最后问题“Number(s) of image(s) to process”亦然输入“Enter”选择默认值去重新计算所有图像中的
    角点。然后就是选择角点提取的方式:自动和手动,自动的就是使用重新投影的网格作为角点的初始预估位置。手
    动的方式就需要使用者手动的提取角点。在现在这样的条件下,因为重投影的网格点非常接近实际的图像角点,因此
    我们选择自动的方式:直接“Enter”输入默认值。所有图像的角点就会被重新计算。你的matlab命令行窗口就会出
    现下面这种形式:
    

    然后通过单击“Calibration”进行一次标定优化:
    

    可以注意到只需要6次迭代就收敛了,并且没有进行初始化过程(因为优化是在前面标定的结果之上进行的)。上图
    中的两个值0.12668和0.12604分别是X和Y方向像素上投影的标准差。注意到标定参数的不确定性也进行了估算。
    数值大概是标准差的3倍。
    
    优化之后,单击“Save”保存标定结果(内参和外参)到matlab文件“Calib_Results.mat”
    

    我们再次单击“Reproject on images”将网格点投影到原始图像中。前四张图像如下图所示:
    

    然后再“Analyse error”看看新的投影误差(可以看到误差比之前更小了):
    

    右击上面的误差图像(退出误差分析工具),单击“Show Extrinsic”看看棋盘格相对于相机的3D位置关系:
    

    工具“Analyse error”允许你去检查哪个点对应大的误差。单击“Analyse error”并且选择图像由上角的那个点
    

    单击选中之后,下面的信息就会出现在命令行窗口:
    

    这就意味着对应的点在第18张图像中,在标定板网格坐标的(0,0)的位置(标定板的原点)。下图是此点到原始
    图像的距离。
    

    误差检查工具对于在一张或多张图像中角点提取失败的情况下非常有用。在这种情况下,使用者可以使用不同的窗
    口尺寸去重新对于特定图像的角度进行重新计算。
    
    例如,我们使用窗口尺寸(wintx=winty=9)来对所有图像的角点进行计算,但对图像20我们使用(wintx=winty
    =5)的窗口尺寸,对图像5,7,8,19我们采用(wintx=winty=7),图像18采用(wintx=winty=8)的窗口
    尺寸进行计算。角点的提取会调用三次“Recomp.corners”。第一次调用使用wintx=winty=9来处理图像1,2,
    3,4,6,9,10,11,12,13,14,15,16和17.然后选择自动模式:
    

    第二次调用,使用wintx=winty=8来处理图像18,然后再次选择自动模式:
    

    第三次调用,使用wintx=winty=7来处理图像5,7,8和19:
    

    单击“Calibration”进行重新标定:
    

    观察上面的投影误差(0.11689,0.11500)比前面的更小了。另外注意到,标定参数的不确定性也更小了。通过单击“Analyse error”来检测误差:
    

    让我们来看看前面那个兴趣图像18中的点,在标定板的网格坐标(0,0)处。单击“Reproject on images”然后
    选择只显示图像18(当然在此之前你必须右击误差分析图像退出误差分析工具):
    

    放大图像我们可以看到更小的投影误差:
    

    单击“Save”保存标定结果到文件“Calib_Results.mat”中:
    

    可以看到前面的标定结果已经被拷贝到文件“Calib_Results_old0.mat”中。
    

    现在多加5张图像来重新进行相机标定。然后“Read images”把所有的25张图像载入内存。然后以缩略图显示:
    

    单击“Extract grid corners”来对新的5张图像进行角点提取,窗口尺寸用wintx=winty=5:
    

    以传统的角度提取过程对这5张图像进行角点提取。然后单击“Calibration”运行又一次优化:
    

    接下来,使用不同的窗口尺寸对最后的四张图像进行重新计算。对图像22和24使wintx=winty=9,对图23使用
    wintx=winty=8,对图像25使用wintx=winty=6。然后按照前面介绍的过程重新进行一次(三次调用“Recomp.corners
    ”),重新计算之后,再次运行“Calibration”:
    

    然后“Save”保存标定结果。
    

    作为练习,我们去除图像16,18,19,24和25然后重新进行标定:
    单击“Add/Suppress images”
    

    输入要去掉的图像([16 18 19 24 25]):
    

    重新“Calibration”进行标定:
    

    “Add/Supress images”取决于使用者是否需要某些图像。实际上,这个函数只是简单地更新active_image这个
    向量,使对应的图像索引为0或1.
    接下来,载入之前标定的结果“Load”:
    

    现在又回到了没有去掉图像之前的状态了。现在我们实现一次含有用来描述X和Y像素之间角度的切向因素alpha_c
    进行的标定。为此,我们需要将est_alpha设置为1(在命令行中进行)。As an exercise, let us fit the 
    radial distortion model up to the 6th order (up to now, it was up to the 4th order, with
     tangential distortion). For that, set the last entry of the vector est_dist to one: 
    

    然后重新运行“Calibration”:
    

    优化之后可以看到,切向因素非常接近0(alpha_c=0.00042),这就意味着X和Y像素之间的角度非常接近90°
    (89.976°)。这调整了之前的90°的设想。另外,注意到第6个径向畸变系数非常大。在这种情况下,我们最好
    就是不使用它的估算值。在这里,我们直接将est_dist最后一个量设置为0:
    

    再次“Calibration”:
    

    如果标定结果满意的话就“Save”保存标定结果。
    

    为了选择合理的畸变模型来使用,通常可视化对像素图像的畸变影响以及畸变的径向部分和切向部分
    的比对是非常有用的。为此,在matlab命令行运行visualize_distortions,就会有三张图出来:
    

    第一幅图显示了整体的畸变模型对图像每个像素的影响。每个箭头表示由于镜头畸变而使一个像素发生的位移效果。
    可以看到图像角落处的像素移动了25个像素。第二幅图显示了畸变的切向部分。在这幅图中,最大的位移式0.14个
    像素,在图像的左上角。最后,第三幅图显示了畸变的径向部分的影响。这幅图和第一幅图有点相似。说明畸变的切
    向部分相对于整体模型来说可以忽略不计。在第三幅图中,十字叉表示了图像的中心,而圆表示光心所在的位置。
    
    现在我们来试验一下,当没有畸变的情况下标定会有什么结果。使Kc=[0;0;0;0;0],并且fc没有各向异性(使fc
    几个方向都相等):
    

    然后,运行一次优化“Calibration”:
    

    和预期一样,畸变系数向量Kc都是0,焦距各个方向都相当,fc1=fc2。在实际中,这种标定的模型是不推荐的:
    因为在没有各向异性的幸亏下去估算切向畸变是没有意义的。通常情况下,除非有特定的应用,一般推荐在模型中评
    估各向异性。对于畸变模型,一般经常只对其中一些系数进行优化。例如,将est_dist设置为【1;0;0;0】
    只对第一个畸变系数kc(1)进行估算而把其他三个畸变系数直接置0.这种模型也叫作第二对称性径向畸变模型。它
    是一个非常可行的模型,尤其是当使用比较低的畸变光学系统(昂贵的镜头),或者当用来标定的图像很少的时候。
    另一个比较常用的畸变模型是第4对称性径向畸变模型而没有切向部分畸变(est_dist=[1;1;0;0])。这个模
    型被zhang使用并被调整了,基于现在大多的镜头制造在聚焦方面都没有缺陷。这个模型可以很好地用于现在这个
    例子中,从前面三个图也可以看出,这个镜头的切向部分畸变远小于径向部分畸变。
    
    最后,让我们来做一次,没有各向异性fc(2)/fc(1),光心cc,畸变系数kc,切向系数alpha_c的优化。为此
    

    一般地,如果光心没有被估算,则最好的预估值就是图像的中心:
    

    然后运行“Calibration”:
    

    从上面可以看到,光心cc优化后还在图像的中心(因为center_optim=0)
    
    接下来,载入原来的标定结果:
    


    标定工具箱的其他功能
    

    仅仅计算外参:

    我们可以只计算图像的外参,而内参直接用之前标定好的结果,在前面标定好的基础上,输入一张图像,然后在面板
    上“Comp.Extrinsic”,就可以在matlab的命令行中出现下面的情况:
    

    外参在Rc_ext和Tc_ext两个变量中,另外一个变量omc_ext和Rc_ext一个效果,可以将omc_ext用罗得里格斯
    变换进行转换Rc_ext=rodrigues(omc_ext)。
    


    图像矫正

    这个函数帮助你利用之前标定的内参得到一些没有畸变的图像。
    
    作为一个练习,我们来对图像20进行矫正。
    在面板中单击“Undistort image”:
    

    输入1来选择一张要矫正的图像,注意不要输入图像的扩展名,只输入Image20就可以,然后是图像的类型。
    

    初始图像存储在矩阵I中,如下图所示:
    

    矫正过的图像存储在矩阵I2中,如下图所示:
    

    新产生的矫正的图像也存储成Image20_rect.tif。
    
    现在我们来矫正所有的图像。“Undistort image”,然后对第一个问题输入空参数。然后所有的标定图像都将被
    矫正,然后存储为Image_rect1.tif,Image_rect2.tif...
    

    也可以将标定数据导出为其他格式的数据:这样当你使用同样的数据来做标定,然后进行对比的时候是非常有用的
    这个可以在角点提取阶段使用,单击“Export calib data”:
    

    输入0选择使用Willson Heikkil格式,输入数据名(shot),然后每张图像的标定数据就会被保存为shot1,shot2,...
    

    也可以导出为zhang的格式。“Export calib data”,然后输入1.然后输入两个文件基名:一个是3D模型坐标(Model),
    另一个是图像坐标(data)。然后程序会创建一系列的text(Model1.txt,data1.txt,...),可以被zhang的
    代码直接使用:
    


    以上是matlab标定工具箱的使用教程,有一些不对的地方希望补充完善。 
    
    展开全文
  • MATLAB 语言程序设计基础,MATLAB 语言是当前国际上自动控制领域的首选 计算机语言,也是很多理工科专业最适合的计算机数 学语言。
  • matlab使用libsvm进行分类代码实例, 这里包括一个数据集合, 一个代码(包括详细注释),而且代码经过修改,已经符合最新的libsvm调用格式,不会出错,用于SVM分类。 首先通过博客,安装好libsvm库,博客地址:...
  • matlab教程

    2013-03-26 16:32:09
    matlab教程
  • 讲授MATLAB语言基础入门知识,介绍MATLAB产品的体系、MATLAB桌面工具的使用方法,重点介绍MATLAB的数据可视化、数值计算的基本步骤以及如何使用MATLAB语言编写整洁、高效、规范的程序。并涉及到一些具体的专业应用...
  • M AT L A B是一个可视化的计算程序,被广泛地使用于从个人计算机到超级计算机范围内 的各种计算机上。 M AT L A B包括命令控制、可编程,有上百个预先定义好的命令和函数。这些函数能通过 用户自定义函数进一步扩展...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,134
精华内容 13,653
关键字:

matlab使用教程

matlab 订阅