{"id":6832,"date":"2019-05-09T17:37:25","date_gmt":"2019-05-09T08:37:25","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=6832"},"modified":"2020-05-28T10:35:07","modified_gmt":"2020-05-28T01:35:07","slug":"python%ea%b3%bc-opencv-35-%ec%9d%b4%eb%af%b8%ec%a7%80%ec%9d%98-%ed%8a%b9%ec%a7%95%ec%a0%90-%eb%a7%a4%ec%b9%ad%ec%9d%84-%ed%86%b5%ed%95%9c-homography-%eb%b6%84%ec%84%9d","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=6832","title":{"rendered":"Python\uacfc OpenCV \u2013 39 : \uc774\ubbf8\uc9c0\uc758 \ud2b9\uc9d5\uc810 \ub9e4\uce6d\uc744 \ud1b5\ud55c Homography \ubd84\uc11d"},"content":{"rendered":"<p>\uc774 \uae00\uc758 \uc6d0\ubb38\uc740 https:\/\/opencv-python-tutroals.readthedocs.io\/en\/latest\/py_tutorials\/py_feature2d\/py_feature_homography\/py_feature_homography.html \uc785\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 Homography\uc758 \uc815\uc758\ub294 \ud55c \ud3c9\uba74\uc744 \ub2e4\ub978 \ud3c9\uba74\uc5d0 \ud22c\uc601\ud588\uc744 \ub54c, \ud22c\uc601\ub41c \ub300\uc751\uc810\ub4e4 \uc0ac\uc774\uc5d0\uc11c\uc758 \ubcc0\ud658 \uad00\uacc4\ub77c\uace0 \ud569\ub2c8\ub2e4. \uc774\ub97c \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc124\uba85\ud558\uba74, 2\uac1c\uc758 \uc774\ubbf8\uc9c0\uac00 \uc788\ub2e4\uba74 \uccab\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uc758 \ub0b4\uc6a9\uc744 \ub450\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uc5d0\uc11c \ud3ec\ud568\ud558\uace0 \uc788\ub294\ub370.. \uccab\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uac00 \ub450\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uc758 \uc5b4\ub290 \uc704\uce58\ub85c \ud22c\uc601 \ub418\uc5c8\ub294\uac00\ub85c \uc0dd\uac01\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798\ub294 \uc774 \uae00\uc5d0\uc11c \uc18c\uac1c\ud560 \uc608\uc81c\uc758 \uc2e4\ud589 \uacb0\uacfc\uc785\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/05\/homography.png\" alt=\"\" width=\"1453\" height=\"1195\" class=\"aligncenter size-full wp-image-6833\" \/><\/p>\n<p>\uc704\uc758 \uc774\ubbf8\uc9c0\ub97c \ubcf4\uba74, \uc88c\uce21\uc640 \uc6b0\uce21\uc5d0 2\uac1c\uc758 \uc774\ubbf8\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc88c\uce21 \uc774\ubbf8\uc9c0\ub294 \uc6b0\uce21 \uc774\ubbf8\uc9c0\uc758 \uc5b4\ub5a4 \uc77c\uc815 \ubd80\ubd84\uc73c\ub85c \ud22c\uc601\ub418\ub294\ub370.. \ubc14\ub85c \uc6b0\uce21 \uc774\ubbf8\uc9c0\uc5d0 \ud558\uc580\uc0c9\uc73c\ub85c \ud45c\uc2dc\ub41c \uc0ac\uac01\ud615 \uc601\uc5ed\uc785\ub2c8\ub2e4. \uc774 \uae00\uc740 \ubc14\ub85c \uc774 \ud558\uc580\uc0c9 \uc0ac\uac01\ud615 \uc601\uc5ed\uc744 \uc774\ubbf8\uc9c0\uc758 \ud2b9\uc9d5\uc810 \ub9e4\uce6d\uc744 \ud1b5\ud574 \ubd84\uc11d\ud558\ub294 \uae00\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubbf8 \uc55e\uc11c \uc124\uba85\ud588\ub358 \uc774\ubbf8\uc9c0\uc758 \ud2b9\uc9d5\uc810\uc744 \uad6c\ud574 \ub9e4\uce6d\uc744 \ud588\ub2e4\uba74, cv2.findHomography()\uc640 cv2.perspectiveTransform() \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec Homography \ubd84\uc11d\uc744 \ud1b5\ud574 \ud22c\uc601\ub41c \uc601\uc5ed\uc744 \ucc3e\uc544\ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\uc758 \ucf54\ub4dc\ub294 \uc704\uc758 \uc774\ubbf8\uc9c0 \uacb0\uacfc\uc5d0 \ub300\ud55c \uc608\uc81c\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nimport numpy as np\r\nimport cv2\r\nfrom matplotlib import pyplot as plt\r\n\r\nMIN_MATCH_COUNT = 10\r\n\r\nimg1 = cv2.imread('.\/data\/harleyQuinnA.jpg',0) # queryImage\r\nimg2 = cv2.imread('.\/data\/harleyQuinnB.jpg',0) # trainImage\r\n\r\n# Initiate SIFT detector\r\nsift = cv2.xfeatures2d.SIFT_create()\r\n\r\n# find the keypoints and descriptors with SIFT\r\nkp1, des1 = sift.detectAndCompute(img1,None)\r\nkp2, des2 = sift.detectAndCompute(img2,None)\r\n\r\nFLANN_INDEX_KDTREE = 0\r\nindex_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)\r\nsearch_params = dict(checks = 50)\r\n\r\nflann = cv2.FlannBasedMatcher(index_params, search_params)\r\n\r\nmatches = flann.knnMatch(des1,des2,k=2)\r\n\r\n# store all the good matches as per Lowe's ratio test.\r\ngood = []\r\nfor m,n in matches:\r\n    if m.distance < 0.3*n.distance:\r\n        good.append(m)\r\n\r\nif len(good)>MIN_MATCH_COUNT:\r\n    src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)\r\n    dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)\r\n\r\n    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)\r\n    matchesMask = mask.ravel().tolist()\r\n\r\n    h,w = img1.shape\r\n    pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)\r\n    dst = cv2.perspectiveTransform(pts,M)\r\n\r\n    img2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA)\r\nelse:\r\n    print(\"Not enough matches are found - %d\/%d\" % (len(good),MIN_MATCH_COUNT))\r\n    matchesMask = None\r\n\r\ndraw_params = dict(matchColor = (0,255,0), # draw matches in green color\r\n                   singlePointColor = None,\r\n                   matchesMask = matchesMask, # draw only inliers\r\n                   flags = 2)\r\n\r\nimg3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)\r\n\r\nplt.imshow(img3, 'gray'),plt.show()\r\n<\/pre>\n<p>1-31\ubc88\uae4c\uc9c0\uc758 \ucf54\ub4dc\ub294 \uc774\ubbf8\uc9c0\uc758 \ud2b9\uc9d5\uc810\uc744 \ucd94\ucd9c\ud558\uace0 \uc774 \uc911 \uac00\uc7a5 \uc88b\uc740 \ud2b9\uc9d5\uc810\uc744 28\ubc88\uc758 if \ubb38\uc744 \uae30\uc900\uc73c\ub85c \uc120\ubcc4\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \uc120\ubcc4\ub41c \ud2b9\uc9d5\uc810\uc744 31-45\ubc88 \ucf54\ub4dc\ub97c \ud1b5\ud574 Homography\ub97c \ubd84\uc11d\ud558\uc5ec \uc774\ubbf8\uc9c0\uc5d0 \uadf8\ub9bd\ub2c8\ub2e4. 47-54\ucf54\ub4dc\ub294 \uc774\ub807\uac8c \uadf8\ub824\uc9c4 Homography\uc640 \ud568\uaed8 \ub450 \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc758 \ub3d9\uc77c\ud55c \ud2b9\uc9d5\uc810\uc5d0 \ub300\ud55c \uc120\uc744 \uadf8\ub824\uc8fc\uace0 \ud654\uba74\uc5d0 \ud45c\uc2dc\ud569\ub2c8\ub2e4.<\/p>\n<p\/>\n","protected":false},"excerpt":{"rendered":"<p>\uc774 \uae00\uc758 \uc6d0\ubb38\uc740 https:\/\/opencv-python-tutroals.readthedocs.io\/en\/latest\/py_tutorials\/py_feature2d\/py_feature_homography\/py_feature_homography.html \uc785\ub2c8\ub2e4. \uba3c\uc800 Homography\uc758 \uc815\uc758\ub294 \ud55c \ud3c9\uba74\uc744 \ub2e4\ub978 \ud3c9\uba74\uc5d0 \ud22c\uc601\ud588\uc744 \ub54c, \ud22c\uc601\ub41c \ub300\uc751\uc810\ub4e4 \uc0ac\uc774\uc5d0\uc11c\uc758 \ubcc0\ud658 \uad00\uacc4\ub77c\uace0 \ud569\ub2c8\ub2e4. \uc774\ub97c \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc124\uba85\ud558\uba74, 2\uac1c\uc758 \uc774\ubbf8\uc9c0\uac00 \uc788\ub2e4\uba74 \uccab\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uc758 \ub0b4\uc6a9\uc744 \ub450\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uc5d0\uc11c \ud3ec\ud568\ud558\uace0 \uc788\ub294\ub370.. \uccab\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uac00 \ub450\ubc88\uc9f8 \uc774\ubbf8\uc9c0\uc758 \uc5b4\ub290 \uc704\uce58\ub85c \ud22c\uc601 \ub418\uc5c8\ub294\uac00\ub85c \uc0dd\uac01\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798\ub294 \uc774 \uae00\uc5d0\uc11c \uc18c\uac1c\ud560 \uc608\uc81c\uc758 \uc2e4\ud589 \uacb0\uacfc\uc785\ub2c8\ub2e4. \uc704\uc758 \uc774\ubbf8\uc9c0\ub97c \ubcf4\uba74, \uc88c\uce21\uc640 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=6832\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Python\uacfc OpenCV \u2013 39 : \uc774\ubbf8\uc9c0\uc758 \ud2b9\uc9d5\uc810 \ub9e4\uce6d\uc744 \ud1b5\ud55c Homography \ubd84\uc11d&#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],"tags":[],"class_list":["post-6832","post","type-post","status-publish","format-standard","hentry","category-opencv","category-python"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6832","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=6832"}],"version-history":[{"count":6,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6832\/revisions"}],"predecessor-version":[{"id":9429,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6832\/revisions\/9429"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6832"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}