caldemo.m
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:5k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. clc
  2. load cademo
  3. more off
  4. echo on
  5. %
  6. % ABOUT CAMERA CALIBRATION
  7. %
  8. % In geometric camera calibration the intrinsic and extrinsic
  9. % camera parameters are computed based on measured image coordinates
  10. % of a know calibration target. These parameters may be used to
  11. % correct distorted images or image coordinates.
  12. %
  13. % What we need is the coordinates of the control points and
  14. % corresponding image observations. In CACAL routine you must also
  15. % specify the configuration of the imaging system. The configuration
  16. % data is stored in the file called configc.m and it is acquired
  17. % based on the name of the setup like 'pulnix'. The actual calibration
  18. % data is stored in data matrices. The first three columns of the data 
  19. % matrix contain the 3-D coordinates and the two last columns contain 
  20. % the observations of the control points. CACAL supports up to six data
  21. % matrices, each containing information from distict images.
  22. %
  23. % Press enter
  24. pause
  25. clc
  26. %
  27. % COPLANAR TARGET
  28. %
  29. % The control points of the calibration target can locate in 3-D
  30. % or they can also be coplanar. In case of coplanar target, multiple
  31. % images captured from different positions and angles are required.
  32. % In the following example three images are used.
  33. %
  34. % Let us plot the data set. The first data matrix looks like this.
  35. %
  36. % Press enter
  37. pause
  38. clf
  39. subplot(1,2,1)
  40. plot3(data1(:,1),data1(:,2),data1(:,3),'x')
  41. title('3-D data')
  42. axis([-400 500 -400 500 0 500])
  43. grid  
  44. subplot(1,2,2)
  45. plot(data1(:,4),data1(:,5),'r+')
  46. axis([0 500 0 500])
  47. axis('ij')
  48. title('Image data')
  49. %
  50. % Press enter
  51. pause
  52. clc
  53. % the second data matrix:
  54. clf
  55. subplot(1,2,1)
  56. plot3(data2(:,1),data2(:,2),data2(:,3),'x')
  57. title('3-D data')
  58. axis([-400 500 -400 500 0 500])
  59. grid  
  60. subplot(1,2,2)
  61. plot(data2(:,4),data2(:,5),'r+')
  62. axis([0 500 0 500])
  63. axis('ij')
  64. title('Image data')
  65. %
  66. % Press enter
  67. pause
  68. clc
  69. % the third data matrix:
  70. clf
  71. subplot(1,2,1)
  72. plot3(data3(:,1),data3(:,2),data3(:,3),'x')
  73. title('3-D data')
  74. axis([-400 500 -400 500 0 500])
  75. grid  
  76. subplot(1,2,2)
  77. plot(data3(:,4),data3(:,5),'r+')
  78. axis([0 500 0 500])
  79. axis('ij')
  80. title('Image data')
  81. %
  82. % Press enter
  83. pause
  84. clc
  85. % OK, let's calibrate
  86. [par,pos,iter,res,er,C]=cacal('pulnix',data1,data2,data3);
  87. % Press enter
  88. pause
  89. clc
  90. %
  91. % 3-D TARGET
  92. %
  93. % The control point structure can be also three-dimensional. The
  94. % advantage which is gained is that only one image is required,
  95. % although several images are also supported by CACAL. This demo
  96. % uses the following data matrix:
  97. %
  98. % Press enter
  99. pause
  100. clf
  101. subplot(1,2,1)
  102. plot3(data3d(:,1),data3d(:,2),data3d(:,3),'x')
  103. axis('equal')
  104. title('3-D data')  
  105. grid
  106. subplot(1,2,2)
  107. plot(data3d(:,4),data3d(:,5),'r+')
  108. axis([0 700 20 550])
  109. axis('ij')
  110. title('Image data')
  111. %
  112. % Press enter
  113. pause
  114. clc
  115. % OK, let's calibrate again
  116. [par,pos,iter,res,er,C]=cacal('sony',data3d);
  117. % Press enter
  118. pause
  119. previous=std(er);
  120. clc
  121. %
  122. % TREE-STEP PROCEDURE
  123. %
  124. % The control points are often circular, because they are easy to
  125. % make and accurate to measure in subpixel precision from digital
  126. % images. However, measuring the centroid of the ellipse (that is
  127. % a projection of a circle) introduces a systematic error caused by
  128. % perspective projection which is not an affine transformation. 
  129. % Compensating for this error component requires a three-step calibration
  130. % procedure. The Matlab function CIRCAL performs this procedure. The
  131. % additional information is the radius of the points which is embedded
  132. % in the configuration file and the normal vector of the surface around
  133. % the points. In this example the normal vectors are in the matrix 
  134. % 'snorm'.
  135. %
  136. % Press enter
  137. pause
  138. clc
  139. % Let's see what happens:
  140. [par,pos,iter,res,er,C]=circal('sony',[data3d snorm]);
  141. % Press enter
  142. pause
  143. %
  144. % If we compare this result with the previous one, we notice that
  145. % the standard deviation of the residual is slightly reduced:
  146. current=std(er);
  147. [previous current]
  148. %
  149. % Press enter
  150. pause
  151. clc
  152. %
  153. % THE FOURTH STEP
  154. %
  155. % The distorted image coordinates can be corrected by using a simple
  156. % inverse model. The parameters of the inverse model are computed
  157. % with the routine called INVMODEL
  158. a=invmodel('sony',par);
  159. % Press enter
  160. pause
  161. %
  162. % The process of correcting image coordinates is demonstrated by randomly
  163. % generating one thousand image coordinate pairs all over the image area.
  164. r=[rand(1000,1)*768 rand(1000,1)*576];
  165. clf
  166. plot(r(:,1),r(:,2),'rx');
  167. % Press enter
  168. pause
  169. clc
  170. % Now, we may corrupt these coordinates with radial and tangential
  171. % distortion
  172. d=imdist('sony',par,r);
  173. hold
  174. plot(d(:,1),d(:,2),'go');
  175. % Press enter
  176. pause
  177. clc
  178. % The correction is performed with the Matlab function IMCORR
  179. c=imcorr('sony',par,a,d);
  180. % the difference between the original and the corrected coordinates
  181. % may be represented by using histograms
  182. clf
  183. subplot(1,2,1)
  184. hist(r(:,1)-c(:,1))
  185. title('Error in x direction')
  186. xlabel('pixels')
  187. subplot(1,2,2)
  188. hist(r(:,2)-c(:,2))
  189. title('Error in y direction')
  190. xlabel('pixels')
  191. % As we can see, the error is much smaller than 0.01 pixels.
  192. echo off