azure kinect标定文件_相机标定问题-实践操作流程

接上一篇文章讲解的相机标定的基本概念,这篇文章主要阐述一下如何使用Matlab或者Opencv等软件得的Camera内参之后,如何保存调用内参完成对应Camera的标定流程。

一、Matlab标定鱼眼镜头实践

1. 这里我使用的Camera是Jetson Nano专用的鱼眼摄像机,具体参数如下所示:

fd4e606329d30480ca3e3a8299c7cad6.png我使用的畸变较大的鱼眼镜头。

由于我采用的是红外夜视的Camera,结果在光线稍微不好的时候就会出现图片偏红色的情况(解决方案:微雪Camera-wiki)

如果大家没有必要的夜视应用场景,建议不要使用红外夜视的摄像头,如果在后期处理的过程中还要对畸变图像矫正,建议就不要使用广角鱼眼摄像头了,因为矫正之后的视野区域也会有所减少,这一点可以在后面矫正的程序中看到(在畸变矫正的过程中,也需要消耗部分CPU资源,这样对于嵌入式板卡来说也许就不划算了)

2. 基于JetsonNano板卡,CSI摄像头的标定图采集Demo程序如下:

1 importcv22 importsys3 importglob4 importtime5 importthreading6 importnumpy as np7

8 if len(sys.argv) == 1:9 print 'Please Choose the CSI-Camera id for image sample.Try again!'

10 exit(0)11

12 Camera_ID = int(sys.argv[1])13

14 defgstreamer_pipeline(15 csi_camera_id =0,16 capture_width=1280,17 capture_height=720,18 display_width=1280,19 display_height=720,20 framerate=60,21 flip_method=0,22 ):23 return(24 "nvarguscamerasrc sensor_id=%d !"

25 "video/x-raw(memory:NVMM),"

26 "width=(int)%d, height=(int)%d,"

27 "format=(string)NV12, framerate=(fraction)%d/1 !"

28 "nvvidconv flip-method=%d !"

29 "video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx !"

30 "videoconvert !"

31 "video/x-raw, format=(string)BGR ! appsink"

32 %(33 csi_camera_id,34 capture_width,35 capture_height,36 framerate,37 flip_method,38 display_width,39 display_height,40 )41 )42

43 print 'Starting Capture...'

44 csi_pipeline_str = gstreamer_pipeline(csi_camera_id=Camera_ID,flip_method=0)45 printcsi_pipeline_str46 cap =cv2.VideoCapture(csi_pipeline_str, cv2.CAP_GSTREAMER)47 count =048 while notcap.isOpened():49 time.sleep(0.5)50 print('Camera is Initialize...')51 count += 1

52 if count == 10:53 print 'CSICamera Initial Failed!'

54 cap.release()55 exit(0)56

57 ret, frame =cap.read()58

59 Key_val =060

61 defKeybo_Moni():62 count =063 whileTrue:64 globalKey_val, frame, process_flag, cap65 if Key_val == ord('r'):66 Key_val=067 cv2.imwrite('CSICamera' + str(Camera_ID) + '-' + str(count) + '.jpg', frame)68 count += 1

69 print('Get new pic %d' %count)70 if Key_val == ord('q'):71 break

72

73 try:74 Keybo_Moni_Thread = threading.Thread(target=Keybo_Moni, name='Keyboard-Thread')75 Keybo_Moni_Thread.start()76 except:77 print('Error:uqnable to start the thread!')78

79 whileTrue:80 ret, frame =cap.read()81 cv2.imshow('Video_Show', frame)82 Key_val = cv2.waitKey(1)83 if Key_val == ord('q'):84 cv2.destroyAllWindows()85 cap.release()86 print('Pic Sample Finished!')87 break

88

89 print('Finished CalibrateCamera Image Sample...')

程序中涉及到了Gstreamer等多媒体pipeline框架内容,请参考这里,Python脚本的使用方法:

pythonCSICAM_Calibraton_Sample.py 1 # 采集CSI-Camera1摄像头的内容

python CSICAM_Calibraton_Sample.py0 # 采集CSI-Camera0摄像头的内容

如果你使用的其他的USB Camera,可以参考使用如下程序:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importcv22 importglob3 importtime4 importthreading5 importnumpy as np6

7 print('Starting Capture...')8 cap = cv2.VideoCapture(2)9 while notcap.isOpened():10 time.sleep(100)11 print('Camera is Initialize...')12

13 width = int(cap.get(3))14 height = int(cap.get(4))15

16 frame = np.zeros((width,height,3),dtype=np.uint8)17 ret, frame =cap.read()18

19 Key_val =020

21 defKeybo_Moni():22 count =023 whileTrue:24 globalKey_val, frame, process_flag, cap25 if Key_val == ord('r'):26 Key_val=027 cv2.imwrite('ResPic' + str(count) + '.jpg', frame)28 count += 1

29 print('Get new pic %d' %count)30 if Key_val == ord('q'):31 Key_val = 'q'

32 break;33

34 try:35 Keybo_Moni_Thread = threading.Thread(target=Keybo_Moni, name='Keyboard-Thread')36 Keybo_Moni_Thread.start()37 except:38 print('Error:uqnable to start the thread!')39

40 whileTrue:41 ret, frame =cap.read()42 cv2.imshow('Video_Show', frame)43 Key_val = cv2.waitKey(1)44 if Key_val == ord('q'):45 cv2.destroyAllWindows()46 cap.release()47 print('Pic Sample Finished!')48 break

49

50 print('Finished CalibrateCamera Image Sample...')

View Code

3. 接下来使用采集图像进行Matlab进行标定

