Matlab 双目标定 自动化程序

Matlab 双目标定 自动化程序,第1张

%实现.m文件自动化双目标定

% Auto-generated by stereoCalibrator app on 10-Jul-2019

%-------------------------------------------------------

%function  stereoParams = tereoCameraCalibrator01(file_path01,file_path02)

h=waitbar(0,'计算中,请稍候!')%增加进度条

file_path01 =  'left\'% 图像文件夹路径

file_path02 =  'right\'% 图像文件夹路径

img_path_list01 = dir(strcat(file_path01,'*.png'))%获取该文件夹中所有.PNG格式的图像

img_num01 = length(img_path_list01)%获取图像总数

imageFileNames1 = cell(1,img_num01)

if img_num01 >0 %有满足条件的图像

for pn = 1:img_num01 %逐一读取图像

            image_name = img_path_list01(pn).name% 图像名

            %img_origin =  imread(strcat(file_path01,image_name))%读取图像

            imageFileNames1(1,pn) ={ strcat(file_path01,image_name)}

            %fprintf('%d %s\n',pn,strcat(file_path01,image_name))% 显示正在处理的图像名

                        %%此处添加具体的图像处理程序

end

end

img_path_list02 = dir(strcat(file_path02,'*.png'))%获取该文件夹中所有.PNG格式的图像

img_num02 = length(img_path_list02)%获取图像总数

imageFileNames2 = cell(1,img_num02)

if img_num02 >0 %有满足条件的图像

for pn = 1:img_num02 %逐一读取图像

            image_name = img_path_list02(pn).name% 图像名

            %img_origin =  imread(strcat(file_path01,image_name))%读取图像

            imageFileNames2(1,pn) ={ strcat(file_path02,image_name)}

            %fprintf('%d %s\n',pn,strcat(file_path01,image_name))% 显示正在处理的图像名

                        %%此处添加具体的图像处理程序

end

end

waitbar(0.1)

% Detect checkerboards in images

[imagePoints, boardSize, imagesUsed] = detectCheckerboardPoints(imageFileNames1, imageFileNames2)

waitbar(0.2)

% Generate world coordinates of the checkerboard keypoints

squareSize = 24  % in units of 'millimeters'

worldPoints = generateCheckerboardPoints(boardSize, squareSize)

waitbar(0.3)

% Read one of the images from the first stereo pair

I1 = imread(imageFileNames1{1})

[mrows, ncols, ~] = size(I1)

waitbar(0.4)

% Calibrate the camera

[stereoParams, pairsUsed, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints, ...

    'EstimateSkew', false, 'EstimateTangentialDistortion', true, ...

    'NumRadialDistortionCoefficients', 3, 'WorldUnits', 'millimeters', ...

    'InitialIntrinsicMatrix', [], 'InitialRadialDistortion', [], ...

    'ImageSize', [mrows, ncols])

waitbar(0.8)

% View reprojection errors

h1=figureshowReprojectionErrors(stereoParams)

% Visualize pattern locations

h2=figureshowExtrinsics(stereoParams, 'CameraCentric')

waitbar(0.9)

% Display parameter estimation errors

%displayErrors(estimationErrors, stereoParams)

% You can use the calibration data to rectify stereo images.

%I2 = imread(imageFileNames2{1})

%[J1, J2] = rectifyStereoImages(I1, I2, stereoParams)

% See additional examples of how to use the calibration data.  At the prompt type:

% showdemo('StereoCalibrationAndSceneReconstructionExample')

% showdemo('DepthEstimationFromStereoVideoExample')

fid=fopen('CameraParameter.txt','wt')

fprintf(fid,'stereoParams.RotationOfCamera2:\n')

fprintf(fid,'%f  %f  %f \n',stereoParams.RotationOfCamera2)

fprintf(fid,'stereoParams.TranslationOfCamera2:\n')

fprintf(fid,'%f  %f  %f\n',stereoParams.TranslationOfCamera2)

fprintf(fid,'stereoParams.CameraParameters1.IntrinsicMatrix:\n')

fprintf(fid,'%f  %f  %f\n',stereoParams.CameraParameters1.IntrinsicMatrix)

fprintf(fid,'stereoParams.CameraParameters2.IntrinsicMatrix:\n')

