From 7c8cff43ac589fa8cd2c96bedf3c8b38516aaa09 Mon Sep 17 00:00:00 2001 From: ros Date: Mon, 19 May 2025 14:40:43 +0200 Subject: [PATCH] Configured the red ball detection color parameters. --- bin/RedBallDetection | Bin 0 -> 44048 bytes data/color_params.xml | 9 ++ lib/RedBallDetection.o | Bin 0 -> 40464 bytes makefile | 8 +- src/RedBallDetection.cpp | 208 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 223 insertions(+), 2 deletions(-) create mode 100755 bin/RedBallDetection create mode 100644 data/color_params.xml create mode 100644 lib/RedBallDetection.o create mode 100644 src/RedBallDetection.cpp diff --git a/bin/RedBallDetection b/bin/RedBallDetection new file mode 100755 index 0000000000000000000000000000000000000000..799977901a3832b7213b9ef3528f45486613c240 GIT binary patch literal 44048 zcmeHwdwf*Ywg1jzASxt5L8Dk5R4VcanLHr)XcLlwiM(PaJjBOgn3*I~Co^##kl0$W zAzr3oD%bvK?X~uzSF87W_0p?Y)FMIAaI39&wMgwl)T)VSjZv?u59aq>`*G%+lNo=? zufIQjpHB{C)>&(>wf0(Tul+dh8=OlQ<>urtwdJvIFv8Y-T~KOdLGfL32cU*kvx)e% zv$NSa;Q5>;%4-Bbsn`zZnqh&Y=K+#j3GHNnX9_Y?P+3Tjk_tXSYAXQN#^ z{a~~6Umb2Q6S#s#IbPp7$!~!#pCsrC8s#W9JHIW;clMfLn{=X&8-+4yCxwgT4oJBJ zQcl5jGM);mc#=B$tCsP!LOaT6v-4lZta59loE6qfeg&xx+T3r%e8*E?qm#`AUXn=_8s9BX5hz5~uQc^T#*5_0Hlq-*{8_CNi*6{_BHXd+CK`|>Xww+NhA*Z{5O}10nH}F@3zeiucjbLN8K-ZL*gb%h;iJ={d zlZpO#7XFqKGV`C8Mb9~Co~7QhEc9rWJQ;!hOzm#Z694fM+n4z4WvAIQQ#J4@cap2eR0EdG9w zCEw1?V*iJ*rmaA*yoj(Ds#67h6NQn|Jw9@A-ofRwEAMdSR>{zjO*#NXvq9y=T%PrKi@IuP=OH}V?3y5G94N^iuE%9|q|?=|Z^ zBK%)noqN947zi{j+7M{m;6y;Bi}M2Q(YE8ZF+(O8LRarVgwlz&A>i|e17Sm=QByd| zR}sC=(-DhD{MCWz3Z$jqr^nV@UgvP?X=N^{i27sBfKOI$F5`xX#5NaHBC@{B8IZQy z>%o47&tNyqp63e$DI+pOK#f1;oNc}v+L81PKBrTfK0g!| zeM%);FzRgL9d1z|=y%7$5l^eA_p2v?tO6Y}?E8OVd)3BBfP(UOGFNp0>TdHR{-ECz zP4~eC@sJNAK{yio3XOnvz<&yZ8V0JoG>n)MHPGJL5ea+E4PNeO^~cq#S&$atE&S^JXM2Iuqk?Rz8J&+5ef6{pxT`b!66mDiJ(DGB?1;vE-dVFKa`V9E zjs-C@WSc6QP*5Rel`y6izo)&SS!*uSoEZDQ$Z&V1=C0D39h&Ha?l5}XdNPX7Kx**# z>V6|$)Q8=%N`J@~%w)GSyUFu-#Ez>{gj7!-cdR-Pj%tXCzp^0|i0R&tlZ}g-++nwd zkwP!IL34j-=tqhL%ySKDyB}1<%`z)~?cI zQdylpersgd(3IYAJVyPx)r++Y<)wpZD?=MG(`!xsXuRD|g?#Kl!qSSwdyVF8yGCpA z1cJ=79>Wz2L_08o#8B+*^k|qxIs-9=(IwmwWBBt#S{c$FizdQ|=!u0}=qJEhxMYhI zZ3$3oT}SI5s#LCj+C6~~)BHY9%!7jU(Wsz<6!Njfb#+=rX&GC*v|(YLR$f|OTBYw- zvbr^EY8N(Wj?xN2T(btumB#(ja)(%1V&RIjCG;ycS{d8;`4~l^Gh(V7%X(}A%Li9J z{$c43ids?IbY9XzRH2dNY%GWWBdHwzM>ug2{3c&>GiC>8w?x|u|8WhDV8*f2B!BFJTd;Juv2!GT z?Z}VeR4yx(^6EUJTHn{4FZAq|=MfeCpBn_d&q8OCzd)|z6~Dp{+$`iMo)g3_|2=4+ zpK72VHqg&D(2p4CvPxb$V4z=M;2$#3FEP+Z40MXG+KQ$9bQp5FA_A)869kpj8R+Wx zgy{7Kx;kDW`Zo=9bv#D&iw*Re9|(kUOCADog3CZxIY|YL209Mq^=*xTt}>Jg*BR(k zx7ykabdl?#q{Bcbo7C26psO~fvP}j$5>?-}80a$9c-b}s9f_}Rw;Je3aDCfhpcm>? z#_l!HiwyLg2D<7KRJ_|jpJd?gGtiCaCk`0srx^GT8t8PsR&9q3^eKu6c*HyGtg%k z=;s*dWd{1W270xDex89|W1vqr&|L=l*A4VW1AT^pzQ#bGX`rt&&}SLwZ3g;m1HHpQ zr*p7s>om|y6%lZgfj-wj-(sN435b_&GtkQo{I?qD6$bha1HIBfzt=#oGSGJ#=<^Kp z-3I!61HI2cuQt%fcE=(x7J;z{SR?R3(OI9ky5A{q_1gA@8FTgY#d1>zUETW&p5&~l zsuM$u4X37`1W)}oE9*{gE#6pO@_mR*XlSeScV5ZI!+6f;layvoE9jo_em;J=R3 z0t5c*I4z*zzmC&F1ODqcEimA}j?)4c{_8j`G~mCE(*gtj>o_ee;J=R3f&%{QI4vZG z2Xl0s7Vg7??|-iRw{!ee9jAo^{MT_>K)`<;r-cLj*Kt}fz<(X5g#!H7aath2e;q%c zFu;Eur-cIi*Kt}Pz<(X5g#rB6aas_-e;uF8@%KMd{?ma5 z+F#-59d`$*choc9KY+jSEi?Wn3;sI`{u>Malm*{o!FO5k`z`q07W{S#zTJW+EqIRw zzutn!EqJ>H_gnC*Eci+bzRZF6bnAlg4-%HlR0R$Cb2QM_|E7Yzn5P zZ_qxbrV~;}iq77I-p8Jl5d4>M{wk7pU2x2m7;^3V>o;BdM)F)aPrIH!7MlzOA7RcS z1qG=iExey9d78gAUE)D=v-qr)uI@`-rrFJvcq2B!)qBaCKn6}nKOgX6GI-jy0DL)D zK~}Gy^~5eb zT0!POMv43tDvpj%6S)PKOIfHah01}hPob-O|C%eVdXk)g4|ezfy=nVLV1KW3z|}kD z;)@t-aTSH0AdB{5pay*eCJ0w!wt-os4ZQ#LBvmV-a^pL@c^vkvL7-fTU5y-UcL5k{ z5mDMinm-az+T`lp#buJt9j?Ulk3tKh;x|8mo}`nrp2%6Lyno=ksJwe9XLDc7?MhZv zPq=z}gbh!-5-$zhK(;2UmJlDL`xKAuffk~0oVQ3{zTtw!lU_uqiuxStvZ4R36#TdC&6o=(`6 z*cGGS?H%-+4C1#w(bL93l6pjz)|*e3Bv(@Fkrv^`^N(_uVBHL=TDIO&(URQ6KF~$$ ztwO83hQnaA-fe!g-q*Qn)OuW>XqkOnO;wWkpfy+V*oJ&W;jQ;IsOPOWIHKa2tolzW z(IDG9*+X7Ri4p{#8=S1VS@Q9QN<4u^qBuytAuOUKU%TY{o3tR=Ly?kv2hx0(O1|fH zJ_@De+mYs*A^HAQ=c8ClzRonCP4eAHe93q*Md5N)jQvJ(-k3+>kuQ@+kAO>NN+CjQ z$)j26(jn{)T=X%xZ`@BwW5}c0)wQc?SJpPWUFiE*{wMa#=E2@&2QX&M0U8;5hInEB zK!}tjw{tYvW9I{2)de_DLayCGHK%!R;mxm$R+vOMeo!>2rx~>Vo;CQj!)jM=lI-p6;l?MY{1Inz(0O6YbSO;pT#3T&J@lI@+TORh zuW0kH5N<*FX3^$%pj;taZ`DhpMK|~ANK4Vy?*i!+x&~UhMu50j+0(0@8Rx>!Q-)yQmMf*D8Q^2rczjY8mt{ITHB{Q z9HhH*AiY9J^EeCX>q&Z;D($s7r1aqbkgpW2!Na2DG+FW-FQI4+K8})J+o>q%9tp>0 z_u5Y4yDhP4y*9>o1F=&v53eVNXzZk3+uM9M5`-IF-h0I2y%&jCdt#`^6!O|sIB1V=tSa{bM9CtEmIRv$X zg_swg?x}<~ISA<{${^JE)>Ja8=ZHiPb96fonQ5p$VGh`70S7r(5;}l3im|oA7`--Iws-mt2+ZflJuPHKX1~M7_#`nPv}e z6Q#Uaq(*p&3>$Cb3R7oO?zmv0`f8S95u!WJH=w* zX;e8di>t*E=XNpmNrSkd<8h)B1#&VJ(cuMu#Tn7G&)diop>mp#;E}^}J6-TAE|C<$ zkc06qE-2U<#G%b^-sSBg1p5b`;8H!D51I9;KzDMr{R4Li^q@qy3skk*UEGwO9kQ8T z;icO-YHFsCD3I+ZbaN+9;03$5`eY9k@Hyd8aZUj1*>||DLZW}*R8c)=hpj6F%J|B^ ze_)-cg`=kG-^2Q)w};XeGylQf9vVcjcc7QgkJ#&zZP!xt-XEx2uR4v#UWQoI&h6cZ z)6Tto-V~Z>Koy#3dQ+OP4pN#XNKJgLErZN8&4DH~uZ&d(q-FE|56+aklG$64?7Qx$ zsR>hDL~p_&fvTXrDo_=)GY|}NS1#7(h>k}FJc>A`9;Y9w!^gW;Pur-1B`CmwJm|ei z`Xyxm;vCI5AtfT0Bw;v7#q{tKA2J{3O}bsiR#?R&@;P4_ZI{irlSDz?_ZP!@p%H63u8wCR1>k*wa1kYx>K3M_%+c*Mu#yU1zE$mS7i1VgmEKJfec}MxQHj#=r9hN3WU=< z@SAzT@rBVoI4X?Sa&>wb|4pDOjBbIdFs_$TmD%{uqQ7^bMa^M6B(ipN823=$&X$dx zGS?}klNqzIjM4xZ$~lbVau^r5P%t`-cbW?l@4w>uO!#FsQC5$sBW(ngJrUFA4|7QY89A6l7 zM~Crsu1*i*nY>zkMevj;RbhP5WR!?C?;;+vmbc&F?(XCRk38X7H3gUKXx#W38DU=X zig7HTOX&x;@i&Q2x9m+Wrdu|P*O+0+a|l;z4Psg*Q+|4`Fy$6rg=zIIOzHXyuUq*o z{LxLh!feV8)c8Ts+9aL$8ODjAARHYox_aMm(d<6>`x{iUrDr}0H|?R{sc||aKA%iT zUcxTJ`lpx7NYJvXtC0-j%c`HlaIvg9ldq&mG#;$z#IjUWm$qD4J)&|lxXiza?CX(xJSV86b153K;|d+(>|yT12sIf1;LmWZ%$2~`Avi-GydWGsB1e&@!Hm*P68)t>d3?b9uwb^!(tCjN^X~`ri!DW) z>u{IC-~#;UCrI_WKISg-Gx5(tbTq>uFbuwqlaJ{l71oO&FnCMGB0Gu8Q%Gq$mF6E>M3m-FVWdHG(88uP zzesNWFr(%L77?ZS4zuQyEo@5jb)<@+dt z@@*1*QlL8}8WgC~a}`iyTB=O;;{ z!rxoy%C-|o^Sc;>(>`vKntu)vXjU3t5vUT}B2eYakI9V0;iLId&)`oo>TELW#Hnwp zLg}nD>!bn1q|=#E=P{(R!Or<+okv8evhzJEHQM<;riszM|C?Fo>jG7FZZ+$?&8qWu zlTKCj_x_x@bG`ivPgJFRE|ed=I&G2?ugfBSpILkeseJV8(c<|QaV7`AKMP;f9P%91 zp1vU7qvnoZTIfSENpAm>*(o)B{DV-drjJgGxSB^o5J%goc|;>roTzvRy922|P_h5; z6}4B^UR8T_ttPI((?zo_{D_iYgmoo$b-)|rRWrkt^2G>g4(8t{@Gv!Xx>(c61V9{WS&XecY1& z(>)ab2Fna7Bg~zWZppV%K2Sv_h7izCE_F9*MF81FTe46TmiyeCKq7k z_`zbVmhRxbP5Is;@~G+vNLWPr2!rGGP`E9955?mox)CLarJ_bXe`)v)sy@lO~aiXI)7r>k&H52KG{fmj>z@eFDZG_=HMO? zTy4G{wV=Om@EYV@Kyo{DhzuNaIh+p8Tz~f^Q)H-fSEFGM;0C5X>wwei1i63U5P}JP2hdXwO7pHEQgY=% znAj&t&A%rSar6&trtqW8F!DH#&PtXb+mkv>tDC^!|ZMexm z-Kj*XUA;Bcbc5G49qI0y{3!IKhKlwTcYl%-AHSQr&rut{B!@eMaDNxXVBRCBg75d& zs5Tfdv?cAUHbXUyGlX2DUDPCDqOqjk`I&6Of!><@1? zo>B@&D$dVxj=o@QKk84aS0H;`iDD$XG57V-WMcs;2e)iXR*HvdB*T4tGA%I)<=t>P#YH3|PU81LUH(Cy zh_9lt^!t}TDTyd3J8w_uBF?v_5i(%KzciptR zitnxxUX;$I*N)AV2Jkm$Mm#a9n%f&K?Q9P+#Y8WYHPSB(T-b79_`>Lg5js7?w-p^E zY@ajTYmfM^jRzwBsNEB?;}vOm(^@E2dLmmHx+WCf7(#qF=Q^;S53<}WrSyVXkC%eB z?#j;TooU7^R@XKyZ&}QCIQZRm^Ay*F-NUwR`L>)Y$k9x7+z^RMFn_ zenZyWhKRIcs3wbFD`Fntkk%@XXKxZt>lM$S`&!kdw zo)v%R81@y7;9q{7=2;7#8vHE}+wq!DYFazJLD$~qiQ3ouk@>BG4gL^gbK}v-+(5`1 zjQjj^#S4rpB`lvy@7SD6FEOMS1c$u-(zcEcyh0DX1)byKizy;>Mmm*x?*_((Y6<6C z&CNAAQ}ZsOZyrns;nrWJQf=7Zy%*;#0S^G)3wZd6RH_kh-;=4-R$MQ+X@4s95a0`d zban5Br&FoV0Q(Q5Qs?1RU;*ylxEL32?*{Y%{u;OEyaRX|ZaA8N%U@-Heb9F$;1R%| z1JZDC1ket6CT^9g0h|rE4$ud<32-yu4!{d>W84wI?*itd-r2ZGXg1&{fJ*^OaQ|Tt za4q0>V9)mfe+u{j;I9A=0say27~p4sokvrtGhyF;z^#C#xMA|&0ha?l3%CWa40ewI zb^_9d8%_C^b6pe5=`7BfI$?YP#f<296q0S)mrBhgj{5QZ;>>y2t;FAq$HXIktgv`d zVacUMCv7a)#J+jPg)=M8JBQdw{!0AWA5W#YAQ7<;tiR0G8AfQzK@A!+M{8B)@JhzrJQ2Dd?`x(j?7|T1-^6!AY8|4=p%cJS?3Gn+x zl;eKMwEjiu^4Tcgk8*yML)jNjmoG*6A5ng`QGQjroE}T0@`sJ(x%YDhvY)n`>l&Bx zmKcBAt_v8Os@lVjGKzf@a&Wy7~c9aQeZUj#f45YG(;9%px6?vAuABd}!z ze7^;st|#{?-IfyMCFS#3#`2YE`D&Ekh4O{Q@~*TU2SK0Hmr6Yam`}-FE8COocr2}l z`opimw~X{Co?I7aAb(0==f^1jcfkDTz^r_Bb?4>XmZS64p#0nD-!8D^KW5>ZpUe50 zp^wIe+xDkYwNt@&uYs@e=DZ)|Cv98Db&t<$pIBO)yP}lkj%0v6r7UkGr?j{Qux>ml zrnYmz#Y2cEzapt@Y~|JR@-~#eiE{Eu_u-0k`4*JZotFGcnUdGi<@cg|_zTJpp!^e* zcNz8PisUEz22kFN_F7^pU&t#Uo2VW3|2dVSdsFghP*QDyIOlE?b`T$hY{4t3)O2c( zrwn{(*Sx8sJ*d7l`C@$h7WQ?2b3I%UmD3#`*TJ4_edShJUS*UIrsJ_2<%eJg&l?r5 z+D+Ug6- zZW`w*tnMDaxUeQvSY2CKR$Dk@VWE9tVadY6;)R6;{5_-f7+X7`2SDHO5G=#r376So z>?b)W0aEl0+if}QGTTi#>>)`iUTb?bmqnh*N#(Lna?j;#lY+L-^VsH`-{szx&wi9I zh|lC+Vf*j`_M;rz_L=O)y!&!LuVR0**$!2)pNzBZoXMUWS3&#Zwa2U2zZTeDpUL(V z*q)imo;<;}XBK(011x_Ijah>m2q>k?rnM_HmKz*c^6uvF*({EIG-RDrJvM zvK=mEZ%wlGm9oE_Z2PCV?4M3q{qrjJ{wcOk=Cage+pf9nzEf@ZEYzK+opr2?y>r@G zZ#KB&iN|dM0wCyTq&wkDJu7lln7E!jIZA(73}TvY<-oid%Er3O7`6JH*>)H z()qTxD%t1f&&B?>nYT~iK|W!bt%D_GD@?9JB42C!G>78*W)6EWr$ukbv7NC9j74B9 z0%H*vi@;a}#v(8lfw2gTMPMufV-XmOz*q$Szl(tSo{Rc^i~3#*PG|AW3crOj1GFjn zIXI7I#7~hYeN=g?1*dP(82Ra2H%6SkZ9^N*N{G!a03J5y+m=QF`FSkts_)a_^d;Za zxph3x!#DLk8al^D8=X6+?W1FHl7~W{eacQo!?(YZG_s6Xo%j|+uBVnV2>m=-u zaFc}FB-|n4P6_)YJSgE235O(P(-_~1CB#K$zLiN>BVnV2>m=-uaFc}FB-|n4P6_)Y zJSgE235O)aM^8ol651s!ldwj@MhVwR*dgI23AahOL&BXB_DOh9!Xpw6NyyHX^-E}% zuuMWxdi=lY`%X#&KGSufea6c5@lY&oUw{v@md$a*Ip+9od0A;0zSMewpeu>&Fb|_o zN#5vk`g&J&MtUAwlaZd!zLSw|)5is4EqV0taE1<%hhD744KsfMQ~k+IKY^)!Xr`aY zRDUw-_u{4jq;JnUA z5&L=U6t=~ii9VV2`7+U`uo8Zu#9WrgPSwYIV@V!HPc_b)=_M@FIFpAjc&TyO%#T@P zn~@^+^YFc7^_?$cX&%3lWu%CCF`vDUrz_1H&1bo|Iv(RanAbvF;D{b?! zlLLE#|0pOqvS1OXkB&n-=%h!@^OBv>b+Mcb@w^rEO!nW;`A=pA>#&1O)q8;NPi5^E zdtT!7li7rI*ukc{%`xofAWw?d5jCyn6euM6q;;IE>$ihW_BWg_=uZj2zA5=nw(wsj z>8DueK1rW!p>L4-3ug$${Q4PoeOn?Wm+TH3(eknVKu? zSL-XaZXvNuao!C69IOr|XUP9d{P#^H{iDZ$TezOlc}~|WF?x>b7ry|VAs?*$=m|+z z>n!0NW546{(fxV=bc_O{wwgSm7qbsizlzxv(m=ZYPTL;PGkur+QY3sPJ8=m! zBb{D~LiWEV6Q@k5XErQMiN17&AgHuBOVX|1Q?CF$Q@uB2q3_5-e^lzXepmjtS@>Vg zLcd^KW_u33Z!aH!?mzhtTRNEZ4T zSa4^GTPNsLZ=2MAvDE*QEc_p2p`TKaS^umobb2B@lRXcCPWF^adlpE0o&}xqu*5Qd z9R}Sld5qw#Ecz$mz#>z&c>DKnzD(TjF?GDhX-HRKA z-F^YsFF0Ky29S$(Cp)i}c|Jpyl}P&T20@r5>GLR04DxFCQqb)RF+d;a)Q;-=vzUhX z)+zN{=hJ`4qW@N|2Q{w~@=DJ=Qjaws9s}JjSWUk#ksgfy*74+Z&?#=4WZW>_@a+Sx z-=u;gMd)8NE?L*}XM&z7J{4K$*Mm;+x907Svhe>R3;p+5=)+m)^D$&(vhzyN$sTJz z-I#^{`&sC>Wuf0M_5VfYmF%wUu%uh(*`X|YW=+a$edB;x797tCXkF2-+$*L?Bz z_AZDRFb$kB6Kj*-x6l&|)}szDJs(i&#Vz65T6b)zV?js2@AYpCME!UyB82{uWO>7}J7beAm4r91M87oKj&0Dhhk)UUQhx zDv0v}ts&f%PKwIC8-h`1({i`wa4f(aSJ@io)2rzB& z(iID9mqH}IUTe^_wdG~>P=k2RqES7?5?$_&&DSW*4u_+By$4TTpbk8O(c0j3#~coN zazl$nJb_rW!RvH;@IywzeeRHZKFrq^HPtS2YR={L8ZcSyibadu&StH-cHvSdsP&gG zuU*zq2WC^Q_{;=&7eVW5ikHAUXx&>BJ=@mMY8 zwUf1b0wJlq${o1Qub~a<98L<~+T*ALqD@QOm0C^B;-w7>>(;E%DsT?596gNZp`(0N zz~>Lwc{*b8h`%E0k2wQ~0579(LL5m$ZHy%Mwq2vOcmhGGODiv}G_cll*5k3!&l%zY=&^nkKpkZ zPc+>rtNf8jIN}T(pD75Sdx6H2WC^;0xm~LR(G_@T%FxAro|wNg5KA{?IX-NJ zRwq$v_9{MB>*Garizgae6!H6=jWmR~W0n4pFPN!2I-Af%D@3OaizkyB(B;ZBr+c0` z2dO&Vc`3zAZI68OMZ;PfhLE5dFHN1K&e7mo8mM$G4LGRlQzxo~(VeJi4OO+K*`c98 z2HPZBU#>efKM-p2gjzA+jqZgQ;rJj&-LqU<5s#(&r|28i-VHJS=u;+Xq0lTR`Y*Li zr5A%<%-@X1&#qbTiEss9edxe2*BA&iF4_=i+~7pZXL1%v$4%kmqGXuo3j|U7mo*zv zKn&(JViJteNQ7~St2CrGk2B9XV^1}uoEU11#eA@6>A`ty z3dOlVe}3*OgkGc}`a^4Hr$&#nh4DCFAl9XAD66T#SYErZL35N=FwIZTT1uNRj__%G zbXI4|%P-r&l)0w(lz*i@Xqsk@f2JVGEUl*x!pM5H&N260>JF-DWUQ!}3`2r>)Ij=#9qt!k0Yz>PuH@!6jZkz{w`Dt}N4Y26zqq$gtS0q=mOL z(70p+YxT#FHkQ_HXkMnN1IXrOb#(aH>{*XB0a!}vm@ld{8k*G{f>2Wj zUvG-pakoIWq0rK$WXg=1q63}sh*Mwo&GUvkx|+jshB9?bwVI+4lMYYi5w2Li@)>*d zgq>+I=xxSQuu8M8_eBh<1L3HK#iPHn0huvsu$P^1)L29gde(;{*8JfaF@GbD6qoqB zoB@WxZPa3ejvGxATRJJx2lcL_+&8hRc?>Gb9mrreKXVYLLsh4Ebln*+DFKr17F?w} zX7(9<#oVgW=d>77)zF&^rw>LQP?%>k!&1eZAIdf3ctR1aUtJpUx0GgDd`P2A!BArm zU(=6nI#wF(YL9u=1I8i(wy8ZV0{xK=R*Lr}_)Bq$rL-eL&+5mz45an(K+rb_$EJb{ zE1x+rPb=f>cr`#9EA@4SP=$c8h$z`WuK);#Oo)au9D8|4K<;$}W2}@0BUXyt($=ut ziTb^)6h}%xc}FkB%8C|RrT#W~vZ>7nZ3;s*Ua#iw^!jmH20mh>;#$RdD4|2`qjFDs z0P2N8tTS0D&VkYU4o07oJst{OCZ_E@D6j4#QczuYQvB+?x5DW(s!?9uZ=|4IF-mBaUky6G*&0^{s_gDfoRUr|egJ3Vs*mbnl|V)qPV6Zja24!Nr2)%{fpZjuJ8 z`jx!$|Ho2(p;V~u!%|S)&q?xhZ--U>4$!CyrJvb>&}QeqxbkA&tnL3(6dUF3cEPVh za@w%rbUfb_ya$+3UfuttpyHEaxUwKN1$SEH)qP?L8sAw#l1fg&M=bK{dZ&WZ<#jxg zrA^5R4A=FrW3*r0ccvgNo0&Fi{GO8Xs{PgVDFwG!;-}hADgBK_Ufsv0AiZP7xLND} zgGFB5@221ybs+3W z5|u8m?hopd@`{fu!;iuhEP_1cz6!ItAMb#aUnd)e`Y&xtPUXRUppj2XUfs7hg9Zj{ z^d@`brsNf*_hlI6_3MF~gp}&%N{5nD_*oDpnyO#j2UxO6aFki + +0 +179 +105 +255 +210 +255 + diff --git a/lib/RedBallDetection.o b/lib/RedBallDetection.o new file mode 100644 index 0000000000000000000000000000000000000000..1fdfd1d73160f87b7b8b788d4857778a2b6d2eb4 GIT binary patch literal 40464 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 +#include +#include +#include +#include + + +#include +#include +#include + +#define CAM_PARAMS_FILENAME "./data/camera_calibration_params.xml" +#define COLOR_PARAMS_FILENAME "./data/color_params.xml" +#define FPS 30.0 +#define STRUCTURAL_ELEMENTS_SIZE 5 +#define RESOLUTION_MAX 800 + +bool readCameraParameters(std::string filename, cv::Mat &camMatrix, cv::Mat & distCoeffs) +{ + cv::FileStorage fs(filename, cv::FileStorage::READ); + if (!fs.isOpened()) + { + std::cout << "[ERROR] Could not open the camera parameter file storage: " << filename << " !"<< std::endl; + return false; + } + + fs["camera_matrix"] >> camMatrix; + fs["distortion_coefficients"] >> distCoeffs; + + return true; +} + +bool writeColorParameters(std::string filename, int iLowH, int iHighH, int iLowS, int iHighS, int iLowV, int iHighV) +{ + cv::FileStorage fs(filename, cv::FileStorage::WRITE); + if (!fs.isOpened()) + { + std::cout << "[ERROR] Could not open the file storage: " << filename << " !"<< std::endl; + return false; + } + fs << "lowH" << iLowH; + fs << "highH" << iHighH; + + fs << "lowS" << iLowS; + fs << "highS" << iHighS; + + fs << "lowV" << iLowV; + fs << "highV" << iHighV; + + // releases the writer + fs.release(); + + return true; +} + +int main(int argc, char** argv) +{ + // initializes main parameters + std::string sCameraParamFilename = CAM_PARAMS_FILENAME; + std::string sColorParamFilename = COLOR_PARAMS_FILENAME; + int iStructuralElementSize = STRUCTURAL_ELEMENTS_SIZE; + float fFPS = FPS; + int iMaxVideoResolution = RESOLUTION_MAX; + + // updates main parameters from arguments + int opt; + while ((opt = getopt (argc, argv, ":i:f:o:s:r:")) != -1) + { + switch (opt) + { + case 'o': + sColorParamFilename = optarg; + break; + case 'f': + fFPS = atof(optarg); + break; + case 'i': + sCameraParamFilename = optarg; + break; + case 's': + iStructuralElementSize = atoi(optarg); + break; + case 'r': + iMaxVideoResolution = atoi(optarg); + break; + case '?': + if (optopt == 'o' || optopt == 'f' || optopt == 'i' || optopt == 's' || optopt == 'r') + fprintf (stderr, "Option -%c requires an argument.\n", optopt); + else if (isprint (optopt)) + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); + return 1; + default: + abort (); + } + } + + // distorted/undistorted image + bool bIsImageUndistorted = true; + + // reads camera intrinsic parameters + cv::Mat cameraMatrix, distCoeffs; + bool isCamParamsSet = readCameraParameters(sCameraParamFilename, cameraMatrix, distCoeffs); + + // checks if the camera parameters were successfully read + if (!isCamParamsSet) + { + std::cout << "[WARNING] Camera intrinsic parameters could not be loaded!" << std::endl; + } + + // creates a camera grabber + cv::VideoCapture cap(0, cv::CAP_V4L2); + + // changes image resolution to maximum (e.g. 1920x1080 if possible) + cap.set(cv::CAP_PROP_FRAME_HEIGHT, iMaxVideoResolution); cap.set(cv::CAP_PROP_FRAME_WIDTH, iMaxVideoResolution); + + // checks if the camera was successfully opened + if (!cap.isOpened()) + { + std::cout << "[ERROR] Cannot open the webcam" << std::endl; + return 1; + } + + cv::namedWindow("Control", cv::WINDOW_AUTOSIZE); //create a window called "Control" + + // sets min/max value for HSV color representation + int iLowH = 0; + int iHighH = 179; + + int iLowS = 0; + int iHighS = 255; + + int iLowV = 0; + int iHighV = 255; + + // creates trackbars in "Control" window + cv::createTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179) + cv::createTrackbar("HighH", "Control", &iHighH, 179); + + cv::createTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255) + cv::createTrackbar("HighS", "Control", &iHighS, 255); + + cv::createTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255) + cv::createTrackbar("HighV", "Control", &iHighV, 255); + + while (true) + { + cv::Mat imgOriginal; + + bool bSuccess = cap.read(imgOriginal); // read a new frame from video + + if (!bSuccess) //if not success, break loop + { + std::cout << "[WARNING] Cannot read a frame from video stream" << std::endl; + break; + } + + if (bIsImageUndistorted && isCamParamsSet) + { + cv::Mat temp = imgOriginal.clone(); + cv::undistort(temp, imgOriginal, cameraMatrix, distCoeffs); + } + + //Convert the captured frame from BGR to HSV + cv::Mat imgHSV; + cvtColor(imgOriginal, imgHSV, cv::COLOR_BGR2HSV); + + //Threshold the image based on the trackbar values + cv::Mat imgThresholded; + inRange(imgHSV, cv::Scalar(iLowH, iLowS, iLowV), cv::Scalar(iHighH, iHighS, iHighV), imgThresholded); + + //morphological opening (remove small objects from the foreground) + cv::erode(imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + cv::dilate( imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + + //morphological closing (fill small holes in the foreground) + cv::dilate( imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + cv::erode(imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + + cv::imshow("Thresholded Image", imgThresholded); //show the thresholded image + cv::imshow("Original", imgOriginal); //show the original image + + // waits for awhile depending on the FPS value + // checks if ESC was pressed to exit + char key = (char)cv::waitKey(1000.0/fFPS); + //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop + if (key == 27) + { + std::cout << "[INFO] esc key is pressed by user -> Shuting down!" << std::endl; + break; + } + if (key == 'u') + { + bIsImageUndistorted = !bIsImageUndistorted; + std::cout << "[INFO] Image undistorted: " << bIsImageUndistorted<< std::endl; + } + if (key == 's') + { + writeColorParameters(sColorParamFilename, iLowH, iHighH, iLowS, iHighS, iLowV, iHighV); + std::cout << "[INFO] Color parameters saved to file: " << sColorParamFilename << std::endl; + } + + + } + + return 0; +}