683f0aae152ad53c15ac22126ee5bcf4.png

能够看到,矫正之后的图像还是粉粉的...(问题待解决!)

具体matlab进行相机标定流程请参看我前一篇内容,下面是矫正前后的效果图:

2e2d23fc839c865bd5bf064d3ba634b9.png

从两图对比中,我们可以看出,section_a区域的部分以及Section_b的部分都发生了明显的变化,原来应该显示的内容由于图像在矫正的过程中根据内插法消失了,那么我们如何获取Camera的内参呢?

对于Matlab之前的版本直接参看上一篇教程,由于我使用的是2019b版本的Matlab,使用操作方式有所不同,在这里说明如下:

a) 点击工具栏位置的 Export Camera Parameters,这样会输出相机的基本内参以及外参到Matlab的工作空间中:

db5949b5512518df2ea87af010dd62bf.png这样就会将相机参数保存在工作空间,名称为cameraParams。

在工作区中,可以找到cameraParams变量,单机右键,打开所选内容,如下所示:

54c2d59b843a8a4e00d34343536fa469.png将图中颜色标出的参数保存即可。

同时这里我们有必要将工作空间中cameraParams mat变量保存下来为下一次矫正的过程使用提供相机的内参数据,单机右键点击另存为,将相机的参数数据保存即可(参考.mat数据保存使用)。

b) 点击工具栏位置的 Export Camera Parameters下拉箭头,选择Generate Matalab script:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

% Auto-generated by cameraCalibrator app on 15-Apr-2020

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

%Define images to process

imageFileNames= {'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-0.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-3.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-4.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-5.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-7.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-8.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-9.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-10.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-11.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-12.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-13.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-14.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-15.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-16.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-17.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-18.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-19.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-20.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-21.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-22.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-23.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-24.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-25.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-26.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-27.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-28.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-29.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-30.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-31.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-32.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-33.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-34.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-35.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-36.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-37.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-40.jpg',...'C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-41.jpg',...

};% Detect checkerboards inimages

[imagePoints, boardSize, imagesUsed]=detectCheckerboardPoints(imageFileNames);

imageFileNames=imageFileNames(imagesUsed);%Read the first image to obtain image size

originalImage= imread(imageFileNames{1});

[mrows, ncols,~] =size(originalImage);%Generate world coordinates of the corners of the squares

squareSize= 40; % in units of 'millimeters'worldPoints=generateCheckerboardPoints(boardSize, squareSize);%Calibrate the camera

[cameraParams, imagesUsed, estimationErrors]=estimateCameraParameters(imagePoints, worldPoints, ...'EstimateSkew', false, 'EstimateTangentialDistortion', false, ...'NumRadialDistortionCoefficients', 2, 'WorldUnits', 'millimeters', ...'InitialIntrinsicMatrix', [], 'InitialRadialDistortion', [], ...'ImageSize', [mrows, ncols]);%View reprojection errors

h1=figure; showReprojectionErrors(cameraParams);%Visualize pattern locations

h2=figure; showExtrinsics(cameraParams, 'CameraCentric');%Display parameter estimation errors

displayErrors(estimationErrors, cameraParams);%For example, you can use the calibration data to remove effects of lens distortion.

undistortedImage=undistortImage(originalImage, cameraParams);%See additional examples of how to use the calibration data. At the prompt type:% showdemo('MeasuringPlanarObjectsExample')% showdemo('StructureFromMotionExample')

View Code

运行刚刚生成保存的代码,得到如下的结果:

Standard Errors of Estimated Camera Parameters----------------------------------------------Intrinsics----------Focal length (pixels): [794.4361 +/- 1.3790 796.3933 +/- 1.3197]

Principal point (pixels):[606.8329 +/- 0.8403 393.2514 +/- 0.9863]

Radial distortion: [-0.3111 +/- 0.0010 0.0837 +/- 0.0007]

Extrinsics----------Rotation vectors:

[-0.2723 +/- 0.0024 0.0407 +/- 0.0022 0.0792 +/- 0.0005] ...

Translation vectors (millimeters):

[-90.3841 +/- 0.5212 -121.9121 +/- 0.6037 485.5467 +/- 0.8995 ] ...

根据上述结果,我们可以得到此鱼眼相机的畸变参数为(k1=-0.3111 k2=0.0837),使用这个参数进行图像的畸变矫正即可。

4. 使用畸变参数对Camera采集的图像进行矫正:

将3步骤中保存下来的cameraParams Mat数据加载到Matlab当中:

loadcameraParams

注意,此时必须添加cameraParams文件保存的文件空间到Matlab工作空间中来,加载完成之后就可以使用参数进行相机采集图片的矫正了:

I= imread('C:\Users\Administrator\Desktop\ImageData\CAM0\CSICamera0-41.jpg');

I_R=undistortImage(I, cameraParams);

figure,

imshow(I_R)

figure,

imshow(I)

运行结果如下所示:

b0558db97ba7ff3e4caabf399de630a3.gif

至此,关于Matlab这端的图像畸变矫正过程就算是完成了,如何使用畸变以及相机内参完成畸变矫正参看下面链接:

二、Cpp-Opencv标定鱼眼镜头实践

1. 依然使用之前采集的图片源,使用Opencv官方代码进行Camera的矫正:

415699786515377515ed34e9c6a136ef.png

下载很慢的可以直接拷贝我的程序:

camera_calibration.cpp (主程序文件,包括了图像输入,图像角点提取,图形标定,相机参数保存等功能模块)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 #include

2 #include

3 #include

4 #include

5 #include

6

7 #include

8 #include

9 #include

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值