线结构光视觉传感器/线激光深度传感器标定工具
2016-06-11 13:33
513 查看
线结构光视觉系统有着结构简单、使用灵活、受周围光照环境影响小等一系列特点,在实际中得到广泛的应用。在该技术的使用中,标定是避免不了的一个环节。线结构光的标定过程大概可以分为两个部分:相机标定和线结构光标定。目前相机标定技术比较成熟,尤其是以张正友平面标定法为代表的相机标定方法,得到了广泛的应用和认可。而线结构光的标定方法,目前也有一些标定方法在实际中应用。
本人在学习和工作中对线结构光视觉系统的标定进行了研究和编程实现,目前完成了一个基于matlab 2015a的线结构光标定程序。该程序只需要使用一块棋盘格标定板即可完成线结构光视觉系统的标定。下面是该标定软件的具体使用过程。
首先选择用于标定的图片所在的文件夹,然后点击标定按钮,软件将会自动完成相机标定和线结构光标定,并把标定结果存于txt文件中。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/e1b69a114cbb34c1d68bb9bfffdba8fb)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/e6fcf99c88a10ad19ed94d1f965758d5)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/295ad6d2f6db6ddb663db0c80a1a043b)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/becfb93614b0f25a2fc4b92416d21b1a)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/66dedae3f73d2c93f76f128e07128307)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/a946c7a8c2e1ad0c85937f895fa83603)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/d8666a3b7bfe3221b99dd7a020eefe09)
相机参数
[456.835948 0 319.163600
0 455.503272 224.297494
0 0 1]
畸变系数
[-0.428655 0.240668 0.000222 -0.000840 -0.074862]
平均重投影误差
0.148146pixel
线结构光参数
[0.996652 0.009722 0.081176 135.203206]
附源码地址(.p文件)
http://download.csdn.net/detail/j10527/9694703
部分代码:
1.相机标定按钮代码
stripe_paras.txt文件按照如下代码保存的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/d216bd4570137a83051d3b4a0439615e)
基于qt5和opencv3的新版本可执行文件,下载地址
https://github.com/jah10527/laserLineToolkit
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/1062ec35eee27b28269076b927004f4d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/5a7cd69476f46cc3ea35795ca57c69ae)
上面只显示了Z坐标,X,Y未显示在界面上。
本人在学习和工作中对线结构光视觉系统的标定进行了研究和编程实现,目前完成了一个基于matlab 2015a的线结构光标定程序。该程序只需要使用一块棋盘格标定板即可完成线结构光视觉系统的标定。下面是该标定软件的具体使用过程。
首先选择用于标定的图片所在的文件夹,然后点击标定按钮,软件将会自动完成相机标定和线结构光标定,并把标定结果存于txt文件中。
相机参数
[456.835948 0 319.163600
0 455.503272 224.297494
0 0 1]
畸变系数
[-0.428655 0.240668 0.000222 -0.000840 -0.074862]
平均重投影误差
0.148146pixel
线结构光参数
[0.996652 0.009722 0.081176 135.203206]
附源码地址(.p文件)
http://download.csdn.net/detail/j10527/9694703
部分代码:
1.相机标定按钮代码
% --- Executes on button press in camera_calibration. function camera_calibration_Callback(hObject, eventdata, handles) % hObject b3a1 handle to camera_calibration (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) disp 'Camera calibration begin...'; images = imageSet(get(handles.dir_cam, 'String')); % images = imageSet('robart'); imageFileNames = images.ImageLocation; for k = 1:length(imageFileNames) im = imread(imageFileNames{k}); if size(im,3)==3 im=rgb2gray(im); end im = imadjust(im); imwrite(im,imageFileNames{k}); end % Detect calibration pattern. [imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames); % Generate world coordinates of the corners of the squares. % squareSize = 10; % millimeters squareSize = str2num(get(handles.square_size, 'String')); worldPoints = generateCheckerboardPoints(boardSize, squareSize); % Calibrate the camera. [params, ~, ~] = estimateCameraParameters(imagePoints, worldPoints, ... 'EstimateTangentialDistortion', true, 'NumRadialDistortionCoefficients', 3); if get(handles.show, 'value') figure;subplot(2,1,1); showReprojectionErrors(params); end for k = 1:size(imagePoints,3) % im = imread(imageFileNames{k}); % im = rgb2gray(im); % J = undistortImage(im, params); % imwrite(J,['undistorted_calib/im' num2str(k) '.jpg']); err(k) = norm(mean(abs(params.ReprojectionErrors(:,:,k)),1)); end for k = 1:round(size(imagePoints,3)*0.3) [~,ind]=max(err); err(ind)=[]; imagePoints(:,:,ind)=[]; end % [imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames); % Calibrate the camera. [params, ~, ~] = estimateCameraParameters(imagePoints, worldPoints, ... 'EstimateTangentialDistortion', true, 'NumRadialDistortionCoefficients', 3); if get(handles.show, 'value') subplot(2,1,2); showReprojectionErrors(params); figure; showExtrinsics(params, 'CameraCentric'); end dir_str = get(handles.dir_str, 'String'); images = imageSet(dir_str); system('mkdir undistorted_stripe'); delete undistorted_stripe/* for k = 1:images.Count I = imread(images.ImageLocation{k}); [J,newOrigin] = undistortImage(I,params,'OutputView', 'same'); % if get(handles.show, 'value') % figure; % imshow(J); % end imwrite(J,['undistorted_stripe/im_stripe' num2str(k) '.jpg']); end % images = imageSet('pics_raw/'); % for k = 1:images.Count % I = imread(images.ImageLocation{k}); % [J,newOrigin] = undistortImage(I,params,'OutputView', 'same'); % figure; % imshow(J); % imwrite(J,['pics/im_' num2str(k) '.jpg']); % end fd = fopen('cam_paras.txt', 'w+'); fprintf(fd, '%f %f %f %f\n', params.IntrinsicMatrix(1), params.IntrinsicMatrix(3), ... params.IntrinsicMatrix(5), params.IntrinsicMatrix(6)); fprintf(fd, '%f %f %f %f %f\n', params.RadialDistortion(1), params.RadialDistortion(2),... params.TangentialDistortion(1), params.TangentialDistortion(2), params.RadialDistortion(3)); fprintf(fd, '%f\n', params.MeanReprojectionError(1)); fclose(fd); disp 'Camera calibration done.'; disp 'Camera calibration results were saved in cam_paras.txt.';
stripe_paras.txt文件按照如下代码保存的:
基于qt5和opencv3的新版本可执行文件,下载地址
https://github.com/jah10527/laserLineToolkit
上面只显示了Z坐标,X,Y未显示在界面上。
相关文章推荐
- HDU 5442 Favorite Donut 后缀数组
- Python连接mysql
- List和ArrayList的区别
- 数据库操作中 pstmt.setString(1,id) ; 是什么意思 那个“1”指什么?
- LINUX中驱动异步通知应用程序的方法
- 用Activity的onTouchEvent方法实现监听手指上下左右滑动
- R语言︱线性混合模型理论与案例探究(固定效应&随机效应)
- Remove Duplicates from Sorted List
- js获取客户端IP及地理位置
- 提高PHP代码执行效率小结
- HDU 5438 Ponds
- 开发故事中的各种小虫(持续更新)
- PAT 1050.螺旋矩阵(25)
- hadoop hdfs运行机制
- 命令模式
- 关于中值滤波算法,以及C语言实现
- Android视图的绘制流程(下)——View的Layout与Draw过程
- 【Dongle】【VS】之窗体异常
- 为什么手机不能既开WiFi又开热点?
- Android程序安装后图标不显示