fprintf(fid,'%f  %f  %f\n',stereoParams.CameraParameters2.IntrinsicMatrix)

fclose(fid)

close(h)

%mcc -mv tereoCameraCalibrator01.m

单目运算符:只有一个 *** 作数,例如:

逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】这些是单目运算符

双目运算符:有两个 *** 作数,例如:

,+,-,*,/,=,== 

三目运算符:需要三个 *** 作数,例如:

?:

1.

双目运算概念

双目运算由双目运算符和参与运算的运算量构成。所谓双目运算符是指该运算符的左右两侧都必须有运算量。

常见的双目运算符有:+、-、*、/、%等。诸如x+y、x/y、x*y等运算均为双目运算。

2.

双目运算的要点

遇到双目运算,主要注意数据类型问题。具体有以下几点:

(1)

C语言要求:参与双目运算的两个运算量的类型必须一致;

(2)

双目运算的结果的类型必须与运算量的类型一致;

(3)

如果参与双目运算的两个运算量类型不一致,系统将自动把其中的一个进行类型转换,使两个运算量的类型一致后再进行运算。

自动转换的规则是:按“向高看齐”的原则进行转换。在几个基本的数据类型中,由高到低的排列顺序为:double,int,char。

比较:赋值运算中的类型转换

在赋值运算中,若遇到赋值号两侧的数据类型不一致,则也存在自动类型转换的问题,不过,它的转换规则与双目运算符的转换规则有所不同,它是按“向左看齐”的原则进行转换的,也即,是将赋值号右侧的量先转换为左侧的类型,然后再进行赋值。如有

int

x

x=1.9

则先将1.9转换为int型,变为1后再赋值给x。再如,double

y

y=2

则先将2转换为2.0,然后再赋值给y,结果y的值为2.0。

举例说明:

(1)

表达式

3+2

中,3和2类型一致(都是整型),符合双目运算的类型一致要求,所以直接运算,结果为5,也是整型。

(2)

表达式

3/2

中,3和2类型一致(都是整型),符合双目运算的类型一致要求,所以直接运算,但要注意,由于两个运算量都是整型,所以运算结果也必须是整型,3除以2的整数部分为1,所以3/2的结果是1,而不是2,更不是1.5,这是整数除法中特别要注意的地方。

又如19/5的整数部分是3,尽管其小数部分为0.8(超过了0.5),但19/5的结果仍然应该等于其整数部分的值3,而不能进行四舍五入变为4。

(3)

表达式

1.0+3

中,量个运算量的类型不一致,所以不能直接进行加法运算,必须先将整数3转换为double型常量3.0(注意,C中实数常量均为double型,而不是float型!),使表达式变为

1.0+3.0,然后才能进行加法运算,运算结果为4.0(不能写成整型4)。

又如,表达式

1.0+3/2

中,由于/运算符的优先级比+高,所以先运算3/2,刚才已经讲过,3/2的值应该为1,于是整个表达式变为

1.0+1(注意不要因为前面有一个1.0而把3/2的结果当作为1.5!),然后再将1作类型转换,变为1.0,最后再运算1.0+1.0,结果为2.0。

上述例子中的运算量均为常量,遇到变量时运算方法是一样的!

3.

双目运算实例

这是2000年4月二级C考试中的一道选择题:

下列程序的输出结果是

A)

3

B)

3.2

C)

0

D)

3.07

main()

{

double

d=3.2

int

x,y

 x=1.2

y=(x+3.8)/5.0

 printf("%d

\n",

d*y)

} 

本题中,程序先执行语句

x=1.2,根据赋值运算的类型转换规则,先将double型的常量1.2转换为int型,即取整为1,然后将1赋值给变量x。接下来执行语句y=(x+3.8)/5.0;根据运算符的优先级,先计算小括号内,再计算除法,最后执行赋值运算。小括号内的运算过程:先将整型变量x的值1转换为double型1.0,然后与3.8进行加法运算,得到中间结果4.8。接着进行除法运算4.8/5.0,其结果小于1.0,这里没有必要计算出精确值,因为接着进行赋值运算,赋值号左边的变量y的类型为整型,于是对这个小于1.0的中间结果进行取整,结果为0,于是变量y的值为0。因此该题的输出结果应该是0。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7891021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存