{"id":45831,"date":"2021-12-08T22:54:37","date_gmt":"2021-12-08T13:54:37","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=45831"},"modified":"2021-12-08T22:54:39","modified_gmt":"2021-12-08T13:54:39","slug":"%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c%eb%a1%9c-%eb%b0%b0%ec%9a%b0%eb%8a%94-opencv-%ec%a3%bc%ec%96%b4%ec%a7%84-%ec%a0%90%ec%97%90-%ec%a0%81%ed%95%a9%ed%95%9c-%ec%a7%81%ec%84%a0-%ea%b5%ac","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=45831","title":{"rendered":"[\uc548\ub4dc\ub85c\uc774\ub4dc\ub85c \ubc30\uc6b0\ub294 OpenCV] \uc8fc\uc5b4\uc9c4 \uc810\uc5d0 \uc801\ud569\ud55c \uc9c1\uc120 \uad6c\ud558\uae30 (fitLine)"},"content":{"rendered":"\n<p>Prerequisite : <a href=\"https:\/\/www.charlezz.com\/?p=45795\">\uc724\uacfd\uc120 \uae38\uc774 \uad6c\ud558\uae30<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">fitLine \ud568\uc218<\/h2>\n\n\n\n<p>OpenCV\uc5d0\uc11c\ub294 fitLine\uc774\ub77c\ub294 \ud568\uc218\ub97c \uc81c\uacf5\ud558\ub294\ub370, \uc774\ub294\u00a0<strong>\uc8fc\uc5b4\uc9c4 \uc810\ub4e4\uc744 \uc801\ub2f9\ud788 \uac10\uc2f8\ub294 \uc9c1\uc120<\/strong>\u00a0\uc815\ubcf4\ub97c \uad6c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>fitLine \ud568\uc218\ub294 \u2211i\u03c1(ri)\ub97c \ucd5c\uc18c\ud654\ud558\uc5ec 2D \ub610\ub294 3D \uc810\ub4e4\uc758 \uc9d1\ud569\uc5d0 \uc120\uc744 \ud53c\ud305\ud558\ub294\ub370, \uc5ec\uae30\uc11c ri\ub294 i\ubc88\uc9f8 \uc810\uacfc \uc120 \uc0ac\uc774\uc758 \uac70\ub9ac\uc774\uace0, \u03c1(r)\uc740 \uac70\ub9ac\ub97c \uad6c\ud558\ub294 \ud568\uc218\ub2e4.<\/p>\n\n\n\n<p>\uac70\ub9ac\ub97c \uad6c\ud558\ub294 \ud568\uc218\uc758 \uc885\ub958\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul><li>DIST_L2: \u03c1(r)=r2\/2, \uac00\uc7a5 \uac04\ub2e8\ud558\uace0 \ube60\ub978 \ucd5c\uc18c\uc81c\uacf1\ubc95<\/li><li>DIST_L1: distance = |x1-x2| + |y1-y2|<\/li><li>DIST_C: distance = max(|x1-x2|,|y1-y2|)<\/li><li>DIST_L12: L1-L2 metric: distance = 2(sqrt(1+x*x\/2) &#8211; 1))<\/li><li>DIST_FAIR: distance = c^2(|x|\/c-log(1+|x|\/c)), c = 1.3998<\/li><li>DIST_WELSCH: distance = c^2\/2(1-exp(-(x\/c)^2)), c = 2.9846<\/li><li>DIST_HUBER: distance = |x|&lt;c ? x^2\/2 : c(|x|-c\/2), c=1.345<\/li><\/ul>\n\n\n\n<p>fitLine \ud568\uc218\uc758 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub300\ud574\uc11c \uc0b4\ud3b4\ubcf4\uc790<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Imgproc.fitLine(contour, line, distType, param, reps, aeps)<\/pre>\n\n\n\n<p>contour: \uc724\uacfd\uc120 \uc815\ubcf4, 2D \ub610\ub294 3D \uc88c\ud45c\uc758 \ubca1\ud130\uac12<br>line: \ud568\uc218 \ud638\ucd9c \ud6c4 \ucc38\uc870 \uac00\ub2a5\ud55c Mat \ud0c0\uc785\uc758 \uc120\ubd84 \uc815\ubcf4<br>distType: \uac70\ub9ac\ub97c \uad6c\ud558\ub294 \ud568\uc218 \ud0c0\uc785<br>param: \uc77c\ubd80 distType\uc5d0 \ub300\ud55c \uc218\uce58 \ub9e4\uac1c\ubcc0\uc218( C ), 0\uc774\uba74 \ucd5c\uc801\uc758 \uac12\uc774 \uc120\ud0dd\ub41c\ub2e4.<br>reps: \ubc18\uacbd\uc5d0 \ub300\ud55c \ucda9\ubd84\ud55c \uc815\ud655\ub3c4(\uc88c\ud45c \uc6d0\uc810\uacfc \uc120 \uc0ac\uc774\uc758 \uac70\ub9ac)<br>aeps: \uac01\ub3c4\uc5d0 \ub300\ud55c \ucda9\ubd84\ud55c \uc815\ud655\ub3c4. reps\uc640 aeps\uc5d0 \ub300\ud574 \uc88b\uc740 \uae30\ubcf8\uac12\uc740 0.01\uc774\ub2e4.<\/p>\n\n\n\n<p>fitLine \ud568\uc218\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0\ub0b4 \uc724\uacfd\uc120\uc5d0 \uc801\ud569\ud55c \uc9c1\uc120\uc744 \uad6c\ud558\ub294 \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1024x768.png\" alt=\"\" class=\"wp-image-45832\" width=\"616\" height=\"462\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1024x768.png 1024w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-300x225.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-768x576.png 768w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1536x1152.png 1536w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot.png 1592w\" sizes=\"(max-width: 616px) 100vw, 616px\" \/><figcaption>\uc6d0\ubcf8\uc774\ubbf8\uc9c0<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1638970699367-820x1024.png\" alt=\"\" class=\"wp-image-45833\" width=\"615\" height=\"768\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1638970699367-820x1024.png 820w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1638970699367-240x300.png 240w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1638970699367-768x959.png 768w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1638970699367-1230x1536.png 1230w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1638970699367-1640x2048.png 1640w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2021\/12\/www.charlezz.com-opencv-fitline-screenshot-1638970699367.png 1768w\" sizes=\"(max-width: 615px) 100vw, 615px\" \/><\/figure>\n\n\n\n<p>\uc608\uc81c\ucf54\ub4dc:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">val contours = ArrayList&lt;MatOfPoint>()\nval hierarchy = Mat()\n\/\/ \uc724\uacfd\uc120 \uc88c\ud45c \uad6c\ud558\uae30\nImgproc.findContours(\n    binary,\n    contours,\n    hierarchy,\n    Imgproc.<em>RETR_CCOMP<\/em>,\n    Imgproc.<em>CHAIN_APPROX_SIMPLE\n<\/em>)\n\nfor (i in 0 <em>until <\/em>contours.size) {\n    val contour2f = MatOfPoint2f(*contours[i].toArray())\n    val line = Mat()\n    \/\/ \uc8fc\uc5b4\uc9c4 \uc810\ub4e4\uc5d0 \ub300\ud574 \uc801\ud569\ud55c \uc120\ubd84 \uc815\ubcf4 \uad6c\ud558\uae30\n    Imgproc.fitLine(contour2f, line, Imgproc.<em>DIST_L2<\/em>, 0.0, 0.01, 0.01)\n    \/\/ \ub2e8\uc704 \ubca1\ud130\n    val vx = line.get(0, 0)[0]\n    val vy = line.get(1, 0)[0]\n    \/\/ \uc9c1\uc120\uc704\uc758 \uc810\n    val x = line.get(2, 0)[0]\n    val y = line.get(3, 0)[0]\n    \/\/ \uc774\ubbf8\uc9c0 \uacbd\uacc4\ubd80\uadfc\uae4c\uc9c0 \uc5f0\uc7a5\ud55c \ud6c4 \ube68\uac04\uc0c9\uc73c\ub85c \uadf8\ub9bc \n    val lefty = (-x * vy \/ vx + y).<em>roundToInt<\/em>().toDouble()\n    val righty = ((src.cols() - x) * vy \/ vx + y).<em>roundToInt<\/em>().toDouble()\n    val point1 = Point((src.cols() - 1).toDouble(), righty)\n    val point2 = Point(0.0, lefty)\n    Imgproc.line(src, point1, point2, <em>RED<\/em>)\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Prerequisite : \uc724\uacfd\uc120 \uae38\uc774 \uad6c\ud558\uae30 fitLine \ud568\uc218 OpenCV\uc5d0\uc11c\ub294 fitLine\uc774\ub77c\ub294 \ud568\uc218\ub97c \uc81c\uacf5\ud558\ub294\ub370, \uc774\ub294\u00a0\uc8fc\uc5b4\uc9c4 \uc810\ub4e4\uc744 \uc801\ub2f9\ud788 \uac10\uc2f8\ub294 \uc9c1\uc120\u00a0\uc815\ubcf4\ub97c \uad6c\ud560 \uc218 \uc788\ub2e4. fitLine \ud568\uc218\ub294 \u2211i\u03c1(ri)\ub97c \ucd5c\uc18c\ud654\ud558\uc5ec 2D \ub610\ub294 3D \uc810\ub4e4\uc758 \uc9d1\ud569\uc5d0 \uc120\uc744 \ud53c\ud305\ud558\ub294\ub370, \uc5ec\uae30\uc11c ri\ub294 i\ubc88\uc9f8 \uc810\uacfc \uc120 \uc0ac\uc774\uc758 \uac70\ub9ac\uc774\uace0, \u03c1(r)\uc740 \uac70\ub9ac\ub97c \uad6c\ud558\ub294 \ud568\uc218\ub2e4. \uac70\ub9ac\ub97c \uad6c\ud558\ub294 \ud568\uc218\uc758 \uc885\ub958\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. DIST_L2: \u03c1(r)=r2\/2, \uac00\uc7a5 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[27],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/45831"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=45831"}],"version-history":[{"count":1,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/45831\/revisions"}],"predecessor-version":[{"id":45834,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/45831\/revisions\/45834"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=45831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=45831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=45831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}