%% 附 原帖所讨论的问题。
% 各位大侠,本人用1组35张图片,标定相机参数。分别用MATLAB和OPENCV分别标定,标定结果基本一致。
% 现在,我希望从标定的一副图像中(使用这幅图像标定的相机外参),计算图像上几个红点之间的在3维世界坐标系下的距离(mm)。
%
% 相机标定的结果:
% 1、 相机内参:
% Focal Length: fc = [ 854.37091 855.65897 ] ?[ 6.10263 6.00058 ]
% Principal point: cc = [ 369.52264 296.19708 ] ?[ 5.51474 5.45121 ]
% Skew:alpha_c = [ 0.00000 ] ?[ 0.00000 ] => angle of pixel axes = 90.00000 ?0.00000 degrees
% Distortion: kc = [ -0.09667 0.12791 -0.00171 -0.00139 0.00000 ] ?[ 0.02533 0.19119 0.00167 0.00185 0.00000 ]
% Pixel error: err = [ 0.20807 0.26036 ]
% 相机的传感器尺寸:
% size Width/mm Height/mm Width/(像素) Height/(像素) Sx Sy
% 1/2’ 6.4 4.8 656 492 9.75um/p 9.75um/p
%
% 2、对本图的相机外参:
%
% Translation vector: Tc_ext = [-69.316901 -51.302449 237.121385 ]
% Rotation vector: omc_ext = [ -1.923062 -1.999779 -0.515738 ]
% Rotation matrix: Rc_ext = [-0.042297 0.998969 0.016462
% 0.880689 0.029498 0.472776
% 0.471803 0.034495 -0.881029 ]
% Pixel error: err = [ 0.31120 0.39245 ]
%
% 3.通过图像处理方法提取关键点坐标,分别获取了图像上两个红色圆圈所代表的位置在图像上的坐标(像素):W1(108.69794,4.6928058),W2(226.48865,8.7926397),在3维空间中,W1和W2两点之间的物理实际距离为30mm。
% 现想通过将W1和W2坐标从图像坐标系变换到世界坐标系,计算两点间的距离,是否和实际结果对应,之后,在这个标定板所放置的物理位置上进行产品尺寸的精确测量。这种应用在商用机器视觉软件HALCON中已有应用。我想通过OPENCV实现。
%% ------------------------------------
clear all;
clc;
%% 用来验证像素尺寸等内容的程序
Rc_ext = [-0.042297 0.998969 0.016462;
0.880689 0.029498 0.472776;
0.471803 0.034495 -0.881029 ];
% addpath(genpath('E:实验常用子程序'));
% Phi = Ges_Cal(Rc_ext')
Tc_ext = [-69.316901 -51.302449 237.121385 ]';
Depth = Rc_ext'*Tc_ext;
Physical_distance = 1.15*Depth(3)/8.3; %% 真实的物理距离
%% 下面是程序的说明。
第一步:传感器尺寸可以推出每个像素的物理尺寸:6.4/656或者 4.8/492 = 0.0098
第二步:摄像机焦距fc的物理尺寸等于fc*0.0098毫米 = 8.3毫米(不考虑畸变);
第三步:像素平面上,两个红点之间的距离为sqrt((226.48865 - 108.69794)^2 + (8.7926397 - 4.6928058))*0.0098毫米 = 1.1554毫米;
因此,红点之间的真实物理距离为:1.15*Depth(3)/8.3
结论:不考虑畸变的时候,误差为2-3mm