TSAI相机标定(matlab)

在做一维测量、三维测量之前,必须先对视觉系统进行标定;这里给出由matlab实现的TSAI标定方法,当然matlab里面也有自带的张正友标定法模块。

直接上代码:

%清空变量,关闭窗口
clear;close all;
%读取图像
img=imread('1.bmp');
I1=imread('1.bmp');
[M,N]=size(I1);%使用最大类间方差法找到图片的一个合适的阈值
level=graythresh(I1);   %设level为阈值,将图片二值化
I1=im2bw(I1,level);   %开操作一般应用在二值图像分析处理的基础上,使对象的轮廓变得光滑,断开狭窄的间断和消除细的突出物。
%主要用来保留某种结构操作,消除其他不符合结构区域的前景区域像素。%创建半径为2的圆盘结构元素
se=strel('disk',1);
%用创建好的结构元素对图形开操作
openI1=imopen(I1,se);  %把连通域面积小于4个像素的都删掉
L=bwareaopen(I1,4);
% 获得图像99个联通域的属性(面积大小,重心位置,包围该区域的最小矩形),生成一个结构体stats
stats = regionprops(L, 'basic');
% 用CAT函数将stats结构体中的重心数据提取出来
zhongxin=cat(1,stats.Centroid);
[M,N]=size(zhongxin);
figure(1)
imshow(L),title('二值化后图像中心坐标'),hold on
for i=1:Mplot(zhongxin(i,1),zhongxin(i,2),'r*');
end%%图片的重心数据保存在一个矩阵里,由于regionprops函数的原因,此函数会将连通域按从小到大的顺序排列,所以得到的重心数据并不是一一对应的,需要使用排序算法对这些数据进行重新排列。排序算法如下:% 冒泡排序,将顺序未知的坐标按位置排序
for a=0:10
for i=1+9*a:9+9*aX(i,1)=zhongxin(i,1);X(i,2)=zhongxin(i,2);
end
for j=1:8for k=1+9*a:9+9*a-1if X(k+1,2)<X(k,2)temp1=X(k,1);temp2=X(k,2);X(k,1)=X(k+1,1);X(k,2)=X(k+1,2);X(k+1,1)=temp1;X(k+1,2)=temp2;endend
end
end
% 得到所有重心的坐标
for i=1:11u(:,i) =X(1+9*(i-1):9*i,1);v(:,i) = X(1+9*(i-1):9*i,2);
end%%由我编写的冒泡排序算法将各个连通域的重心坐标按照从左到右,从上到下的顺序排列好,方便对应相应的世界坐标。排序好的重心坐标的横纵坐标需要按找每一列或每一行的顺序使用最小二乘法拟合直线,方法如下(使用polyfit函数):% 9条水平直线的斜率和截距
for i=1:9Y1(i,:)=polyfit(u(i,:),v(i,:),1);
end
% 11条竖线的斜率和截距
for i=1:11Y2(i,:)=polyfit(u(:,i),v(:,i),1);
end
% 得到两直线相交的坐标
for i=1:9for j=1:11a1=Y1(i,1);a2=Y2(j,1);b1=Y1(i,2);b2=Y2(j,2);x=(b2-b1)/(a1-a2);   %solve( ( a1-a2)*x==b2-b1 );M1(i,j)=x;                %交点的X坐标(像素)M2(i,j)=Y1(i,1)*x+Y1(i,2);    %交点的Y坐标(像素)end
end
%检验
figure(2)
imshow(L),title('所有直线在图像中的位置和交点'),hold on
for i=1:9for j=1:11plot(M1(i,j),M2(i,j),'b*');end
end
for i=1:9pxi=linspace(1,2100);pyi=Y1(i,1)*pxi+Y1(i,2);plot(pxi,pyi,'g');
end
for j=1:11pxi=linspace(1,2800);pyi=Y2(j,1)*pxi+Y2(j,2);plot(pxi,pyi,'r');
end%以中间圆点为原点建立世界坐标系
for i=1:9for j=1:11XW(i,j)=10*(i-4);  %以中心圆点为世界坐标中心计算下其它圆点的世界坐标(横坐标)YW(i,j)=10*(j-5);  %以中心圆点为世界坐标中心计算下其它圆点的世界坐标(纵坐标)end
end
% 将9X11的像素坐标矩阵转化为99X1的像素坐标矩阵,保证符合TSAI函数的要求
k=1;
for i=1:9for j=1:11Xf(k,1)=M1(i,j);  %每个点的横坐标(像素)Yf(k,1)=M2(i,j);  %每个点的纵坐标(像素)k=k+1;end
end
% 将9X11的世界坐标矩阵转化为99X1的世界坐标矩阵,保证符合TSAI函数的要求
k=1;
for i=1:9for j=1:11xw(k,1)=XW(i,j);  %每个点的横坐标(世界)yw(k,1)=YW(i,j);  %每个点的纵坐标(世界)k=k+1;end
end
zw=zeros(99,1); %由于选择标定板中心圆点为世界坐标系原点,所以z的世界坐标都为0
Ncx=1;              %图像的缩放比都为1
Nfx=1;
Cx=512;
Cy=640;            %获得的1024X1280大小的图片的中心点(512,640)
dx=0.0048;        %相元尺寸
dy=0.0048;
sx=1;                 %固定为1%%使用TSAI算法计算相机的相应参数:
%%[R, T, f, k1] = Tsai(Xf, Yf, xw, yw, zw, Ncx, Nfx, dx, dy, Cx, Cy, sx);
%%TSAI算法需要的参数为各个重心的像素坐标,对应的世界坐标,图像的横纵拉伸比,相机的相元尺寸,相机拍出图像的中心坐标(分辨率的一半),和一个常数se=1;[R, T, f, k1] = Tsai(Xf, Yf, xw, yw, zw, Ncx, Nfx, dx, dy, Cx, Cy, sx);disp('相机焦距是:' );
f
disp('旋转矩阵是:');
R
disp('平移矩阵是:');
T
disp('畸变参数是:');
k1

