#N canvas 408 133 794 766 10; #X declare -lib pix_opencv; #X obj 472 35 cnv 15 300 500 empty empty empty 20 12 0 14 -228992 -66577 0; #X obj 11 56 cnv 15 450 200 empty empty empty 20 12 0 14 -233017 -66577 0; #X obj 11 307 cnv 15 450 380 empty empty empty 20 12 0 14 -233017 -66577 0; #X text 13 315 Inlets:; #X obj 11 267 cnv 15 450 30 empty empty empty 20 12 0 14 -195568 -66577 0; #X text 20 266 Arguments:; #X text 12 436 Outlets:; #X text 478 20 Example:; #X text 58 21 Class: pix_opencv; #X text 11 60 Description: finds contours; #X text 66 276 none; #X text 30 349 Inlet 1: message: epsilon [float]; #X obj 353 315 cnv 15 100 60 empty empty empty 20 12 0 14 -195568 -66577 0; #N canvas 1 122 450 300 gemwin 0; #X obj 132 156 gemwin; #X obj 67 89 outlet; #X obj 67 10 inlet; #X obj 67 41 route create; #X msg 67 70 set destroy; #X msg 142 68 set create; #X msg 198 112 destroy; #X msg 132 132 reset \, dimen 640 480 \, create \, 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 3 0 7 0; #X connect 3 1 5 0; #X connect 3 1 6 0; #X connect 4 0 1 0; #X connect 5 0 1 0; #X connect 6 0 0 0; #X connect 7 0 0 0; #X restore 358 354 pd gemwin; #X msg 358 335 destroy; #X text 354 314 Create window:; #X text 30 329 Inlet 1: binarized image; #X text 30 589 <2> ; #X text 25 447 Outlet 1: gemlist output; #X text 37 5 Synopsis: [pix_opencv_contours]; #X text 21 578 contour (for each of them); #X text 37 75 [pix_opencv_contours] finds contours in incomming image \, simplifies it according to the epsilon value and outputs contours with area greater than a threshold.; #X text 25 457 Outlet 2: contour \, convexhull and convexity defect output; #X text 37 126 contrary to [pix_opencv_contour_convexhull] \, [pix_opencv_contours] outputs all contours found not only the biggest.; #X text 37 175 it can also output rotated bounding rectangle \, convexhull and cenvexity defects; #X text 37 215 you can choose the hierarchy level of output contour ; #X text 37 235 so this external replaces all old pix_opencv_contours_* ; #X text 30 619 <2> ; #X text 21 606 convexhull (for each contour); #X text 20 637 convexixitydefects (for each contour); #X text 30 649 <7> depth; #X text 26 699 by antoine villeret - 2012; #X text 16 719 bug \, feedback \, comment... on the pd-list; #X obj 476 193 cnv 15 280 80 empty empty empty 20 12 0 14 -4034 -66577 0; #X obj 541 151 pix_texture; #X obj 487 74 t b a a; #X obj 487 55 gemhead 1; #X msg 542 214 epsilon \$1; #X obj 541 171 rectangle 5.333 4; #X obj 514 116 t a a; #X msg 617 214 area \$1; #X obj 487 240 pix_opencv_contours; #N canvas 571 659 1126 291 options 0; #X obj 57 147 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X msg 57 167 contours \$1; #X obj 57 251 outlet; #X obj 147 147 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 247 147 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X msg 147 167 convexhulls \$1; #X msg 247 167 convexitydefects \$1; #X text 25 37 set hierarchy level (which contour to send out); #X obj 24 83 nbx 5 14 -2 1e+37 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 -1 256; #X msg 24 100 hierarchy_level \$1; #X text 71 125 send out different kind of infos (all on by default) :; #X text 25 47 -1 for all contours (default); #X msg 559 168 settab drawX drawY drawZ; #X obj 558 200 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X msg 558 229 taboutput \$1; #X text 550 71 first set some tables (they are dynamically resized) ; #X text 550 151 tell it what tables to use; #X text 569 256 see [pd draw_contour_gemvertexbuffer] for an example of drawing contours; #N canvas 682 180 596 318 draw_contour_gemvertexbuffer 0; #X obj 175 193 loadbang; #X obj 135 85 translateXYZ -0.5 -0.5 0; #X obj 135 62 scaleXYZ 10.6666 -8 1; #X obj 135 107 t a b; #X obj 135 11 gemhead 1000; #X msg 161 150 posX drawX \, posY drawY \, colorG drawZ \, colorA drawZ ; #X obj 135 265 gemvertexbuffer; #X obj 161 128 inlet; #X obj 269 194 r point_number; #X msg 269 221 resize \$1; #X floatatom 342 226 5 0 0 0 - - -, f 5; #X obj 135 -12 r draw_contours; #X msg 175 214 draw lineloop; #X obj 135 35 alpha; #X connect 0 0 12 0; #X connect 1 0 3 0; #X connect 2 0 1 0; #X connect 3 0 6 0; #X connect 3 1 5 0; #X connect 4 0 13 0; #X connect 5 0 6 0; #X connect 7 0 5 0; #X connect 8 0 9 0; #X connect 8 0 10 0; #X connect 9 0 6 0; #X connect 11 0 4 0; #X connect 12 0 6 0; #X connect 13 0 2 0; #X restore 797 147 pd draw_contour_gemvertexbuffer; #X obj 797 126 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X text 813 127 draw with gemvertexbuffer; #X msg 383 167 cvblobOutput \$1; #X obj 383 148 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X text 25 57 -2 for only contours with no child (aka holes); #X text 543 5 to improve performance and avoid "stack overflow" (because contours could have a huge number of points) you can use table output instead of list output; #X text 582 200 enable/disable table output (automatically enable when you set tables); #X obj 373 188 s draw_cvblob; #X obj 47 187 s draw_contours; #X obj 564 89 table drawX 10000; #X obj 564 109 table drawY 10000; #X obj 564 129 table drawZ 10000; #X connect 0 0 1 0; #X connect 0 0 27 0; #X connect 1 0 2 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 2 0; #X connect 6 0 2 0; #X connect 8 0 9 0; #X connect 9 0 2 0; #X connect 12 0 2 0; #X connect 13 0 14 0; #X connect 14 0 2 0; #X connect 19 0 18 0; #X connect 21 0 2 0; #X connect 22 0 21 0; #X connect 22 0 26 0; #X restore 674 213 pd options; #X text 489 347 color legend :; #X text 522 364 yellow = bounding box; #X text 528 374 green = contour; #X text 534 385 blue = convexhull; #X text 534 397 pink = convexhull edge with defects; #X text 540 409 red = farthest point from convexhull; #N canvas 927 173 981 904 draw_contours 0; #X obj 43 253 list split 2; #X obj 111 820 GEMglVertex2d; #X obj 13 661 list append; #X obj 42 635 t b a; #X obj 42 614 list split 2; #X obj 142 746 unpack; #X obj 111 679 t b a; #X obj 102 500 color 1 0 0 1; #X obj 206 773 * -8; #X obj 206 793 + 4; #X obj 102 528 GEMglLineWidth 2; #X obj 142 773 * 10.6666; #X obj 142 793 - 5.33333; #X obj 111 701 gemlist; #X obj 23 414 gemhead; #X obj 23 349 loadbang; #X msg 23 374 0; #X obj 26 62 inlet CONTOUR; #X obj 26 106 route convexhull contour convexitydefects; #X msg 53 171 0 0 1 1; #X msg 134 192 0 1 0 1; #X obj 249 155 list split 2; #X obj 271 250 list append; #X obj 300 230 t b a; #X obj 188 131 t a b; #X obj 300 209 list split 7; #X obj 327 270 list split 4; #X obj 107 151 t a b; #X obj 26 150 t a b; #X obj 215 239 t a; #X obj 486 531 gemhead; #X obj 486 605 scaleXYZ 10.6666 -8 0; #X obj 467 429 t b b a; #X obj 486 565 color 1 0 0 1; #X obj 486 585 translateXYZ -5.3333 4 0; #X obj 486 705 translateXYZ 10.6666 -8 0; #X obj 486 786 circle 0.01; #X msg 499 760 draw line; #X obj 499 736 loadbang; #X obj 693 605 t a; #X msg 535 681 \$1; #X msg 584 681 \$2; #X obj 425 473 loadbang; #X msg 425 495 0; #X msg 215 188 1 0 1 1; #X obj 23 446 t a b a; #X obj 42 485 list; #X obj 77 369 t b a; #X obj 23 567 GEMglEnd; #X obj 102 552 GEMglBegin GL_LINE_LOOP; #X connect 0 1 47 0; #X connect 2 0 4 0; #X connect 3 0 2 0; #X connect 3 1 6 0; #X connect 4 0 3 0; #X connect 4 1 2 1; #X connect 5 0 11 0; #X connect 5 1 8 0; #X connect 6 0 13 0; #X connect 6 1 5 0; #X connect 7 0 10 0; #X connect 8 0 9 0; #X connect 9 0 1 2; #X connect 10 0 49 0; #X connect 11 0 12 0; #X connect 12 0 1 1; #X connect 13 0 1 0; #X connect 14 0 45 0; #X connect 15 0 16 0; #X connect 16 0 14 0; #X connect 17 0 18 0; #X connect 18 0 28 0; #X connect 18 1 27 0; #X connect 18 2 24 0; #X connect 19 0 29 0; #X connect 20 0 29 0; #X connect 21 1 25 0; #X connect 22 0 25 0; #X connect 23 0 22 0; #X connect 23 1 26 0; #X connect 24 0 21 0; #X connect 24 1 44 0; #X connect 25 0 23 0; #X connect 25 1 22 1; #X connect 26 0 47 0; #X connect 26 1 32 0; #X connect 27 0 0 0; #X connect 27 1 20 0; #X connect 28 0 0 0; #X connect 28 1 19 0; #X connect 29 0 7 1; #X connect 30 0 33 0; #X connect 31 0 35 0; #X connect 32 1 30 0; #X connect 32 2 39 0; #X connect 33 0 34 0; #X connect 34 0 31 0; #X connect 35 0 36 0; #X connect 37 0 36 0; #X connect 38 0 37 0; #X connect 39 0 41 0; #X connect 39 0 40 0; #X connect 40 0 35 1; #X connect 41 0 35 2; #X connect 42 0 43 0; #X connect 43 0 30 0; #X connect 44 0 29 0; #X connect 45 0 48 0; #X connect 45 1 46 0; #X connect 45 2 7 0; #X connect 46 0 4 0; #X connect 47 0 14 0; #X connect 47 1 46 1; #X restore 542 323 pd draw_contours; #N canvas 154 308 1198 730 info 0; #X obj -67 115 cnv 15 250 40 empty empty empty 20 12 0 14 -4034 -66577 0; #X obj -68 292 cnv 15 350 20 empty empty empty 20 12 0 14 -4034 -66577 0; #X obj 14 332 cnv 15 300 20 empty empty empty 20 12 0 14 -4034 -66577 0; #X obj 282 -59 cnv 15 100 40 empty empty empty 20 12 0 14 -4034 -66577 0; #X obj 51 497 cnv 15 330 50 empty empty empty 20 12 0 14 -4034 -66577 0; #X obj 225 16 inlet; #X obj 225 67 list split 2; #X obj 259 137 list split 20; #X text 309 70 cut matrix header; #X text 346 98 cut infos for the 1st contour; #X text -55 294 rotated rectangle center point (normalized); #X obj 211 224 list split 2; #X obj 245 314 unpack; #X floatatom 245 334 5 0 0 0 - - -, f 5; #X floatatom 278 334 5 0 0 0 - - -, f 5; #X obj 245 244 list split 2; #X text 29 334 rotated rectangle size (normalized); #X obj 313 384 list split 8; #X floatatom 304 -37 5 0 0 0 - - -, f 5; #X obj 304 -18 * 20; #X obj 304 4 + 2; #X text 284 -55 selected contour; #X obj 116 96 unpack; #X floatatom 116 117 5 0 0 0 - - -, f 5; #X floatatom 149 138 5 0 0 0 - - -, f 5; #X text -52 114 number of detected contours; #X text -61 137 numbers of values for each contour; #X obj 313 404 list prepend set; #X obj 313 424 list trim; #X msg 54 513 0.681584 0.808552 0.679688 0.789583 0.704353 0.785198 0.70625 0.804167; #X text 59 495 rotrect corners coordinates; #X obj 177 194 list split 1; #X obj -140 220 cnv 15 350 20 empty empty empty 20 12 0 14 -4034 -66577 0; #X floatatom 177 223 5 0 0 0 - - -, f 5; #X text 24 223 id in the detection order; #X obj 26 405 cnv 15 250 20 empty empty empty 20 12 0 14 -4034 -66577 0; #X text 30 408 rotated rectangle angle (degrees); #X obj 279 364 list split 2; #X obj 211 274 unpack; #X floatatom 211 294 5 0 0 0 - - -, f 5; #X floatatom 244 294 5 0 0 0 - - -, f 5; #X obj 240 387 unpack; #X floatatom 240 407 5 0 0 0 - - -, f 5; #X obj 26 435 cnv 15 250 20 empty empty empty 20 12 0 14 -4034 -66577 0; #X floatatom 240 437 5 0 0 0 - - -, f 5; #X text 30 438 area in % of image area; #X obj 199 570 cnv 15 250 80 empty empty empty 20 12 0 14 -4034 -66577 0; #X floatatom 347 595 5 0 0 0 - - -, f 5; #X floatatom 381 615 5 0 0 0 - - -, f 5; #X text 203 614 length of contour (in pixels); #X text 247 595 number of points; #X obj 347 575 unpack f f; #X obj 225 38 route cvblob count; #X obj 736 107 unpack f f; #X floatatom 736 129 5 0 0 0 - - -, f 5; #X floatatom 793 130 5 0 0 0 - - -, f 5; #X obj 794 250 s point_number; #X text 723 144 contours; #X text 797 145 points; #X text 690 160 total counts of contours and points; #X text 9 -35 activate cvblob output before trying this !; #X obj 794 197 + 3; #X connect 5 0 52 0; #X connect 6 0 22 0; #X connect 6 1 7 0; #X connect 7 0 31 0; #X connect 11 0 38 0; #X connect 11 1 15 0; #X connect 12 0 13 0; #X connect 12 1 14 0; #X connect 15 0 12 0; #X connect 15 1 37 0; #X connect 17 0 27 0; #X connect 17 1 51 0; #X connect 18 0 19 0; #X connect 19 0 20 0; #X connect 20 0 6 1; #X connect 22 0 23 0; #X connect 22 1 24 0; #X connect 22 1 19 1; #X connect 22 1 7 1; #X connect 27 0 28 0; #X connect 28 0 29 0; #X connect 31 0 33 0; #X connect 31 1 11 0; #X connect 37 0 41 0; #X connect 37 1 17 0; #X connect 38 0 39 0; #X connect 38 1 40 0; #X connect 41 0 42 0; #X connect 41 1 44 0; #X connect 51 0 47 0; #X connect 51 1 48 0; #X connect 52 0 6 0; #X connect 52 1 53 0; #X connect 53 0 54 0; #X connect 53 1 55 0; #X connect 55 0 61 0; #X connect 61 0 56 0; #X restore 672 295 pd info; #X text 29 498 20 0 0 0 0; #X text 30 369 Inlet 1: message: contours <0|1>; #X text 30 379 Inlet 1: message: convexhull <0|1>; #X text 30 389 Inlet 1: message: convexitydefects <0|1>; #X text 30 399 Inlet 1: message: settab tabname1 tabname2 tabname3 ; #X text 30 409 Inlet 1: message: taboutput <0|1>; #X text 30 359 Inlet 1: message: hierarchy_level [float]; #N canvas 230 125 955 706 cvblob 0; #X obj 328 216 list append; #X obj 323 148 list split 2; #X obj 357 190 t b a; #X obj 357 169 list split 6; #X msg 426 144 \$2; #X obj 323 114 t a a; #X obj 323 71 inlet cvblob; #X obj 323 93 route cvblob; #N canvas 65 87 922 824 drawrotrec 0; #X obj 341 569 GEMglVertex2d; #X obj 341 619 GEMglVertex2d; #X obj 341 689 GEMglVertex2d; #X obj 341 729 GEMglVertex2d; #X obj 341 749 GEMglEnd; #X obj 341 340 alpha; #X obj 341 483 GEMglBegin GL_LINE_LOOP; #X obj 447 261 list split 8; #X msg 562 391 0 0 0 0 0 0 0 0; #X obj 341 319 gemhead; #X obj 285 210 loadbang; #X msg 285 231 0; #X obj 341 117 t b a b; #X obj 481 537 list split 2; #X obj 447 511 list split 2; #X obj 407 535 unpack; #X obj 481 558 unpack; #X obj 515 587 list split 2; #X obj 515 608 unpack; #X obj 549 637 list split 2; #X obj 549 658 unpack; #X obj 562 184 t b; #X floatatom 612 526 5 0 0 0 - - -, f 5; #X obj 612 505 list length; #X obj 341 463 GEMglLineWidth 1; #X obj 341 390 translateXYZ -5.3333 4 0; #X obj 341 424 scaleXYZ 10.6666 -8 0; #X obj 341 365 color 1 1 0 1; #X obj 413 234 list split 7; #X obj 341 91 inlet; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 5 0 27 0; #X connect 6 0 0 0; #X connect 7 0 14 0; #X connect 8 0 14 0; #X connect 9 0 5 0; #X connect 10 0 11 0; #X connect 11 0 9 0; #X connect 12 0 9 0; #X connect 12 1 28 0; #X connect 12 2 21 0; #X connect 13 0 16 0; #X connect 13 1 17 0; #X connect 14 0 15 0; #X connect 14 1 13 0; #X connect 15 0 0 1; #X connect 15 1 0 2; #X connect 16 0 1 1; #X connect 16 1 1 2; #X connect 17 0 18 0; #X connect 17 1 19 0; #X connect 18 0 2 1; #X connect 18 1 2 2; #X connect 19 0 20 0; #X connect 20 0 3 1; #X connect 20 1 3 2; #X connect 21 0 8 0; #X connect 23 0 22 0; #X connect 24 0 6 0; #X connect 25 0 26 0; #X connect 26 0 24 0; #X connect 27 0 25 0; #X connect 28 1 7 0; #X connect 29 0 12 0; #X restore 474 353 pd drawrotrec; #X text 452 145 <- size of each blob data; #X floatatom 437 171 5 0 0 0 - - -, f 5; #X text 405 193 split blobs; #N canvas 65 82 450 542 draw_potatoe 0; #X obj 90 108 t b a; #X obj 90 318 translateXYZ; #X msg 231 161 \$2; #X obj 90 168 alpha 1; #X obj 90 278 translateXYZ -0.5 -0.5 0; #X obj 90 342 scaleXYZ 0.125 0.25 0; #X msg 270 161 \$3; #X msg 245 255 \$4; #X obj 274 140 t a a; #X obj 90 388 circle 0.5; #X obj 90 238 color 1 0 0 0.2; #X obj 90 148 separator; #X msg 310 311 \$1; #X obj 90 428 color 1 1 0 1; #X obj 177 434 loadbang; #X msg 177 453 12; #X msg 332 189 \$6; #X obj 332 211 > 0; #X obj 332 232 sel 1 0; #X msg 331 253 1 0 0 0.2; #X msg 351 273 0 1 0 0.2; #X obj 90 408 translateXYZ 0.2 0.2 0; #X obj 90 258 scaleXYZ 10.666 -8 0; #X obj 90 489 text2d; #X obj 245 277 sqrt; #X obj 245 299 / 2; #X obj 90 128 gemhead; #X obj 57 65 loadbang; #X msg 57 87 0; #X obj 90 88 inlet; #X connect 0 0 26 0; #X connect 0 1 8 0; #X connect 1 0 5 0; #X connect 2 0 1 1; #X connect 3 0 10 0; #X connect 4 0 1 0; #X connect 5 0 9 0; #X connect 6 0 1 2; #X connect 7 0 24 0; #X connect 8 0 6 0; #X connect 8 0 2 0; #X connect 8 1 7 0; #X connect 8 1 12 0; #X connect 8 1 16 0; #X connect 9 0 21 0; #X connect 10 0 22 0; #X connect 11 0 3 0; #X connect 12 0 23 0; #X connect 13 0 23 0; #X connect 14 0 15 0; #X connect 15 0 23 1; #X connect 16 0 17 0; #X connect 17 0 18 0; #X connect 18 0 19 0; #X connect 18 1 20 0; #X connect 19 0 10 1; #X connect 20 0 10 1; #X connect 21 0 13 0; #X connect 22 0 4 0; #X connect 24 0 25 0; #X connect 25 0 5 1; #X connect 25 0 5 2; #X connect 26 0 11 0; #X connect 27 0 28 0; #X connect 28 0 26 0; #X connect 29 0 0 0; #X restore 362 355 pd draw_potatoe; #X connect 0 0 3 0; #X connect 1 1 3 0; #X connect 2 0 0 0; #X connect 2 1 8 0; #X connect 2 1 12 0; #X connect 3 0 2 0; #X connect 3 1 0 1; #X connect 4 0 3 1; #X connect 4 0 10 0; #X connect 5 0 1 0; #X connect 5 1 4 0; #X connect 6 0 7 0; #X connect 7 0 5 0; #X restore 598 295 pd cvblob; #X text 20 488 cvblob; #X text 25 467 Outlet 3: info output; #X text 20 558 count ; #X obj 504 730 declare -lib pix_opencv; #X obj 487 141 pix_buf; #X obj 542 196 nbx 5 14 0 1e+37 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 2 256; #X obj 617 196 nbx 5 14 0 1e+37 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 10 256; #X obj 487 171 pix_gray; #X text 30 339 Inlet 1: message: area [float]; #X obj 514 96 pix_image examples/dessin.tif; #X connect 13 0 14 0; #X connect 14 0 13 0; #X connect 34 0 38 0; #X connect 35 0 63 0; #X connect 35 1 68 0; #X connect 36 0 35 0; #X connect 37 0 41 0; #X connect 39 0 63 0; #X connect 39 1 34 0; #X connect 40 0 41 0; #X connect 41 1 49 0; #X connect 41 2 58 0; #X connect 41 2 50 0; #X connect 42 0 41 0; #X connect 63 0 66 0; #X connect 64 0 37 0; #X connect 65 0 40 0; #X connect 66 0 41 0; #X connect 68 0 39 0;