{"id":6868,"date":"2019-05-16T10:32:51","date_gmt":"2019-05-16T01:32:51","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=6868"},"modified":"2020-05-28T10:33:21","modified_gmt":"2020-05-28T01:33:21","slug":"python%ea%b3%bc-opencv-38-%ec%b9%b4%eb%a9%94%eb%9d%bc-%eb%b3%b4%ec%a0%95camera-calibration","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=6868","title":{"rendered":"Python\uacfc OpenCV \u2013 43 : \uce74\uba54\ub77c \ubcf4\uc815(Camera Calibration)"},"content":{"rendered":"<p>\uc774 \uae00\uc758 \uc6d0\ubb38\uc740 https:\/\/opencv-python-tutroals.readthedocs.io\/en\/latest\/py_tutorials\/py_calib3d\/py_calibration\/py_calibration.html \uc785\ub2c8\ub2e4.<\/p>\n<p>\uce74\uba54\ub77c\ub098 \ube44\ub514\uc624 \uc601\uc0c1\uc758 \uc65c\uace1 \ud604\uc0c1\uacfc \uce74\uba54\ub77c\uc758 \ub0b4\ubd80, \uc678\ubd80 \ud30c\ub77c\uba54\ud130\uc5d0 \ub300\ud574 \ud559\uc2b5\ud558\uba70, \uc774\ub7f0 \ud30c\ub77c\uba54\ud130\ub97c \uc5bb\ub294 \ubc29\ubc95\uacfc \uc774\ubbf8\uc9c0\uc758 \uc65c\uace1 \ud604\uc0c1\uc744 \uc81c\uac70\ud558\ub294 \ub0b4\uc6a9\uc744 \uc124\uba85\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud604\ub300\uc758 \uac12 \uc2fc \uc18c\ud615 \uce74\uba54\ub77c(\ub178\ud2b8\ubd81\uc774\ub098 \uc2a4\ub9c8\ud2b8\ud3f0\uc5d0 \uc7a5\ucc29\ub41c \uac1c\ubbf8 \ub208\ud06c\uae30 \ub9cc\ud55c \ub80c\uc988\uac19\uc740..)\uc740 \uc0c1\ub2f9\ud55c \uc774\ubbf8\uc9c0\uc758 \uc65c\uace1\uc744 \ubc1c\uc0dd\uc2dc\ud0b5\ub2c8\ub2e4. \uc8fc\uc694\ud55c \uc65c\uace1\uc740 \ubc29\uc0ac \uc65c\uace1\uacfc \ud0c4\uc820\ud2f0\uc5bc(Tangential) \uc65c\uace1\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubc29\uc0ac \uc65c\uace1\uc73c\ub85c \uc778\ud574, \uc544\ub798\uc758 \uadf8\ub9bc\ucc98\ub7fc \ubc18\ub4ef\ud55c \ud615\uc0c1\uc774 \ud718\uc5b4\uc9c0\uac8c \ub429\ub2c8\ub2e4. \uc774\ub7f0 \ud604\uc0c1\uc740 \uc774\ubbf8\uc9c0\uc758 \uc911\uc2ec\uc73c\ub85c\ubd80\ud130 \uba40\uc5b4\uc9c8\uc218\ub85d \uc2ec\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/calib_radial.jpg\" alt=\"\" width=\"398\" height=\"454\" class=\"aligncenter size-full wp-image-6869\" \/><\/p>\n<p>\uc704\uc640 \uac19\uc740 \uc65c\uace1 \ud604\uc0c1\uc740 \uc544\ub798\uc758 \uacf5\uc2dd\uc744 \uc774\uc6a9\ud558\uba74 \ud574\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/fc9f12344ac840bfdcb53f61df91cf853ddd6af8.png\" alt=\"\" width=\"283\" height=\"47\" class=\"aligncenter size-full wp-image-6871\" \/><\/p>\n<p>\uc720\uc0ac\ud558\uac8c, \ub610 \ub2e4\ub978 \uc65c\uace1\uc740 \ud0c4\uc820\ud2f0\uc5bc \uc65c\uace1\uc774\uba70 \uc774\ub294 \uce74\uba54\ub77c\uc758 \ub80c\uc988\uac00 \uc774\ubbf8\uc9c0 \ud3c9\uba74\uc5d0 \uc644\uc804\ud558\uac8c \uc218\ud3c9\uc774 \uc544\ub2cc \uc774\uc720\ub85c \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \uc774\ubbf8\uc9c0\uc758 \uc5b4\ub5a4 \uc601\uc5ed\uc740 \uc608\uc0c1\ubc16\uc73c\ub85c \ub354 \uac00\uae5d\uac8c \ubcf4\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4. \uc774\ub294 \uc544\ub798\uc758 \uacf5\uc2dd\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/7817dd9b0769c056c23aeefc392cf06907a990a9.png\" alt=\"\" width=\"289\" height=\"48\" class=\"aligncenter size-full wp-image-6873\" \/><\/p>\n<p>\uc694\uc57d\ud558\uba74, 5\uac1c\uc758 \ud30c\ub77c\uba54\ud130\uac00 \ud544\uc694\ud55c\ub370, \uc774 \ud30c\ub77c\uba54\ud130\ub97c \uc544\ub798\ucc98\ub7fc \uc65c\uace1 \uacc4\uc218\ub77c\uace0 \ud569\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/26ad926921974fb12443390fe4f8e91c9c2a9e38.png\" alt=\"\" width=\"370\" height=\"18\" class=\"aligncenter size-full wp-image-6875\" \/><\/p>\n<p>\ucd94\uac00\uc801\uc73c\ub85c, \uce74\uba54\ub77c\uc758 \ub0b4\ubd80(Intrinsic) \ubc0f \uc678\ubd80(Extrinsic) \ud30c\ub77c\uba54\ud130\uc5d0 \ub300\ud55c \uba87\uac00\uc9c0 \ub354 \ub9ce\uc740 \uc815\ubcf4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ub0b4\ubd80 \ud30c\ub77c\uba54\ud130\ub294 \uce74\uba54\ub77c\uc5d0 \ud2b9\uc815\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uba3c\uc800 \ucd08\uc810 \uae38\uc774(<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/7e7676a33200adb748a20857dfcc35d3e400a55f.png\" alt=\"\" width=\"41\" height=\"18\" class=\"alignnone size-full wp-image-6876\" \/>), \uad11\ud559 \uc911\uc2ec(<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/c17fedc7253a535ef58793a77030ce9481c32e7b.png\" alt=\"\" width=\"39\" height=\"14\" class=\"alignnone size-full wp-image-6878\" \/>) \ub4f1\uc785\ub2c8\ub2e4. \uc774\ub4e4\uc744 \uce74\uba54\ub77c \uba54\ud2b8\ub9ad\uc2a4\ub77c\uace0 \ubd80\ub985\ub2c8\ub2e4. \uc774\ub294 \uc624\uc9c1 \uce74\uba54\ub77c\uc758 \ud2b9\uc131\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, \ud55c\ubc88 \uacc4\uc0b0\ub418\uba74 \ubcc0\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uacc4\uc18d \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798\uc758 \ud589\ub82c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/5e9d2db8b3561f68fa0688992fa45c13766a382c.png\" alt=\"\" width=\"243\" height=\"67\" class=\"aligncenter size-full wp-image-6880\" \/><\/p>\n<p>\uc678\ubd80 \ud30c\ub77c\uba54\ud130\ub294 3\ucc28\uc6d0 \ud3ec\uc778\ud2b8\ub97c \uc88c\ud45c\uccb4\uacc4\ub85c \uc774\ub3d9\ud558\ub294 \ud68c\uc804 \ubc0f \uc774\ub3d9 \ubca1\ud130\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc2a4\ud14c\ub808\uc624 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c \uc65c\uace1\uc744 \uac00\uc7a5 \uba3c\uc800 \ubcf4\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub4e4 \ubaa8\ub4e0 \ud30c\ub77c\uba54\ud130\ub97c \uad6c\ud558\uae30 \uc704\ud574, \ud574\uc57c\ud560 \uac83\uc740 \uc798 \uc815\uc758\ub41c \ud328\ud134(\uc608\ub97c\ub4e4\uc5b4, \uccb4\uc2a4\ud310)\uc774 \ub2f4\uae34 \uc0d8\ud50c \uc774\ubbf8\uc9c0\ub4e4\uc744 \uc81c\uacf5\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uc774\ubbf8\uc9c0 \ub0b4\ubd80\uc5d0 \uc9c0\uc815\ub41c \uc9c0\uc810\ub4e4(\uccb4\uc2a4\ubcf4\ub4dc\uc758 \uc0ac\uac01\ud615 \ubaa8\uc11c\ub9ac)\uc744 \ucc3e\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \uc54c\uace0 \uc788\ub294 \uc2e4\uc138\uacc4\uc5d0\uc11c\uc758 \uc88c\ud45c\uac00 \uc774\ubbf8\uc9c0\uc758 \uc5b4\ub514\uc5d0 \ud574\ub2f9\ud558\ub294\uc9c0\ub97c \ud30c\uc545\ud560 \uc218 \uc788\ub294 \uc9c0\uc810\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ub370\uc774\ud130\ub97c \uac00\uc9c0\uace0, \uba87\uac00\uc9c0 \uc218\ud559\uc801 \ubb38\uc81c\uac00 \uc65c\uace1 \uacc4\uc218\ub97c \uc5bb\uae30 \uc704\ud55c \ubc14\ud0d5 \uc704\uc5d0\uc11c \ud574\uacb0\ub429\ub2c8\ub2e4. \uc9c0\uae08\uae4c\uc9c0\uac00 \uc804\uccb4 \uc774\uc57c\uae30\uc5d0 \ub300\ud55c \uc694\uc57d\uc785\ub2c8\ub2e4. \uce74\uba54\ub77c \ubcf4\uc815\uc744 \uc704\ud55c \ub354 \uc88b\uc740 \uacb0\uacfc\ub97c \uc704\ud574 \ucd5c\uc18c\ud55c 10\uac1c\uc758 \ud328\ud134 \uc774\ubbf8\uc9c0\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc55e\uc11c \uc5b8\uae09\ud588\ub358 \uac83\ucc98\ub7fc, \uce74\uba54\ub77c \ubcf4\uc815\uc744 \uc704\ud574 \ucd5c\uc18c\ud55c 10\uac1c\uc758 \ud14c\uc2a4\ud2b8 \ud328\ud134 \uc774\ubbf8\uc9c0\uac00 \ud544\uc694\ud558\ub2e4\uace0 \ud588\uc2b5\ub2c8\ub2e4. \uc774\ud574\ub97c \ub3d5\uae30 \uc704\ud574, \uccb4\uc2a4 \ubcf4\ub4dc\uc5d0 \ub300\ud55c \ud558\ub098\uc758 \uc774\ubbf8\uc9c0\uc5d0 \uc9d1\uc911\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uce74\uba54\ub77c \ubcf4\uc815\uc744 \uc704\ud574 \ud544\uc694\ud55c \uc911\uc694\ud55c \uc785\ub825 \ub370\uc774\ud130\ub294 3\ucc28\uc6d0\uc758 \uc2e4\uc138\uacc4\uc758 \uc9c0\uc810\uc5d0 \ub300\ud55c \uc9d1\ud569\uacfc \uc774 \uc9d1\ud569\uc5d0 \ub300\ud55c 2\ucc28\uc6d0 \uc774\ubbf8\uc9c0 \uc0c1\uc758 \uc9c0\uc810 \uc9d1\ud569\uc785\ub2c8\ub2e4. 2\ucc28\uc6d0 \uc774\ubbf8\uc9c0 \uc9c0\uc810\uc740 \uc774\ubbf8\uc9c0\ub85c\ubd80\ud130 \uc27d\uac8c \ubc1c\uacb0\ud560 \uc218 \uc788\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. (\uc774\ub4e4 \uc774\ubbf8\uc9c0 \uc9c0\uc810\ub4e4\uc740 2\uac1c\uc758 \uac80\uc815\uc0c9 \uc0ac\uac01\ud615\uc774 \ub9de\ub2ff\uc740 \uc704\uce58\uac00 \ub429\ub2c8\ub2e4)<\/p>\n<p>\uc2e4\uc138\uacc4 \uacf5\uac04\uc5d0 \ub300\ud55c 3\ucc28\uc6d0 \uc9c0\uc810\uc740 \ubb34\uc5c7\uc77c\uae4c\uc694? \uc774\ub4e4 \uc774\ubbf8\uc9c0\ub294 \uc815\uc801\uc778 \uce74\uba54\ub77c\ub85c\ubd80\ud130 \ucd2c\uc601\ub418\uc5c8\uace0 \uccb4\uc2a4 \ubcf4\ub4dc\ub294 \ub2e4\ub978 \uc704\uce58\uc640 \ubc29\ud5a5\uc5d0 \ub193\uc5ec \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub798\uc11c \uc6b0\ub9ac\ub294 <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/512ffb563b5757e9704055fa55a7fcab41e30a31.png\" alt=\"\" width=\"68\" height=\"18\" class=\"alignnone size-full wp-image-6896\" \/> \uc88c\ud45c\ub97c \ud30c\uc545\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ub2e8\uc21c\ud654\uc2dc\ud0a4\uae30 \uc704\ud574, \uccb4\uc2a4\ud310\uc774 XY \ud3c9\uba74\uc744 \uc720\uc9c0\ud558\uace0 \uc788\ub2e4\uace0 \ub9d0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4(\uc989 \ud56d\uc0c1 Z=0).  \uadf8\ub9ac\uace0 \uce74\uba54\ub77c\ub294 \uc774\uc5d0 \ub530\ub77c \uc6c0\uc9c1\uc774\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc911\uc694\ud55c \uac00\uc815\uc774 \uc624\uc9c1 X, Y\uac12\ub9cc\uc744 \uacc4\uc0b0\ud558\ub294 \uac83\uc73c\ub85c \ub2e8\uc21c\ud654\uc2dc\ucf1c \uc90d\ub2c8\ub2e4. \uc774\uc81c X,Y \uac12\uc5d0 \ub300\ud574, \uc9c0\uc810\uc758 \uc704\uce58\ub97c \ub098\ud0c0\ub0b4\ub294 (0,0), (1,0), (2,0), &#8230; \ud615\uc2dd\uc73c\ub85c \ub2e8\uc21c\ud558\uac8c \uc804\ub2ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uacbd\uc6b0, \uacb0\uacfc\ub294 \uccb4\uc2a4\ud310\uc5d0\uc11c\uc758 \uc0ac\uac01\ud615\uc758 \ud06c\uae30 \ucd95\ucc99\uc73c\ub85c \uad6c\ud574\uc9d1\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ub9cc\uc57d \uc774 \uc0ac\uac01\ud615\uc758 \ud06c\uae30\ub97c \uc54c\uace0 \uc788\ub2e4\uba74(30mm\ub77c\uace0 \ub9d0\ud560 \uc218 \uc788\ub2e4\uba74), mm \ub2e8\uc704 \uacb0\uacfc\ub85c\uc368 (0,0), (30,0), (60,0), &#8230;\ucc98\ub7fc \uc804\ub2ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc2e4\uc138\uacc4\uc5d0\uc11c\uc758 3D \uc9c0\uc810\uc744 \uac1d\uccb4 \uc9c0\uc810\uc774\ub77c\uace0\ud558\uace0, 2D \uc774\ubbf8\uc9c0 \uc9c0\uc810\uc744 \uc774\ubbf8\uc9c0 \uc9c0\uc810\uc774\ub77c\uace0 \ud569\ub2c8\ub2e4. <\/p>\n<p>\uccb4\uc2a4\ubcf4\ub4dc\uc758 \ud328\ud134\uc744 \ucc3e\uae30 \uc704\ud574, cv2.findChessboardCorners() \ud568\uc218\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ub610\ud55c \ucc3e\uace0\uc790 \ud558\ub294 \ud328\ud134\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc778\uc9c0, \uc989 8&#215;8 \uaca9\uc790\uc778\uc9c0 5&#215;5\uaca9\uc790\uc778\uc9c0 \ub4f1\uacfc \uac19\uc774 \ub9d0\uc785\ub2c8\ub2e4. \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 7&#215;6 \uaca9\uc790\uc785\ub2c8\ub2e4. \uc774 \ud568\uc218\ub294 \ucf54\ub108 \uc9c0\uc810\uacfc \ud328\ud134\uc774 \ubc1c\uacac\ub418\uc5c8\ub294\uc9c0\uc758 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\ub4e4 \ucf54\ub108 \uc9c0\uc810\ub4e4\uc740 \uc704\uce58\uc0c1 \uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd\uc73c\ub85c, \uc704\uc5d0\uc11c \uc544\ub798\ub85c \uc815\ub82c\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uccb4\uc2a4\ud310\uacfc \uac19\uc740 \uc774\ubbf8\uc9c0 \ub300\uc2e0\uc5d0 \uc6d0\ud615 \uadf8\ub9ac\uace0 \uc774\ubbf8\uc9c0\ub97c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\ub294\ub370, \uc774\ub54c\ub294 cv2.findCirclesGrid()\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc77c\ub2e8 \ucf54\ub108\ub97c \ubc1c\uacac\ud558\uba74, cv2.cornerSubPix() \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc815\ud655\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c cv2.drawChessboardCorners() \ud568\uc218\ub97c \uc0ac\uc6a9\ud574 \ucf54\ub108 \uacb0\uacfc\ub97c \uadf8\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\uae4c\uc9c0\uc758 \uc774\uc57c\uae30\uc5d0 \ub300\ud55c \uc804\uccb4 \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nimport numpy as np\r\nimport cv2\r\nimport glob\r\n\r\n# termination criteria\r\ncriteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)\r\n\r\n# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)\r\nobjp = np.zeros((6*7,3), np.float32)\r\nobjp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)\r\n\r\n# Arrays to store object points and image points from all the images.\r\nobjpoints = [] # 3d point in real world space\r\nimgpoints = [] # 2d points in image plane.\r\n\r\nimages = glob.glob('.\/data\/chess\/*.jpg')\r\n\r\nfor fname in images:\r\n    img = cv2.imread(fname)\r\n    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\r\n\r\n    # Find the chess board corners\r\n    ret, corners = cv2.findChessboardCorners(gray, (7,6),None)\r\n\r\n    # If found, add object points, image points (after refining them)\r\n    if ret == True:\r\n        objpoints.append(objp)\r\n\r\n        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)\r\n        imgpoints.append(corners2)\r\n\r\n        # Draw and display the corners\r\n        img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)\r\n        cv2.imshow('img',img)\r\n        cv2.waitKey(500)\r\n\r\ncv2.destroyAllWindows()\r\n<\/pre>\n<p>\ub3d9\uc77c\ud55c \uce74\uba54\ub85c \uc704\uce58\uc640 \uac01\ub3c4\uc5d0\uc11c, \uc11c\ub85c \ub2e4\ub978 \uccb4\uc2a4\ud310\uc758 \uc704\uce58\ub85c \ucd2c\uc601\ub41c 13\uac1c\uc758 \uc774\ubbf8\uc9c0\ub97c \ud65c\uc6a9\ud558\uc5ec \ud328\ud134\uc744 \uac80\ucd9c\ud558\ub294\ub370, \uc2e4\ud589 \uacb0\uacfc \uc911 \ud55c\ucef7\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/CameraCalibration01.png\" alt=\"\" width=\"643\" height=\"513\" class=\"alignnone size-full wp-image-6901\" \/><\/p>\n<p>\ud328\ud134 \uac80\ucd9c\uc744 \ud1b5\ud574 \uac1d\uccb4 \uc9c0\uc810(objpoints)\uacfc \uc774\ubbf8\uc9c0 \uc9c0\uc810(imgpoints)\uc744 \ud30c\uc545\ud588\uc73c\ubbc0\ub85c, \uc774\ub97c \uc774\uc6a9\ud574 \uc65c\uace1\ub41c \ucd2c\uc601 \uc601\uc0c1\uc744 \ubcf4\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubcf4\uc815 \uc804\uc5d0 cv2.getOptimalNewCameraMatrix() \ud568\uc218\ub97c \uc774\uc6a9\ud574 \uba3c\uc800 \uce74\uba54\ub77c \uba54\ud2b8\ub9ad\uc2a4\ub97c \uad6c\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774 \ud568\uc218\ub294 \uce74\uba54\ub77c \uba54\ud2b8\ub9ad\uc2a4, \uc65c\uace1 \uacc4\uc218, \ud68c\uc804\/\uc774\ub3d9 \ubca1\ud130 \ub4f1\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4. \uc774 \ucf54\ub4dc\ub294 \uc704\uc758 \uc608\uc81c \ucf54\ub4dc\uc5d0\uc11c 36\ubc88\uc9f8 \uc904\uc758 for \ubb38 \uc678\ubd80\uc5d0 \uc704\uce58\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)\r\n<\/pre>\n<p>\uc774\uc81c \uc774\ubbf8\uc9c0\uc758 \uc65c\uace1\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub294\ub370, OpenCV\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uba3c\uc800 \uc65c\uace1\uc744 \uc81c\uac70\ud558\uae30\uc5d0 \uc55e\uc11c cv2.getOptimalNewCameraMatrix() \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uce74\uba54\ub77c \uba54\ud2b8\ub9ad\uc2a4\ub97c \uac1c\uc120\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud568\uc218\uc758 \uc2a4\ucf00\uc77c\ub9c1 \uc778\uc790 alpha = 0 \uc77c \uacbd\uc6b0, \uc6d0\uce58\uc54a\ub294 \ud53d\uc140\uc744 \ucd5c\uc18c\ub85c \uac16\ub294 \ubcf4\uc815\ub41c \uc774\ubbf8\uc9c0\uac00 \uc5bb\uc5b4\uc9c0\ub294\ub370, \ucf54\ub108 \uc9c0\uc810\uc758 \ud53d\uc140\ub4e4\uc774 \uc81c\uac70\ub420 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. alpha = 1\uc77c \uacbd\uc6b0 \ubaa8\ub4e0 \ud53d\uc140\uc740 \uc720\uc9c0\ub429\ub2c8\ub2e4. \uc774 \ud568\uc218\ub294 \ub610\ud55c \uacb0\uacfc\ub97c \uc790\ub974\ub294\ub370 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc774\ubbf8\uc9c0 ROI\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. 13\uac1c\uc758 \uc0d8\ud50c \uc774\ubbf8\uc9c0 \uc911 \uc65c\uace1 \ud604\uc0c1\uc744 \uc81c\uac70\ud560 \ud558\ub098\ub97c \uc0ac\uc6a9\ud574 \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \uc5bb\uace0, \uce74\uba54\ub77c \uba54\ud2b8\ub9ad\uc2a4\ub97c \uc5bb\ub294 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nimg = cv2.imread('.\/data\/chess\/left12.jpg')\r\nh,  w = img.shape[:2]\r\nnewcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))\r\n<\/pre>\n<p>\uc704\uc5d0\uc11c \uc65c\uace1\uc744 \uc81c\uac70\ud558\ub294 \ubc29\ubc95\uc774 OpenCV\uc5d0\uc11c\ub294 2\uac00\uc9c0\ub97c \uc81c\uacf5\ud55c\ub2e4\uace0 \ud588\ub294\ub370, \uccab\ubc88\uc7ac\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\ndst = cv2.undistort(img, mtx, dist, None, newcameramtx)\r\n\r\nx,y,w,h = roi\r\ndst = dst[y:y+h, x:x+w]\r\ncv2.imwrite('calibresult.png',dst)\r\n<\/pre>\n<p>\uc704\uc640 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \uc81c\uacf5\ud558\ub294 \ub610 \ub2e4\ub978 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nmapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)\r\ndst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)\r\n\r\nx,y,w,h = roi\r\ndst = dst[y:y+h, x:x+w]\r\ncv2.imwrite('calibresult.png',dst)\r\n<\/pre>\n<p>\uc2e4\ud589\ud574\ubcf4\uba74, \uba3c\uc800 13\uc7a5\uc758 \uc0d8\ud50c \uc774\ubbf8\uc9c0\ub97c \ud1b5\ud574 \ud328\ud134\uc744 \ubd84\uc11d\ud558\uace0, \ubd84\uc11d\ub41c \ud328\ud134\uc744 \ud1b5\ud574 \uce74\uba54\ub77c \uba54\ud2b8\ub9ad\uc2a4\uac00 \uc5bb\uc5b4\uc9c0\uba70 \uc774 \uba54\ud2b8\ub9ad\uc2a4\ub97c \uac1c\uc120\ud55c \ub4a4 \ucd5c\uc885\uc801\uc73c\ub85c \uc65c\uace1\ub41c \ubd80\ubd84\uc744 \uc81c\uac70\ud574 calibresult.png \ud30c\uc77c\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4. calibresult.png \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc65c\uace1\uc774 \uc81c\uac70\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/calibresult.png\" alt=\"\" width=\"615\" height=\"438\" class=\"alignnone size-full wp-image-6905\" \/><\/p>\n<p>\uc55e\uc11c \uacc4\uc0b0\ud55c \uce74\uba54\ub77c \ud589\ub82c\uacfc \uc65c\uace1\uacc4\uc218\ub4e4\uc740 \uc800\uc7a5\ud574\ub450\uace0 \uc7ac\ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc65c\uace1 \uc81c\uac70\ub294 \uc774\ubbf8\uc9c0\uc758 \ud504\ub85c\uc81d\uc158\uc785\ub2c8\ub2e4. \uc774 \uc65c\uace1 \uc81c\uac70 \uc2dc \uc218\ud589\ub41c \ud504\ub85c\uc81d\uc158\uc5d0 \ubc1c\uc0dd\ud558\ub294 \uc624\ucc28\uac00 \uc5bc\ub9c8\uc778\uc9c0\ub97c \uc54c\uae30 \uc704\ud574 cv2.projectPoints() \ud568\uc218\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uacb0\uacfc\uc801\uc73c\ub85c \uc5bb\uc5b4\uc9c0\ub294 \uac12\uc774 0\uc5d0 \uac00\uae4c\uc6b8\uc218\ub85d \uc815\ud655\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\ntot_error = 0\r\nfor i in range(len(objpoints)):\r\n    imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)\r\n    error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)\/len(imgpoints2)\r\n    tot_error += error\r\n\r\nprint(\"total error: \", tot_error\/len(objpoints))\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\uc774 \uae00\uc758 \uc6d0\ubb38\uc740 https:\/\/opencv-python-tutroals.readthedocs.io\/en\/latest\/py_tutorials\/py_calib3d\/py_calibration\/py_calibration.html \uc785\ub2c8\ub2e4. \uce74\uba54\ub77c\ub098 \ube44\ub514\uc624 \uc601\uc0c1\uc758 \uc65c\uace1 \ud604\uc0c1\uacfc \uce74\uba54\ub77c\uc758 \ub0b4\ubd80, \uc678\ubd80 \ud30c\ub77c\uba54\ud130\uc5d0 \ub300\ud574 \ud559\uc2b5\ud558\uba70, \uc774\ub7f0 \ud30c\ub77c\uba54\ud130\ub97c \uc5bb\ub294 \ubc29\ubc95\uacfc \uc774\ubbf8\uc9c0\uc758 \uc65c\uace1 \ud604\uc0c1\uc744 \uc81c\uac70\ud558\ub294 \ub0b4\uc6a9\uc744 \uc124\uba85\ud569\ub2c8\ub2e4. \ud604\ub300\uc758 \uac12 \uc2fc \uc18c\ud615 \uce74\uba54\ub77c(\ub178\ud2b8\ubd81\uc774\ub098 \uc2a4\ub9c8\ud2b8\ud3f0\uc5d0 \uc7a5\ucc29\ub41c \uac1c\ubbf8 \ub208\ud06c\uae30 \ub9cc\ud55c \ub80c\uc988\uac19\uc740..)\uc740 \uc0c1\ub2f9\ud55c \uc774\ubbf8\uc9c0\uc758 \uc65c\uace1\uc744 \ubc1c\uc0dd\uc2dc\ud0b5\ub2c8\ub2e4. \uc8fc\uc694\ud55c \uc65c\uace1\uc740 \ubc29\uc0ac \uc65c\uace1\uacfc \ud0c4\uc820\ud2f0\uc5bc(Tangential) \uc65c\uace1\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ubc29\uc0ac \uc65c\uace1\uc73c\ub85c \uc778\ud574, \uc544\ub798\uc758 \uadf8\ub9bc\ucc98\ub7fc \ubc18\ub4ef\ud55c \ud615\uc0c1\uc774 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=6868\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Python\uacfc OpenCV \u2013 43 : \uce74\uba54\ub77c \ubcf4\uc815(Camera Calibration)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[130,131,1],"tags":[],"class_list":["post-6868","post","type-post","status-publish","format-standard","hentry","category-opencv","category-python","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6868"}],"version-history":[{"count":19,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6868\/revisions"}],"predecessor-version":[{"id":9421,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6868\/revisions\/9421"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6868"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}