其中最后所需要的TSAI函数可下载!!配套使用

TSAI法相机标定(matlab)相关推荐

  1. 相机标定 matlab opencv ROS三种方法标定步骤(1)

    一 . 理解摄像机模型,网上有很多讲解的十分详细,在这里我只是记录我的整合出来的资料和我的部分理解 计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系,实际上就是要用矩阵来表 示各个 ...

  2. 【计算机视觉】张正友标定法相机标定

    目录 一.相机标定 二.张正友标定法 2.1 张正友标定法概述 2.2 张正友标定法原理 2.2.1 坐标系 2.2.2 内参矩阵计算 2.2.3 外参矩阵计算 2.2.4 极大似然估计 2.2.5  ...

  3. 相机标定 matlab opencv ROS三种方法标定步骤(2)

    二  ubuntu下Opencv的相机标定 一般直接用Opencv的源码就可以进行相机的标定,但是可能只是会实现结果,却不懂实现的过程,我也是模模糊糊的看了<计算机视觉中的多视图几何>以及 ...

  4. 相机标定 matlab opencv ROS三种方法标定步骤(3)

    三 ,  ROS 环境下 如何进行相机标定 刚开始做到的时候遇到一些问题没有记录下来,现在回头写的时候都是没有错误的结果了,首先使用ROS标定相机, 要知道如何查看节点之间的流程图  rosrun r ...

  5. 最简单的针孔相机模型标定方法,使用Matlab进行快速可视化相机标定,小白专用,超详细

    相机标定是机器视觉.SLAM等绕不开的环节,今天介绍一种最为简单的可视化标定方法. 这篇文章只是讲解如果标定,关于相机的标定原理,可以参考别的文章,这里推荐一篇<[机器视觉]张氏法相机标定> ...

  6. matlab相机标定程序,MATLAB单相机校准程序中文.pdf

    MATLAB单相机校准程序中文 单相机标定程序 相机标定概述 您可以使用相机标定程序估计相机内参数,外参数,镜头畸变参数.您可以使用 这些相机参数到多种计算机视觉应用.这些应用范围包括消除镜头畸变的影 ...

  7. 相机标定与矫正(总结)

    Overview 欢迎访问 持续更新: https://cgabc.xyz/posts/d12004a8/ What Is Camera Calibration? Camera Calibration ...

  8. python相机标定流程图_相机标定——OpenCV-Python Tutorials

    目标 我们将了解导致相机失真.扭曲的内因与外因 我们将试着找到这些畸变参数,并消除畸变 基础 如今大量廉价的摄像机导致了很多照片畸变.两个主要的畸变是径向畸变和切向畸变. 由于径向畸变,直线会变弯.距 ...

  9. 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)

    from:https://blog.csdn.net/dcrmg/article/details/52939318 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么 ...

最新文章

  1. html frame 菜单切换,官方底部导航如何通过frame0.html的JS控制切换
  2. SpringBoot依赖注入
  3. MYSQL教程之 concat
  4. php对象不公用属性赋值,php 框架 Model 公用的问题
  5. 64位双系统Ubuntu 14.04 LTS + Caffe + CUDA 7.5 + Opencv 3.0 安装配置实战
  6. 用于对Compound协议进行无Gas投票和委托的社区工具发布
  7. 框架选择的原因及其说明
  8. 开发APP不搞清楚这20个问题,必然沦为一场灾难
  9. eclipse中基于maven构建多模块项目
  10. 标准商业计划书大纲模版
  11. 易文档-快速编写专业漂亮的API文档,产品文档,使用手册
  12. 【青少年编程】【二级】小瓢虫找妈妈
  13. 唐朝诡事录之西行官宣
  14. windows聚焦壁纸不更新_win10系统锁屏壁纸聚焦不更新的解决方法
  15. CREO枕头模型制作
  16. 【最全】Google Chrome20-83各版本下载链接整理
  17. EasyPOI完美实现导入导出,实用简单,一行代码即可
  18. 使用docker容器运行java程序
  19. python阴(yin)阳(yang)谜题的分析
  20. 使用CSS给文字描边

热门文章

  1. win7蓝屏_win7操作系统服役结束。电脑蓝屏0X000000F4处理办法。
  2. Python+Yolov5果树上的水果(苹果)检测识别
  3. oracle基础回顾(超详细)
  4. 0014 c语言 数字分隔
  5. 基于java+jsp+ssm二手书交易管理系统
  6. linux 网卡天启与关闭,手把手教你Linux关闭防火墙命令
  7. BeautifulSoup
  8. js判断网页在手机端跳转到移动页面,script怎么写跳转移动端
  9. Ubuntu上新建文件夹以及多级目录命令和新建文件命令
  10. 帝国cms灵动调用,当前文章id文章高亮显示