{"id":6714,"date":"2019-04-18T12:22:51","date_gmt":"2019-04-18T03:22:51","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=6714"},"modified":"2019-05-21T08:17:43","modified_gmt":"2019-05-20T23:17:43","slug":"python%ea%b3%bc-opencv-25-%ec%9d%b4%eb%af%b8%ec%a7%80%ec%97%90%ec%84%9c-%ec%84%a0%ed%98%95-%eb%8f%84%ed%98%95-%ea%b2%80%ec%b6%9chough-line-transform","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=6714","title":{"rendered":"Python\uacfc OpenCV \u2013 26 : \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc120\ud615 \ub3c4\ud615 \uac80\ucd9c(Hough Line  Transform)"},"content":{"rendered":"<p>\uc774 \uae00\uc758 \uc6d0\ubb38\uc740 https:\/\/opencv-python-tutroals.readthedocs.io\/en\/latest\/py_tutorials\/py_imgproc\/py_houghlines\/py_houghlines.html#hough-lines \uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubbf8\uc9c0\uc5d0\uc11c \uc120 \ubaa8\uc591\uc758 \ub3c4\ud615\uc744 \uac80\ucd9c\ud558\ub294 Hough Transform\uc5d0 \ub300\ud574 \uc0b4\ud3b4\ubcf4\uace0, \uc774 \uc54c\uace0\ub9ac\uc998\uc744 \uad6c\ud604\ud55c OpenCV\uc758 \ud568\uc218\ub97c \uc0b4\ud3b4\ubd05\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 Hough Transfom\uc740 \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc218\ud559\uc801\uc73c\ub85c \ud45c\ud604 \uac00\ub2a5\ud55c \ub3c4\ud615\uc744 \uac80\uc0c9\ud558\ub294 \uae30\uc220\uc785\ub2c8\ub2e4. \uadf8 \ub3c4\ud615 \uc911 \uc120\ud615\uc5d0 \ub300\ud574 \uac80\uc0c9\ud574 \ubcfc\ud150\ub370\uc694. \uc120\uc5d0 \ub300\ud55c \ubc29\uc815\uc2dd\uc740 \uc6b0\ub9ac\uac00 \ud754\ud788 \uc54c\uace0 \uc788\ub294 \uae30\uc6b8\uae30(m)\uc640 y\uc808\ud3b8(c)\ub85c \ud45c\ud604\ub418\ub294 \ud835\udc66=m\ud835\udc65+c\ub3c4 \uc788\uc9c0\ub9cc \uc0bc\uac01\ud568\uc218\uc5d0 \uc758\ud55c \ub9e4\uac1c\ubcc0\uc218 \ubc29\uc815\uc2dd\uc73c\ub85c\uc368\ub294 r = \ud835\udc65cos\ud835\udf03 + \ud835\udc66sin\ud835\udf03 \ub85c\ub3c4 \ud45c\ud604\ub429\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2019\/04\/line-eq.png\" alt=\"\" width=\"759\" height=\"696\" class=\"aligncenter size-full wp-image-6716\" \/><\/p>\n<p>r\ub294 \uc6d0\uc810\uc73c\ub85c\ubd80\ud130 \uc9c1\uc120\uae4c\uc9c0\uc758 \uc218\uc9c1\uac70\ub9ac\uc774\uace0, \ud835\udf03\ub294 \uc218\uc9c1\uc120\uc73c\ub85c\ubd80\ud130 x\ucd95\uae4c\uc9c0\uc758 \ubc18\uc2dc\uacc4\ubc29\ud5a5 \uac01\ub3c4\uc785\ub2c8\ub2e4. \uc774 \uc120\uc5d0 \ub300\ud55c \ubaa8\ub378\uc740 (r, \ud835\udf03)\ub85c \ud45c\ud604\ub418\uace0, \uc774\ub97c 2\ucc28\uc6d0 \ubc30\uc5f4\uc5d0 \ub9f5\ud551\ud558\ub294 \uac83\uc744 \uc0dd\uac01\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc989, 2\ucc28\uc6d0 \ubc30\uc5f4\uc758 \uc5f4(row)\uac00 r\uc774\uace0 \ud589(column)\uc774 \ud835\udf03\ub85c \uc815\ud569\ub2c8\ub2e4. \uac70\ub9ac r\uacfc \uac01\ub3c4 \ud835\udf03\uc5d0 \ub300\ud55c \uc815\ubc00\ub3c4\ub97c \uace0\ub824\ud558\uc9c0 \uc54a\uc73c\uba74 \ubc30\uc5f4\uc758 \ud06c\uae30\ub294 \ubb34\ud55c\ub300\uac00 \ub429\ub2c8\ub2e4. \uadf8\ub798\uc11c r\uc740 \uc774\ubbf8\uc9c0\uc758 \ub300\uac01 \ud06c\uae30\ub85c \ud558\uba70 \ub2e8\uc704\ub294 1\ub85c \ud569\ub2c8\ub2e4. \uc774\ubbf8\uc9c0\ub294 \ud53d\uc140\ub85c \uad6c\ubd84\ub418\ub2c8\uae4c\uc694. \uadf8\ub9ac\uace0 \ud835\udf03\ub294 0-180\uc758 \ubc94\uc704\ub85c \ud558\uace0 \ub2e8\uc704\ub294 1\ub85c \ud569\ub2c8\ub2e4. \ud835\udf03\ub97c 0-180\ub85c \ud558\uba74 \uc5b4\ub5a0\ud55c \uc120\ub3c4 \ud45c\ud604 \uac00\ub2a5\ud558\uace0, \ub2e8\uc704\ub97c 1\ub85c \ud55c\ub2e4\ub294 \uac83\uc740 \ud68c\uc804\ub41c \uc120\uc744 \ucd1d 180\uac1c\ub85c\ub9cc \ud45c\ud604 \uac00\ub2a5\ud558\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc989, 1\ub3c4 \ub2e8\uc704\ub294 \uc815\ubc00\ub3c4\uc758 \ub2e8\uc704\uc785\ub2c8\ub2e4. \uc774\uc81c, 100&#215;100 \ud06c\uae30\uc758 \uc774\ubbf8\uc9c0\uc5d0 \uc2dc\uc791\uc810(30,50)\uacfc \ub05d\uc810(70,50)\uc73c\ub85c \uc5f0\uacb0\ub41c \uc120\uc5d0 \ub300\ud574 Hough Transfrom \uc54c\uace0\ub9ac\uc998\uc744 \uace0\ub824\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uc120\uc744 \uad6c\uc131\ud558\ub294 \ubaa8\ub4e0 \ud53d\uc140\ub4e4\uc744 \uace0\ub824\ud558\ub294 \uac83\uc774 \ub9de\uaca0\uc73c\ub098, \uc5ec\uae30\uc11c\ub294 \ud3b8\uc758\uc0c1 \uc2dc\uc791\uc810\uacfc \ub05d\uc810\ub9cc\uc744 \uace0\ub824\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. r = \ud835\udc65cos\ud835\udf03 + \ud835\udc66sin\ud835\udf03 \uc2dd\uc5d0 \ub300\ud574\uc11c (\ud835\udc65, \ud835\udc66)\uac00 (30, 50)\uc778 \ud835\udf03\ub294 \ubaa8\ub4e0 0-180\uae4c\uc9c0\uc5d0 \ub300\ud574 r\uc744 \uad6c\ud558\uace0 \uad6c\ud574\uc9c4 (r, \ud835\udf03)\uc5d0 \ud574\ub2f9\ud558\ub294 \ubc30\uc5f4 \uc694\uc18c\uc758 \uac12\uc744 1 \uc99d\uac00\uc2dc\ud0b5\ub2c8\ub2e4. \ubb3c\ub860 \ucd08\uae30 \ubc30\uc5f4\uc758 \ubaa8\ub4e0 \ud56d\ubaa9\uc740 0\uc73c\ub85c \ucd08\uae30\ud654\ub418\uc5b4 \uc788\uaca0\uc9c0\uc694. \uadf8 \ub2e4\uc74c\uc5d0 \ub2e4\uc2dc (\ud835\udc65, \ud835\udc66)\uac00 (70, 50)\uc778 \ud835\udf03\ub294 \ubaa8\ub4e0 0-180\uae4c\uc9c0\uc5d0 \ub300\ud574 r\uc744 \uad6c\ud558\uace0 \uad6c\ud574\uc9c4 (r, \ud835\udf03)\uc5d0 \ud574\ub2f9\ud558\ub294 \ubc30\uc5f4 \uc694\uc18c\uc758 \uac12\uc744 1 \uc99d\uac00\uc2dc\ud0b5\ub2c8\ub2e4. \uacb0\uacfc\uc801\uc73c\ub85c \ubc30\uc5f4\uc758 \ud56d\ubaa9 \uc911 \uac00\uc7a5 \ud070 \uac12\uc744 \ucc3e\uc544 \ubcf4\uba74 r=50, \ud835\udf03=90\uc774 \ub418\uace0 \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc120\uc5d0 \ub300\ud55c \ub9e4\uac1c\ubcc0\uc218 \uc815\uc758\uc758 \uac12\uacfc \uc77c\uce58\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \uc774 Hough Transform\uc744 OpenCV\uc5d0\uc11c \uad6c\ud604\ud55c \uc608\uc81c\ub97c \uc0b4\ud3b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre>\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('.\/data\/dave.jpg')\r\ngray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\r\nedges = cv2.Canny(gray,50,150,apertureSize = 3)\r\n\r\nlines = cv2.HoughLines(edges,1,np.pi\/180,150)\r\nfor line in lines:\r\n    rho,theta = line[0]\r\n    a = np.cos(theta)\r\n    b = np.sin(theta)\r\n    x0 = a*rho\r\n    y0 = b*rho\r\n    x1 = int(x0 + 1000*(-b))\r\n    y1 = int(y0 + 1000*(a))\r\n    x2 = int(x0 - 1000*(-b))\r\n    y2 = int(y0 - 1000*(a))\r\n\r\n    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),1)\r\n\r\ncv2.imshow('edges', edges)\r\ncv2.imshow('result', img)\r\ncv2.waitKey()\r\ncv2.destroyAllWindows()\r\n<\/pre>\n<p>\uc2e4\uc81c \uce7c\ub7ec \uc601\uc0c1\uc5d0 \ub300\ud574 \ubc14\ub85c Hough Transform\ub97c \uc801\uc6a9\ud558\uae30\uc5d0\ub294 \ub108\ubb34 \ubcf5\uc7a1\ud574\uc11c \uba3c\uc800 Gray \uc601\uc0c1\uc73c\ub85c \ubcc0\ud658\ud558\uace0 \uacbd\uacc4\uc120\uc744 \ucd94\ucd9c\ud55c \ub4a4\uc5d0 Hough Transform\ub97c \uc801\uc6a9\ud569\ub2c8\ub2e4. Hough Transform\ub97c \uc801\uc6a9\ud558\ub294 \ucf54\ub4dc\uac00 8\ubc88\uc778\ub370, cv2.HoughLines \ud568\uc218\uc758 \uc778\uc790\ub294 \uc0b4\ud3b4\ubcf4\uba74, \uccab\ubc88\uc9f8\ub294 \uc785\ub825 \uc774\ubbf8\uc9c0, \ub450\ubc88\uc9f8\ub294 r\uc758 \uc815\ubc00\ub3c4(1\ub85c \uc9c0\uc815\ud588\uc73c\uba70 1\ud53d\uc140 \ub2e8\uc704), \uc138\ubc88\uc9f8\ub294 \ud835\udf03\uc758 \uc815\ubc00\ub3c4(1\ub3c4\ub85c \uc9c0\uc815\ud588\uc73c\uba70 \ub77c\uc774\uc5b8 \ub2e8\uc704), \ub124\ubc88\uc9f8\ub294 \uc55e\uc11c \uc5b8\uae09\ud55c (r, \ud835\udf03)\uc5d0 \ud574\ub2f9\ud558\ub294 \ubc30\uc5f4 \uc694\uc18c\uc5d0 \uc800\uc7a5\ub41c \uac12 \uc911 \ub124\ubc88\uc9f8 \uc778\uc790\ub85c \uc9c0\uc815\ub41c \uac12 \uc774\uc0c1\uc778 \uac83\ub9cc\uc744 \ucd94\ucd9c\ud558\uae30 \uc704\ud55c \uc870\uac74\uac12\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc2e4\ud589\ud574 \ubcf4\uba74 \uacb0\uacfc\ub294 \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\/04\/hough_line_transform_1.png\" alt=\"\" width=\"943\" height=\"510\" class=\"aligncenter size-full wp-image-6720\" \/><\/p>\n<p>\uc55e\uc11c \uc0b4\ud3b4\ubcf8 Hough Transform \uc54c\uace0\ub9ac\uc998\uc740 \uc120\uc744 \uad6c\uc131\ud558\ub294 \ubaa8\ub4e0 \ud53d\uc140\uc5d0 \ub300\ud574 2\ucc28\uc6d0 \ubc30\uc5f4 \ud56d\ubaa9\uc5d0 \ub300\ud55c \uac12 \ucc98\ub9ac\ub97c \uc218\ud589\ud558\uace0 \uc788\uc5b4 \ud37c\ud3ec\uba3c\uc2a4\uac00 \uc81c\ubc95 \ub5a8\uc5b4\uc9d1\ub2c8\ub2e4. \uc774\uc5d0 \ub300\ud574\uc11c \ubaa8\ub4e0 \ud53d\uc140 \uac12\uc744 \ucc98\ub9ac\ud558\uc9c0 \uc54a\uace0 \uc801\ub2f9\ud788 \ud544\uc694\ud55c \ub9cc\ud07c \ud655\ub960\uc801\uc73c\ub85c \ud53d\uc140\ub4e4\uc744 \uc120\ud0dd\ud574 \uc5f0\uc0b0\ud558\ub294 \ubc29\ubc95(Probabilistic Hough Transform)\uc774 \uc788\ub294\ub370, \uadf8 \uc608\uac00 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre>\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('.\/data\/dave.jpg')\r\ngray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\r\nedges = cv2.Canny(gray,50,150,apertureSize = 3)\r\nminLineLength = 50\r\nmaxLineGap = 10\r\n\r\nlines = cv2.HoughLinesP(edges,1,np.pi\/180,100,minLineLength,maxLineGap)\r\n\r\nfor line in lines:\r\n    x1,y1,x2,y2 = line[0]\r\n    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)\r\n\r\ncv2.imshow('edges', edges)\r\ncv2.imshow('result', img)\r\ncv2.waitKey()\r\ncv2.destroyAllWindows()\r\n<\/pre>\n<p>10\ubc88 \ucf54\ub4dc\uc758 cv2.HoughLinesP \ud568\uc218\uac00 \ubc14\ub85c Probabilistic Hough Transform \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\ub294\ub370, \uae30\uc874\uc758 cv2.HoughLines \ud568\uc218\uc640 4\uac1c\uc758 \uc778\uc790\ub294 \ub3d9\uc77c\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc73c\ub85c 2\uac1c \uc778\uc790\uac00 \uc9c0\uc815\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8\ub294 minLineLength\ub85c \uac80\ucd9c\ub41c \uc120\uc758 \uae38\uc774\uac00 \uc774 \uc778\uc790\uac12\ubcf4\ub2e4 \uc791\uc73c\uba74 \uc120\uc774 \uc544\ub2c8\ub77c\ub294 \uc870\uac74\uac12\uc774\uace0, \ub450\ubc88\uc9f8\ub294 maxLineGap\ub85c 2\uac1c\uc758 \uc120 \uc0ac\uc774\uc758 \uac70\ub9ac\uac00 \uc774 \uac12\ubcf4\ub2e4 \uc791\ub2e4\uba74 \ud558\ub098\uc758 \uc120\uc73c\ub85c \uc778\uc2dd\ud558\ub77c\ub294 \uc870\uac74\uac12\uc785\ub2c8\ub2e4. \uacb0\uacfc\ub294 \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\/04\/hough_line_transform_2.png\" alt=\"\" width=\"944\" height=\"509\" class=\"aligncenter size-full wp-image-6723\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774 \uae00\uc758 \uc6d0\ubb38\uc740 https:\/\/opencv-python-tutroals.readthedocs.io\/en\/latest\/py_tutorials\/py_imgproc\/py_houghlines\/py_houghlines.html#hough-lines \uc785\ub2c8\ub2e4. \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc120 \ubaa8\uc591\uc758 \ub3c4\ud615\uc744 \uac80\ucd9c\ud558\ub294 Hough Transform\uc5d0 \ub300\ud574 \uc0b4\ud3b4\ubcf4\uace0, \uc774 \uc54c\uace0\ub9ac\uc998\uc744 \uad6c\ud604\ud55c OpenCV\uc758 \ud568\uc218\ub97c \uc0b4\ud3b4\ubd05\ub2c8\ub2e4. \uba3c\uc800 Hough Transfom\uc740 \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc218\ud559\uc801\uc73c\ub85c \ud45c\ud604 \uac00\ub2a5\ud55c \ub3c4\ud615\uc744 \uac80\uc0c9\ud558\ub294 \uae30\uc220\uc785\ub2c8\ub2e4. \uadf8 \ub3c4\ud615 \uc911 \uc120\ud615\uc5d0 \ub300\ud574 \uac80\uc0c9\ud574 \ubcfc\ud150\ub370\uc694. \uc120\uc5d0 \ub300\ud55c \ubc29\uc815\uc2dd\uc740 \uc6b0\ub9ac\uac00 \ud754\ud788 \uc54c\uace0 \uc788\ub294 \uae30\uc6b8\uae30(m)\uc640 y\uc808\ud3b8(c)\ub85c \ud45c\ud604\ub418\ub294 \ud835\udc66=m\ud835\udc65+c\ub3c4 \uc788\uc9c0\ub9cc \uc0bc\uac01\ud568\uc218\uc5d0 \uc758\ud55c \ub9e4\uac1c\ubcc0\uc218 \ubc29\uc815\uc2dd\uc73c\ub85c\uc368\ub294 r = &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=6714\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Python\uacfc OpenCV \u2013 26 : \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc120\ud615 \ub3c4\ud615 \uac80\ucd9c(Hough Line  Transform)&#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-6714","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\/6714","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=6714"}],"version-history":[{"count":8,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6714\/revisions"}],"predecessor-version":[{"id":6935,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/6714\/revisions\/6935"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6714"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}