ãã以åã¯ãã³ã³ãã¥ãŒã¿ãŒããžã§ã³ãOpenCVãKinectãæ±ã£ãããšããããŸããã§ããã ãŸãããã®ãã¹ãŠã®çµæžãã©ã®ããã«æ±ããã«ã€ããŠã®å æ¬çãªæ瀺ãèŠã€ããããšãã§ããªãã£ããããæçµçã«ã¯ç§©åºãããããªããã°ãªããŸããã§ããã ãããŠããã®èšäºã§åŸãçµéšãäœç³»åããããšã¯ééãã§ã¯ãªããšå€æããŸããã ãããããããã¯äžéšã®æ£è ã«ãšã£ãŠæçšã§ããããšãå€æããã§ãããããŸã
æå°ã·ã¹ãã èŠä»¶ ïŒWindows 8以éãKinect SDK 2.0ãUSB 3.0ã
è¡šI. Kinect v2ã®æ©èœïŒ
解å床RGBã«ã¡ã©ãpixã | 1920 x 1080 |
解å床赀å€ç·ïŒIRïŒã«ã¡ã©ãpixã | 512 x 424 |
RGBã«ã¡ã©ã®èŠéè§ãº | 84.1 x 53.8 |
IRã«ã¡ã©ã®èŠéè§ãº | 70.6 x 60.0 |
ç¯å²ã®æž¬å®ç¯å²ãmã | 0.6-8.0 1 |
RGBã«ã¡ã©ã®æ®åœ±åšæ³¢æ°ãHz | 30 |
IRã«ã¡ã©ã®æ®åœ±åšæ³¢æ°ãHz | 30 |
1
æ
å ±ã¯ãœãŒã¹ããšã«ç°ãªããŸãã ããã§åœŒãã¯çŽ0.5-4.5mãšèšã£ãŠããŸãããå®éãç§ã¯çŽ0.6-8.0mãåãåããŸããã
ãããã£ãŠã次ã®ã¿ã¹ã¯ããããŸããã
- Pythonã§KinectãååŸããŸãã
- RGBããã³IRã«ã¡ã©ãèŒæ£ããŸãã
- RGBãã¬ãŒã ãšIRãã¬ãŒã ãçµã¿åãããæ©èœãå®çŸããŸãã
- 深床ãã£ãã«ãèŒæ£ããŸãã
次ã«ãåãã€ã³ãã«ã€ããŠè©³ãã説æããŸãã
1. Kinect v2ããã³Python
åã«ãèšã£ãããã«ãç§ã¯ã³ã³ãã¥ãŒã¿ãŒããžã§ã³ãæ±ãããžãã¹ã¯ãããŸããã§ããããOpenCVã©ã€ãã©ãªããªããã°ã©ãã«ãååšããªããšããåããããŸããã ãŸããã«ã¡ã©ã®ãã£ãªãã¬ãŒã·ã§ã³çšã®ã¢ãžã¥ãŒã«å šäœãåããŠãããããæåã«è¡ã£ãã®ã¯ãWindows 8.1ã§Python 3ããµããŒãããOpenCVããã«ãããããšã§ããã éåžžãWindowsã§ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®ã¢ã»ã³ããªã«äŒŽããã©ãã«ã¯ãããŸããã§ããããéçºè ããã®æ瀺ã®äžéšãšããŠããã¹ãŠãç¹å¥ãªé©ããªãã§è¡ãããŸããã
Kinectã§ã¯ãããå°ãããããªããã°ãªããŸããã§ããã å ¬åŒSDKã¯ãCïŒãC ++ãããã³JavaScriptã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ããµããŒãããŠããŸãã å察åŽããè¡ããšãOpenCVã3Dã«ã¡ã©ããã®å ¥åããµããŒãããŠããããšãããããŸãããã«ã¡ã©ã¯OpenNIã©ã€ãã©ãªãšäºææ§ãããå¿ èŠããããŸãã OpenNIã¯KinectããµããŒãããŠããŸãããæ¯èŒçæè¿ã®Kinect v2ã¯ãµããŒãããŠããŸããã ãããã芪åãªäººã ãOpenNIã§Kinect v2ã®ãã©ã€ããŒãäœæããŸããã åäœããNiViewerã®ããã€ã¹ã®ãã£ã³ãã«ãããããªãéè³ããããšãã§ããŸãããOpenCVã§äœ¿çšãããšãšã©ãŒãçºçããŠã¯ã©ãã·ã¥ããŸãã ãã ããä»ã®åªç§ãªäººã ã¯ãå ¬åŒSDKã®Pythonã©ãããŒãäœæããŸããã æ¢ãŸã£ãã
2.ã«ã¡ã©ã®ãã£ãªãã¬ãŒã·ã§ã³
ã«ã¡ã©ã¯å®ç§ã§ã¯ãªããç»åãæªãããã£ãªãã¬ãŒã·ã§ã³ãå¿ èŠã§ãã Kinectã枬å®ã«äœ¿çšããã«ã¯ãRGBã«ã¡ã©ãšæ·±åºŠã»ã³ãµãŒã®äž¡æ¹ã§ãããã®å¹ŸäœåŠçãªæªã¿ãé€å»ãããšããã§ãããã IRã«ã¡ã©ã¯æ·±åºŠã»ã³ãµãŒã®åä¿¡æ©ã§ãããããããã£ãªãã¬ãŒã·ã§ã³ã«IRãã¬ãŒã ã䜿çšãããã£ãªãã¬ãŒã·ã§ã³çµæã䜿çšããŠæ·±åºŠãã¬ãŒã ããæªã¿ãé€å»ã§ããŸãã
ã«ã¡ã©ã®ãã£ãªãã¬ãŒã·ã§ã³ã¯ãã«ã¡ã©ã®å éšãã©ã¡ãŒã¿ãŒãã€ãŸãã«ã¡ã©ãããªãã¯ã¹ãšæªã¿ä¿æ°ãèŠã€ããããã«å®è¡ãããŸãã
ã«ã¡ã©è¡åã¯ã次ã®åœ¢åŒã®è¡åã§ãã
ã©ãã§
ïŒ with u ãc v ïŒ-äž»ç¹ã®åº§æšïŒå 軞ãšç»åå¹³é¢ãšã®äº€ç¹ãçæ³çãªã«ã¡ã©ã§ã¯ãç»åã®äžå¿ã«æ£ç¢ºã«é 眮ãããŸãããå®éã«ã¯äžå¿ãããããã«ãªãã»ãããããŸãïŒ;
f u ãf v-çŠç¹è·é¢f ããã¯ã»ã«ã®å¹ ãšé«ãã§æž¬å®ã
æªã¿ã«ã¯ãæŸå°ç¶æªã¿ãšæ¥ç·æªã¿ã®2ã€ã®äž»ãªçš®é¡ããããŸãã
æŸå°ç¶ã®æªã¿ -ã¬ã³ãºã®æŸç©ç·åœ¢ç¶ã®äžå®å šæ§ã®çµæãšããŠã®ç»åã®æªã¿ã æŸå°ç¶ã®æªã¿ã«ãã£ãŠåŒãèµ·ããããæªã¿ã¯ãã»ã³ãµãŒã®å åŠäžå¿ã§0ã§ããã端ã«åãã£ãŠå¢å ããŸãã éåžžãæŸå°ç¶ã®æªã¿ã¯ãç»åã®æªã¿ã«æãå¯äžããŸãã
æ¥ç·æ¹åã®æªã¿ -ã¬ã³ãºã®åãä»ãã«ããããšã©ãŒãç»åå¹³é¢ã«å¹³è¡ã«çºçããããšã«ããç»åã®æªã¿ã
æªã¿ããªããããã«ã次ã®åŒã䜿çšããŠãã¯ã»ã«ã®åº§æšãã«ãŠã³ãã§ããŸãã
ããã§ãïŒ uãv ïŒã¯åæãã¯ã»ã«äœçœ®ã§ãã
ïŒ u ä¿®æ£ ãv ä¿®æ£ ïŒ-幟äœåŠçæªã¿ãé€å»ããåŸã®ãã¯ã»ã«ã®äœçœ®ã
k 1 ãk 2 ãk 3-æŸå°ç¶æªã¿ä¿æ°ã
p 1 ãp 2-æ¥ç·æªã¿ä¿æ°ã
r 2 = u 2 + v 2 ã
ã«ã¡ã©ãã©ã¡ãŒã¿ãŒïŒæªã¿ä¿æ°ãã«ã¡ã©ãããªãã¯ã¹ïŒã®æž¬å®ç²ŸåºŠã¯ãåæåœ±èª€å·®ïŒ ReErãåæ圱誀差 ïŒã®å¹³åå€ã«ãã£ãŠæ±ºãŸããŸãã ReErã¯ããªããžã§ã¯ãã®è¡šé¢äžã®ç¹Pã®ç»åå¹³é¢äžã®æ圱P 'ãšãã«ã¡ã©ãã©ã¡ãŒã¿ãŒã䜿çšããŠæªã¿ãé€å»ããåŸã«æ§ç¯ãããåãç¹Pã®æ圱P' 'ãšã®éã®è·é¢ïŒãã¯ã»ã«åäœïŒã§ãã
æšæºã®ã«ã¡ã©ãã£ãªãã¬ãŒã·ã§ã³æé ã¯ã次ã®æé ã§æ§æãããŸãã
1ïŒãã§ã¹ç€ã®
2ïŒç»åå ã®ãªããžã§ã¯ãã®ããŒãã€ã³ãã決å®ããŸãã
found, corners = cv2.findChessboardCorners(img, # PATTERN_SIZE,# , 6x8 flags)#
3ïŒ ReErãæå°åãããããªæªã¿ä¿æ°ãèŠã€ããŸãã
ReEr, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(obj_points,# #(', y', z'=0) img_points,# (u,v) (w, h),# None,# None, # criteria = criteria,# ReEr flags = flags)#
ãã®å ŽåãRGBã«ã¡ã©ã®å¹³åReErå€ã¯0.3ãã¯ã»ã«ã§ãIRã«ã¡ã©ã®å¹³åã¯0.15ã§ãã æªã¿é€å»ã®çµæïŒ
img = cv2.undistort(img, camera_matrix, dist_coefs)
3. 2å°ã®ã«ã¡ã©ã®ãã¬ãŒã ãçµåãã
ãã¯ã»ã«ã®æ·±åºŠïŒZ座æšïŒãšè²ã®äž¡æ¹ãååŸããã«ã¯ããŸã深床ãã¬ãŒã ã®ãã¯ã»ã«åº§æšããIRã«ã¡ã©ã®3次å 座æšã«åãæ¿ããå¿ èŠããããŸã[2]ïŒ
ããã§ãïŒ x 1 ãy 1 ãz 1 ïŒã¯ãIRã«ã¡ã©ã®åº§æšç³»ã®ãã€ã³ãã®åº§æšã§ãã
z 1ã¯æ·±åºŠã»ã³ãµãŒããè¿ãããçµæã§ãã
ïŒ u 1 ãv 1 ïŒ-ãã¬ãŒã 深床äžã®ãã¯ã»ã«ã®åº§æšã
c 1ãu ãc 1ãv -IRã«ã¡ã©ã®å åŠäžå¿ã®åº§æšã
f 1ãu ãf 1ãv -IRã«ã¡ã©ã®çŠç¹è·é¢ã®æ圱ã
次ã«ãIRã«ã¡ã©ã®åº§æšç³»ããRGBã«ã¡ã©ã®åº§æšç³»ã«ç§»åããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãäŒéãã¯ãã«Tã䜿çšããŠåç¹ã移åããå転è¡åRã䜿çšããŠåº§æšç³»ãå転ããå¿ èŠããããŸãã
次ã«ãRGBã«ã¡ã©ã®3次å 座æšç³»ããRGBãã¬ãŒã ã®ãã¯ã»ã«åº§æšã«ç§»åããå¿ èŠããããŸãã
ãããã£ãŠãããããã¹ãŠã®å€æã®åŸã深床ãã¬ãŒã ã®ãã¯ã»ã«ïŒ u 1 ãv 1 ïŒã«å¯ŸããŠãRGBãã¬ãŒã ïŒ u 2 ãv 2 ïŒã®å¯Ÿå¿ãããã¯ã»ã«ã®ã«ã©ãŒå€ãååŸã§ããŸãã
çµæã®ç»åã§ãããããã«ãç»åã¯å Žæã«ãã£ãŠ2åã«ãªããŸãã å ¬åŒSDKã®CoordinateMapperã¯ã©ã¹ã䜿çšãããšãåãå¹æãèŠãããŸãã ãã ããç»åã«é¢å¿ãããã®ã人ç©ã ãã®å Žåã¯ã bodyIndexFrame ïŒã©ã®ãã¯ã»ã«ã人ç©ã«å±ããã©ã®ãã¯ã»ã«ãèæ¯ã«ããããç¥ãKinectã¹ããªãŒã ïŒã䜿çšããŠãé¢å¿é åã匷調衚瀺ãããŽãŒã¹ããé€å»ã§ããŸãã
å転è¡åRãšäŒéãã¯ãã«Tã決å®ããã«ã¯ã2ã€ã®ãã£ã³ããŒã®ãžã§ã€ã³ããã£ãªãã¬ãŒã·ã§ã³ãå®è¡ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãRGBã«ã¡ã©ãšIRã«ã¡ã©ã®äž¡æ¹ã®ç°ãªãäœçœ®ã§æ¢ç¥ã®ãžãªã¡ããªãæã€ãªããžã§ã¯ãã®20ãã30æã®åçãæ®ãå¿ èŠããããŸããç°ãªãã«ã¡ã©ã«ããæ®åœ±ãã¬ãŒã éã§ã®å€äœã®å¯èœæ§ãæé€ããããã«ããªããžã§ã¯ããæã«æããªãæ¹ãè¯ãã§ãã 次ã«ãOpenCVã©ã€ãã©ãªã®stereoCalibrateé¢æ°ã䜿çšããå¿ èŠããããŸãã ãã®é¢æ°ã¯ããã£ãªãã¬ãŒã·ã§ã³ãªããžã§ã¯ãã«å¯Ÿããåã«ã¡ã©ã®äœçœ®ã決å®ããReErãæå°åããæåã®ã«ã¡ã©ã®åº§æšç³»ãã2çªç®ã®ã«ã¡ã©ã®åº§æšç³»ãžã®å€æãæ€åºããŸãã
retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F = cv2.stereoCalibrate(pattern_points, # # (', y', z'=0) ir_img_points,# (u1, v1) rgb_img_points, # RGB (u2, v2) irCamera['camera_matrix'],# ( calibrateCamera), irCamera['dist_coefs'], #. . ( calibrateCamera) rgbCamera['camera_matrix'], # RGB ( calibrateCamera) rgbCamera['dist_coefs'], #. . RGB ( calibrateCamera) image_size) # ( )
ãããŠæçµçã«ã ReEr = 0.23ã«ãªããŸããã
4.深床ãã£ãã«ã®ãã£ãªãã¬ãŒã·ã§ã³
Kinect深床ã»ã³ãµãŒã¯ã深床ïŒã€ãŸãã深床ã§ã¯ãªããè·é¢ã§ã¯ãªãZ座æšïŒãmmã§è¿ããŸãã ãããããããã®å€ã¯ã©ãã»ã©æ£ç¢ºã§ããïŒ åºçç©[2]ããå€æãããšã誀差ã¯è·é¢ã«å¿ããŠ0.5ã3 cmã«ãªãå¯èœæ§ãããããã深床ãã£ãã«ãèŒæ£ããããšã¯çã«ããªã£ãŠããŸãã
ãã®æé ã¯ããªããžã§ã¯ããŸã§ã®è·é¢ã«å¿ããŠãKinectã®ã·ã¹ãããã£ãã¯ãšã©ãŒïŒåºæºæ·±åºŠãšã»ã³ãµãŒã«ãã£ãŠçæããã深床ã®å·®ïŒãèŠã€ããããšã§ãã ãã®ããã«ã¯ãåç §æ·±åºŠãç¥ãå¿ èŠããããŸãã æãæçœãªæ¹æ³ã¯ãã«ã¡ã©ã®å¹³é¢ã«å¹³è¡ã«å¹³ããªãªããžã§ã¯ããé 眮ããå®èŠã§ãã®è·é¢ã枬å®ããããšã§ãã ãªããžã§ã¯ããåŸã ã«ç§»åããåè·é¢ã§äžé£ã®æž¬å®ãè¡ãããšã«ãããåè·é¢ã®å¹³å誀差ãèŠã€ããããšãã§ããŸãã ãããã第äžã«ãããã¯ããŸã䟿å©ã§ã¯ãªãã第äºã«ãäžèŠãããšæãããããããæ¯èŒç倧ããªãµã€ãºã®å®å šã«å¹³ããªãªããžã§ã¯ããèŠã€ããŠãã«ã¡ã©ã®å¹³é¢ã«å¹³è¡ã«ããããšãä¿èšŒããããšãããå°é£ã§ãã ãããã£ãŠããšã©ãŒã®èšç®åºæºãšããŠããªããžã§ã¯ãã®æ¢ç¥ã®ãžãªã¡ããªã«ãã£ãŠæ±ºå®ãããæ·±ããåãããšã«ããŸããã
ãªããžã§ã¯ãã®ãžãªã¡ããªïŒãã§ã¹ç€ã®ã»ã«ã®ãµã€ãºãªã©ïŒãææ¡ããã«ã¡ã©ã®å¹³é¢ã«å³å¯ã«å¹³è¡ã«é 眮ãããšã次ã®ããã«ãªããžã§ã¯ãã®æ·±ãã決å®ã§ããŸãã
ããã§ã fã¯çŠç¹è·é¢
dã¯ãã«ã¡ã©ãããªãã¯ã¹äžã®ããŒãã€ã³ãã®æ圱éã®è·é¢ã§ãã
Dã¯ãªããžã§ã¯ãã®ããŒãã€ã³ãéã®è·é¢ã§ãã
Zã¯ãã«ã¡ã©ã®æ圱ã®äžå¿ãããªããžã§ã¯ããŸã§ã®è·é¢ã§ãã
ãªããžã§ã¯ããå³å¯ã«å¹³è¡ã§ã¯ãªããã«ã¡ã©ã®å¹³é¢ã«å¯ŸããŠç¹å®ã®è§åºŠã§é 眮ãããŠããå Žåã奥è¡ãã¯ãé è¿æ³nç¹ïŒPnPïŒåé¡ã®è§£ã«åºã¥ããŠæ±ºå®ã§ããŸã[3]ã OpenCVã©ã€ãã©ãªã«å®è£ ãããŠããå€ãã®ã¢ã«ãŽãªãºã ã¯ããã®åé¡ã®è§£æ±ºã«å°å¿µããŠããŸããããã«ãããå€æãèŠã€ããããšãã§ããŸãã RãT | ãã£ãªãã¬ãŒã·ã§ã³ãªããžã§ã¯ãã®åº§æšç³»ãšã«ã¡ã©åº§æšç³»ã®éã§ããããã£ãŠãã«ã¡ã©ãã©ã¡ãŒã¿ãŒã«æ£ç¢ºãªæ·±åºŠã決å®ããŸãã
retval, R, T = cv2.solvePnP(obj_points[:, [0, 5, 42, 47]],# img_points[:, [0, 5, 42, 47]], # rgbCameraMatrix,# rgbDistortion,# flags= cv2.SOLVEPNP_UPNP)# PnP R, jacobian = cv2.Rodrigues(R)# for j in range(0, numberOfPoints): # point = numpy.dot(rgb_obj_points[j], RT) + TT # ! , # , , computedDistance[j] = point[0][2] * 1000 # Z-
深床ãã£ãã«ããã£ãªãã¬ãŒã·ã§ã³ããããã«ããã£ãªãã¬ãŒã·ã§ã³ãªããžã§ã¯ãã®äžé£ã®èª¿æ»ããã7 cmã®ã¹ãããã§ã0.7-2.6 mã®è·é¢ã§å®è¡ããŸããã ãã£ãªãã¬ãŒã·ã§ã³ãªããžã§ã¯ãã¯ãå¯èœãªéããç®ã§ãã«ã¡ã©ã®å¹³é¢ã«å¹³è¡ãªãã¬ãŒã ã®äžå¿ã«é 眮ãããŸããã åè·é¢ã§ãRGBã«ã¡ã©ã§1ã·ã§ããã深床ã»ã³ãµãŒã§100ã·ã§ãããæ®åœ±ããŸããã ã»ã³ãµãŒããã®ããŒã¿ã¯å¹³ååãããRGBãã¬ãŒã ã«åºã¥ããŠãªããžã§ã¯ãã®ãžãªã¡ããªã«ãã£ãŠæ±ºå®ãããè·é¢ãæšæºãšããŠæ¡çšãããŸããã ç¹å®ã®è·é¢ã§Kinectã»ã³ãµãŒã®æ·±ãã決å®ããéã®å¹³å誀差ã¯ã次ã®ããã«æ±ºå®ãããŸããã
ããã§ã z i RGBã¯ãžãªã¡ããªã®içªç®ã®ããŒãã€ã³ããŸã§ã®è·é¢ã§ãã
z i 深床 -深床ã»ã³ãµãŒã«åŸã£ãŠãiçªç®ã®ããŒãã€ã³ããŸã§ã®100ãã¬ãŒã ã§å¹³ååãããè·é¢ã
Nã¯ããªããžã§ã¯ãäžã®ããŒãã€ã³ãã®æ°ã§ãïŒãã®äŸã§ã¯48ïŒã
次ã«ãçµæãè£éããããšã«ãããè·é¢ãã誀差é¢æ°ãåŸãŸããã
以äžã®å³ã¯ããã£ãªãã¬ãŒã·ã§ã³ãã¬ãŒã ã®ä¿®æ£ååŸã®èª€å·®ã®ååžã瀺ããŠããŸãã åèš120,000ã®æž¬å®å€ãååŸãããŸããïŒ25ã®è·é¢ãããããã«100ã®æ·±åºŠãã¬ãŒã ããªããžã§ã¯ãäžã®48ã®ããŒãã€ã³ãïŒã ä¿®æ£åã®èª€å·®ã¯17±9.95 mmïŒå¹³å±æšæºåå·®ïŒã§ããã-0.45±8.16 mmã®åŸã§ããã
次ã«ãããŸããŸãªäœçœ®ã§ã®ãã£ãªãã¬ãŒã·ã§ã³ãªããžã§ã¯ãã®25ã®ãã¹ããã¬ãŒã ïŒRGBããã³æ·±åºŠïŒãäœæãããŸããã åèš1200ã®æž¬å®ïŒ25ãã¬ãŒã ãããããã«48ã®ããŒãã€ã³ãïŒã ä¿®æ£åã®èª€å·®ã¯7.41±6.32 mmïŒå¹³å±æšæºåå·®ïŒã§ã-3.12±5.50 mmã®åŸã§ããã 次ã®å³ã¯ããã¹ããã¬ãŒã ã®ä¿®æ£ååŸã®ãšã©ãŒã®ååžã瀺ããŠããŸãã
ãããã«
ãããã£ãŠãRGBã«ã¡ã©ãšæ·±åºŠã»ã³ãµãŒã®å¹ŸäœåŠçãªæªã¿ãé€å»ãããã¬ãŒã ãçµã¿åãããæ¹æ³ãåŠã³ã深床ã決å®ãã粟床ãæ¹åããŸããã ãã®ãããžã§ã¯ãã®ã³ãŒãã¯ãã¡ãã«ãããŸã ã ç§ã¯ãããæçšã§ããããšãå€æããããšãé¡ã£ãŠããŸãã
ãã®ç 究ã¯ããã·ã¢ç§åŠè²¡å£ïŒãããžã§ã¯ãçªå·15-19-30012ïŒããã®å©æéã§å®æœãããŸãã
ãœãŒã¹ã®ãªã¹ã
1. Kramer J. Hacking the Kinect / Apressã 2012. P. 130
2. Lachat E. et alã è¿è·é¢3Dã¢ããªã³ã°ã®ããã®Kinect V2ã»ã³ãµãŒã®æåã®çµéš//åç枬éããªã¢ãŒãã»ã³ã·ã³ã°ãããã³ç©ºéæ å ±ç§åŠã®åœéã¢ãŒã«ã€ãã 2015幎ã
3. Gao XS et alã èŠç¹3ç¹åé¡ã®å®å šãªãœãªã¥ãŒã·ã§ã³åé¡//ãã¿ãŒã³åæãšãã·ã³ã€ã³ããªãžã§ã³ã¹ã«é¢ããIEEEãã©ã³ã¶ã¯ã·ã§ã³ã å·» 25. N 8.2003ãP.930-943ã