From b2d3b269440302a895c5ff769bc7b656e74ce5c8 Mon Sep 17 00:00:00 2001 From: Frank Schumacher Date: Thu, 9 Jun 2011 22:24:03 +0200 Subject: [PATCH] Example for contour retrieval modes --- .../contours/bitmap-contours-with-labels.png | Bin 275833 -> 3467 bytes examples/contours/bitmap-contours.png | Bin 254 -> 1738 bytes examples/contours/contour_retrieval_modes.rb | 139 ++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100755 examples/contours/contour_retrieval_modes.rb diff --git a/examples/contours/bitmap-contours-with-labels.png b/examples/contours/bitmap-contours-with-labels.png index 256ced21993600c71f0f8fa31308a1118b5005a4..10ab52d9aae98dd8c14d15a3bcc8012d68b3c7af 100644 GIT binary patch literal 3467 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 Vy(v2l+?H^A+&})PY}b+V{{~)s?RNkG literal 275833 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 F{|6ob#R32T diff --git a/examples/contours/bitmap-contours.png b/examples/contours/bitmap-contours.png index 15b5a9999f57405b8414b9fc37777f97379a3f09..4890a4e55ee34fe0176ae3a7ed50c135ccaa67d1 100644 GIT binary patch literal 1738 zcmeAS@N?(olHy`uVBq!ia0y~yV7dUr5gg1wk(w+;X&@z8;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$Hzl2B?TFz$e5NNdN!;f9cKncYy*?o-U3d6}R5p-6(iKfrrKM zV*TYU4qqC!TxXbf{n@%nDxO55$5EG#Hi%tt;LhL#LPp*#4Qx>k-ayEmv4GX&0#g(S zIxy=lXcW631cXdd8H~9>jJhBQ6N89?g%E-ug+SA$0U_A<1*}_GfDmLn&@@#b1Q`!h zMA#@K^FdZhURZh!Vh_}jQ0Gy^gE)xeFEVz5t0HOx$+}*Pi8_LWNGa&r(Hm{BG)?FTEs8R3O zAle$uU}=?H4qD)4SjR5^XFK*Z_259nfX5 zz%T;2^{qkzFdF{?MRx;3U<=R(QW?J)-yWa6@(yWX0@97@LE^#$Xgf$7#M5}! sTG>jt$Ryn;BCCQ)Dwz(^4U7yE4Ntra{pU3cSl=*sy85}Sb4q9e0I0%35&!@I literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^`+zu)5lAp>G@K$2q&N#aB8wRqxP?KOkzv*x380`t zvPY0F14ET614BbI1H;e%K>8&EL#Y7+!>a@a2CEqi4C48d;*Yuk)wX!LIEGZ*x-;b< z-vI#um-OB5-pYS`{a4w};Y$-YU+$E%=Q5L&-d1p55Ko@o+%+?U x)m(oE_bcTdx2B diff --git a/examples/contours/contour_retrieval_modes.rb b/examples/contours/contour_retrieval_modes.rb new file mode 100755 index 0000000..929b42c --- /dev/null +++ b/examples/contours/contour_retrieval_modes.rb @@ -0,0 +1,139 @@ +#!/usr/bin/env ruby +# +# This file shows the different retrieval modes for contour detection +# +require "opencv" + +# Load image +# The structure of the image is "explained" in bitmap-contours-with-labels.png +cvmat = OpenCV::CvMat.load("bitmap-contours.png") + +# "find_contours" does only operate on bitmap images (black/white) +mat = OpenCV::CvMat.new(cvmat.rows, cvmat.cols, :cv8u, 1) +(cvmat.rows * cvmat.cols).times do |i| + mat[i] = (cvmat[i][0] <= 128) ? OpenCV::CvScalar.new(0) : OpenCV::CvScalar.new(255) +end + +# find_contours takes two parameters: +# 1. Retrieval mode (:mode, defines the structure of the contour sequence returned) +# - CV_RETR_LIST (default) +# - CV_RETR_EXTERNAL +# - CV_RETR_CCOMP +# - CV_RETR_TREE +# 2. Retrieval Method (:method, how the contours are approximated) +# - CV_CHAIN_CODE +# - CV_CHAIN_APPROX_NONE +# - CV_CHAIN_APPROX_SIMPLE (default) +# - CV_CHAIN_APPROX_TC89_L1 +# - CV_CHAIN_APPROX_T89_KCOS +# - CV_LINK_RUNS + +# +# The default: CV_RETR_LIST and CV_CHAIN_APPROX_SIMPLE +# This produces a flat list of contours that can be traversed with .h_next and .h_prev +# +puts "Detecting using CV_RETR_LIST and CV_CHAIN_APPROX_SIMPLE" +contour = mat.find_contours(:mode => OpenCV::CV_RETR_LIST, :method => OpenCV::CV_CHAIN_APPROX_SIMPLE) +cindex=1 + +while contour + puts "Contour ##{cindex} is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" + contour = contour.h_next + cindex+=1 +end + +# +# CV_RETR_EXTERNAL retrieves only the outer most non "hole" contour +# +puts '-'*80 +puts "Detecting using CV_RETR_EXTERNAL and CV_CHAIN_APPROX_SIMPLE" +contour = mat.find_contours(:mode => OpenCV::CV_RETR_EXTERNAL, :method => OpenCV::CV_CHAIN_APPROX_SIMPLE) +cindex=1 + +while contour + puts "Contour ##{cindex} is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" + contour = contour.h_next + cindex+=1 +end + +# +# CV_RETR_CCOMP organizes the contours in a two level deep stack +# The first level holds the contours +# The second level contains the holes of the contours in level 1 +# +# C00001 <-> C00000 <-> C000 <-> C0 +# | | +# V V +# H0000 H00 +# +puts '-'*80 +puts "Detecting using CV_RETR_CCOMP and CV_CHAIN_APPROX_SIMPLE" +contour = mat.find_contours(:mode => OpenCV::CV_RETR_CCOMP, :method => OpenCV::CV_CHAIN_APPROX_SIMPLE) + +# C00001 +puts "Contour #1 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour = contour.h_next + +# C00000 +puts "Contour #2 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour = contour.h_next + +# C000 +puts "Contour #3 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour_down = contour.v_next + +# H0000 +puts "Contour #4 is #{contour_down.contour_area} px^2 (width: #{contour_down.bounding_rect.width}, height: #{contour_down.bounding_rect.height}, type: #{(contour_down.hole?)?"hole":"contour"})" +contour = contour.h_next + +# C0 +puts "Contour #5 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour_down = contour.v_next + +# H00 +puts "Contour #6 is #{contour_down.contour_area} px^2 (width: #{contour_down.bounding_rect.width}, height: #{contour_down.bounding_rect.height}, type: #{(contour_down.hole?)?"hole":"contour"})" + +# +# CV_RETR_TREE manages the contours in a tree structure +# This reconstructs the complete hierarchy of contours and holes that the image displayed +# +# C0 +# | +# V +# H00 +# | +# V +# C000 +# | +# V +# H0000-------+ +# | | +# V V +# C00000 C00001 +# +puts '-'*80 +puts "Detecting using CV_RETR_TREE and CV_CHAIN_APPROX_SIMPLE" +contour = mat.find_contours(:mode => OpenCV::CV_RETR_TREE, :method => OpenCV::CV_CHAIN_APPROX_SIMPLE) + +# C0 +puts "Contour #1 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour = contour.v_next + +# H00 +puts "Contour #2 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour = contour.v_next + +# C000 +puts "Contour #3 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour = contour.v_next + +# H0000 +puts "Contour #4 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour = contour.v_next + +# C00000 +puts "Contour #5 is #{contour.contour_area} px^2 (width: #{contour.bounding_rect.width}, height: #{contour.bounding_rect.height}, type: #{(contour.hole?)?"hole":"contour"})" +contour_right = contour.h_next + +# C00001 +puts "Contour #6 is #{contour_right.contour_area} px^2 (width: #{contour_right.bounding_rect.width}, height: #{contour_right.bounding_rect.height}, type: #{(contour_right.hole?)?"hole":"contour"})"