Professional Documents
Culture Documents
Ung Dung Xu Ly Anh Trong Thuc Te Voi Thu Vien OpenCV
Ung Dung Xu Ly Anh Trong Thuc Te Voi Thu Vien OpenCV
Ng
uy
Page 1
nV n
Lo
ng
M u
Ng
X l nh v th gic my l lnh v c m ngy nay c pht trin v ng dng rt rng ri trong nhiu lnh vc khc nhau nh vo s pht trin ngy cng mnh m ca cc h thng my tnh, cc thut ton v cng trnh nghin cu khc nhau ca nhiu nh khoa hc trn th gii. Vit Nam, cc ng dng v x nh b c u c trin khai trn mt s lnh vc nh lp t h thng nhn dng bin bin s xe cc bi xe, h thng nhn dng vn tay chm cng cc cng s mn hc x l nh cc trng i hc c xem l mn hc bt buc mt s ngnh nh cng ngh thng tin, in t vin thng Tuy nhin nhn mt cch khch quan th s lng cc ng dng c trin khai trn thc t l qu t i, lnh vc ny s cn pht trin mnh m trong tng lai nu nh c quan tm mt cch nghim tc. Xut pht t thc t rng mn hc x l nh cc trng i hc l mt mn hc mang nng tnh hc thut, kh khan, cc vn c m t di dng ton hc, sinh vin nm bt mn hc mt cch chung chung m khng i vo bn cht vn , ng dng thc tin ca mn hc, thm vo s lng ti liu v chuyn ngnh ny bng ting Vit l khng nhiu, bng qu trnh nghin cu nghim tc, kinh nghim thc t tc gi c gng cho ra i cun sch ng dng x l nh trong thc t vi th vin OpenCV. Cun cp ti mt s phn ca lnh vc x l nh v th gic my, thng qua s din gii trc quan, khng xa vo nhng cng thc ton hc tru tng, phc tp nhng vn lm ni bt nn c vn , gip ngi c c c ci nhn tng qut, hiu c khi nim v hn na bit c nhng vn ng dng vo thc t nh th no. Cc ch trong cun sch ny u i km vi mt chng trnh m ph ng c vit bng ngn ng C++ vi s gip ca th vin OpenCV, mt th vin m ngung m c nh gi l mnh m v tc x l p ng c cc ng dng trong thi gian thc. Cun sch c chia thnh bn phn, phn u gii thiu v th vin OpenCV, phn th hai ni v mt s vn chn lc thng gp trong x l nh nh khng gian mu, cc b lc, cch pht hin ng thng ng trn trong nh , phn th ba ni v mt s th thut lp trnh vi th vin MFC v phn cui cng ni v mt s ng dng thc t nh bi ton nhn dng bin s xe Cun sch khng ch l ti liu tham kho b ch trong qu trnh hc tp ca cc bn sinh vin, qu trnh lm lun vn, n m cn l cng c tt h tr cho vic trin khai cc ng dng thng mi ca cc k s, doanh nghi p v nhng ngi quan tm ti lnh v c. Cui cng d dnh nhi u tm huyt hon thnh cun sch nhng chc chn cun sch vn cn nhiu sai xt, tc gi mong c s gp ca bn c. Xin gi li chc tt tt p v li cm n su sc ti c gi
Tc gi: Nguyn Vn Long long.06clc@gmail.com
uy
nV n
Lo
ng
Page 2
Cun sch c vit da trn nhng nghin cu v qu trnh lm vic thc t ca tc gi, vi mi vn nu trong sch bn c c th c qua nm bt c tng chnh, sau c th tm thm ti liu nng cao hn vn v c th thc hnh da vo mu chng trnh, source code i km.
Trong cun sch c nhiu vn lin quan ti k thut lp trnh nhng do phm vi gii hn, tc gi ch c th ni qua c mt s kha cnh, trn thc t c nhiu cch khc nhau gii quyt cng mt cng vic, vi nhng vn lp trnh bn c cha r c th tham kho thm ti cc ngun khc nhau hoc gii quyt theo hng m bn c cm thy l tha ng nht
Ng
uy
Page 3
nV n
C 10 ch chnh bao qut mt s kha cnh ca lnh vc x l nh c vit kh chi tit v gii thch y , 3 project c tc gi m t chung chung hn. Do bn c nu cha thc s quen vi th vin OpenCV nn c theo th t t u ti cui
Lo
Th vin OpenCV c vit trong sch l bn OpenCV 2.4.3, i vi cc bn OpenCV khc th bn c c th ty chnh li mt cht tuy nhin v bn cht ca vn l tng i ging nhau. Ngn ng lp trnh cho cc v d l C/C++, IDE s dng l Visual Studio 2010. Tuy nhin a s chng trnh trong cun sch ny u c tch bit phn x l chnh ra vo mt file *.cpp no nn ta c th ly n p dng vo cc trnh dch khc.
ng
Chng I. Lm quen vi th vin OpenCV 1. Gii thiu v th vin OpenCV 2. Phin bn OpenCV 1 hay OpenCV 2 3. Hng dn s dng OpenCV trn Window Chng II. Cc php x l n gin trong OpenCV
Chng IV. Mt s ng dng trong thc t 1. My Photo Editor, phn mm chnh sa nh n gin 2. Nhn dng bin s xe 3. MyCam, mt s hiu ng nh trong video 64 73 90
Ng
uy
Gii thiu v MFC Khi to project MFC Lm vic vi cc iu khin (Control) Chuyn i cc kiu d liu trong MFC Chng trnh ti nh v hin th nh ln giao din MFC
nV n
1. Chng trnh u tin 2. Khng gian mu, chuyn i khng gian mu 3. iu chnh sang, tng phn 4. nh nh phn, nh phn ha vi ngng ng 5. Histogram, cn bng histogram 6. Phng to, thu nh, xoay nh 7. Lc s trong nh 8. Cc php ton hnh thi hc trong nh 9. Tm bin nh vi b lc Canny 10. Chuyn i Hough, Pht hin ng thng, ng trn trong nh
Lo
ng
5 5 6 12 13 17 19 23 27 30 37 43 46 51 51 54 59 61
Page 4
M c L c
Th vin OpenCV ban u c s h tr t Intel, sau c h tr b Willow Garage , mt phng th nghim chuyn nghin cu v cng ngh robot. Cho n nay, OpenCV vn l th vin m, c pht trin bi ngun qu khng li nhun (none -profit foundation) v c s hng ng rt ln ca cng ng. 2. Phin bn OpenCV 1 hay OpenCV 2?
Ng
uy
-
Cho ti nay, tri qua hn 6 nm t lc phin bn OpenCV u tin c cng b, c ln lt nhiu phin bn OpenCV ra i, tuy nhin c th chia th vin ny thnh hai bn chnh da trn nhng c im khc bit ln nht ca chng: phin bn OpenCV th h th nht (hay cn gi l phin bn OpenCV 1.x) v phin bn OpenCV th hai (hay cn gi l phin bn OpenCV 2.x). Sau y ta s ch ra mt s im khc bit c bn gia hai phin bn ny. OpenCV 1.x (bao gm bn 1.0 v bn pre-release 1.1) da trn giao din C, cu trc ca mt nh s da trn cu trc ca IplImage, trong khi th OpenCV 2.x da trn giao din C++, cu trc ca nh s, ma trn da trn cu trc ca cv::Mat. Trong OpenCV 1.x, ngi s dng phi hon ton qun l b nh ca cc i tng, ngha l khi m t i tng mi c to ra, ta phi lun ch gii phng n khi khng cn s dng na (trong nhiu trng hp c th s b trn b nh nu khng ch u ny), trong khi th vin OpenCV 2.x vic qun l b nh tr nn d dng hn nh cc hm hy cc cc lp i tng trong OpenCV 2.x thc hin iu ny khi mt i tng khng cn c s dng na.
Page 5
nV n
D n v OpenCV c khi ng t nhng nm 1999, n nm 2000 n c gii thiu trong mt hi ngh ca IEEE v cc vn trong th gic my v nhn dng, tuy nhin bn OpenCV 1.0 mi ti tn nm 2006 mi chnh thc c cng b v nm 2008 bn 1.1 (pre-release) mi c ra i. Thng 10 nm 2009, bn OpenCV th h th hai ra i (thng gi l phin bn 2.x), phin bn ny c giao din ca C++ (khc vi phin bn trc c giao din ca C) v c kh nhiu im khc bit so vi phin bn th nht.
Lo
OpenCV (Open Source Computer Vision) l mt th vin m ngun m v th gic my vi hn 500 hm v hn 2500 cc thut ton c ti u v x l nh, v cc vn lin quan ti th gic my. OpenCV c thit k mt cch ti u, s dng ti a sc mnh ca cc dng chip a li thc hin cc php tnh ton trong thi gian thc, ngha l t c p ng ca n c th nhanh cho cc ng dng thng thng. OpenCV l th vin c thit k chy trn nhiu nn tng khc nhau (cross-patform), ngha l n c th chy trn h iu hnh Window, Linux, Mac, iOS Vic s dng th vin OpenCV tun theo cc quy nh v s dng phn mm m ngun m BSD do bn c th s dng th vin ny mt cch min ph cho c mc ch phi thng mi ln thng mi.
ng
// Pht hin ng trn trong nh OpenCV 1.x Mat src = imread(image.jpg); Mat gray; CvtColor(src, gray, CV_BGR2GRAY); Canny(gray, gray, 10, 30, 3); Vector<Vec3f> circles; HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 50, 100, 50);
Ta thy rng i tng nh gray trong OpenCV 2.x khng cn phi khi to, i tng storage (i tng trung gian, khng c ngha v mt s dng) cng khng cn phi khi to (v do khng cn gii phng).
Ng
T mt s c im trn ta c th thy rng th vin OpenCV phin bn 2.x l c nhiu im ni tri hn so vi phin bn 1.x, Tuy nhin trong mt s trng hp nh cc h thng nhng khi m trnh dch ch n thun chp nhn ngn ng C th phin bn 1.x vn cn gi tr. Trong cun sch ny, cc ni dung ci t, thut ton, ng dng ch dnh cho OpenCV phin bn 2.x trn nn tng h iu hnh Window. 3. Hng dn s dng th vin OpenCV trn Window
Page 6
uy
-
Th vin OpenCV 1.x tuy cha mt lng ln hm x l v thut ton, tuy nhin n vn dng s khai. Th vin OpenCV 2.x c b xung kh nhiu hm, thut ton v c ti u kh nhiu c bit trong cc kha cnh v pht hin i tng (detection), nhn dng i tng (partten regconition) v theo di i tng (tracking). Hn th na, tuy c giao din l C++ nhng OpenCV 2.x vn d mt phn giao din C tng thch vi cc phin bn ca OpenCV 1.x
nV n
// Pht hin ng trn trong nh OpenCV 1.x IplImage* src = cvLoadImage(image.jpg); IplImage* gray = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); cvCvtColor(src, gray, CV_BGR2GRAY); cvCanny(gray, gray, 10, 30, 3); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, 50, 100, 50);
Lo
Vic vit cc dng lnh thc hin cng mt chc nng trong OpenCV 2.x l d dng hn nhiu so vi OpenCV 1.x, mt phn l l giao din C++ c phn d hiu hn so vi C, mt phn l cc hm trong OpenCV 2.x c ti u ha nhiu bc trung gian khng cn thit v mt giao din ngi s dng. Chng hn ta hy xt v d v vic pht hin ng trn trong nh mu da vo thut ton Hough, cc bc thc hin l load mt nh mu, chuyn sang nh nh phn, tm bin da trn b lc canny v pht hin ng trn da trn thut ton Hough. OpenCV 1.x thc hin nh sau:
ng
Phin bn Visual studio s dng y l phin bn Visual Studio 2010, cc phin bn trc ta hon ton c th cu hnh mt cch tng t. To mt project mi: New > Project, trong ca s New Project chn Visual C++, Win32 console application. t tn project l opencv
Chn OK, sau nhn Next, hp thoi tip theo xut hin, hp thoi ny ta chn Application type l Console application v Additional option l Empty project, nhn Finish kt thc qu trnh khi to
Ng
uy
nV n
Page 7
Lo
ng
Trc ht ta cn download th vin OpenCV v my tnh, tt hn l lun download bn mi nht ti a ch http://sourceforge.net/projects/opencvlibrary/ . Chn bn build sn ph hp vi h iu hnh ang dng, bn OpenCV c s dng trong cun sch ny l bn 2.4.3 vi ln update cui cng l vo ngy 25 thng 12 nm 2012. Sau khi download v my, tin hnh ci t bnh thng, ta mc nh th mc ci t l C:\ th mc ci t xong s c dng C:\opencv. Tip theo ta s tin hnh ty chnh c th lm vic vi OpenCV qua hai IDE thng dng l Microsoft Visual Studio v Eclipse CDT
chng trnh c th chy c vi th vin OpenCV ta cn ty chnh li mt s thuc tnh ca project nh sau Vo Project -> Properties (hoc nhn t hp phm Alt + F7) m hp thoi Properties. Hp thoi opencv Property Pages hin ra, trong mc Configuration Properties chn VC++ Directories, tng ng bn phi, ta tm mc Include Directories v Library Directories. Ta s ch ng dn hai th mc ny n cc phn tng ng ca th vin OpenCV. Mc Include Directories, ta ty chnh bn phi ti C:\opencv\build\include Mc Library Directories tr n th mc C:\opencv\build\x86\vc10\lib nu nh ta s dng h iu hnh 32bit hoc C:\opencv\build\x64\vc10\lib cho h iu hnh 64bit.
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 8
Ng
uy
Project mi c to ra l project hon ton trng, ta phi thm vo t nht mt file ngun chng trnh c th chy c, trong Solution Explorer ta click chut phi vo Source Files, chn Add -> New Item Hp thoi Add New Item hin ra, ta chn kiu cn thm vo l C++ File(.cpp) ng thi trong Name ta t tn cho file thm vo, gi s l FirstApp.cpp. By gi trong file ny ta c th thm vo cc #include v gi hm main() chy chng trnh.
nV n
Lo
ng
Cui cng, khi dch xong mt chng trnh, n c th chy c ta cn ch ti cc file *.dll. Cch n gin nht l ta copy cc file *.dll tng ng (nh opencv_core243d.dll, opencv_imgproc243d.dll) vo th mc cha file chy ca chng trnh (file *.exe). Cc file *.dll ny nm trong mc C:\opencv\build\x86\bin vi win 32 bit hoc C:\opencv\build\x64\bin vi win 64 bit. Vi cc phin bn OpenCV c hn, t a cn copy lun file tbb_debug.dll (trong ch debug) hoc tbb.dll (trong ch release) vo th mc cha file *.exe. tbb.dll (Thread building block) l file kh quan trng, thiu n chng trnh s bo li.
Ng
uy
Sau khi hon t t vic ch dn th mc cha header, library v link ti cc library tng ng, ta c th include cc header ca opencv vo chng trnh v c th gi cc hm lm vic ca OpenCV.
<opencv2/core/core.hpp> <opencv2/imgproc/imgproc.hpp> <opencv2/highgui/highgui.hpp> <iostream>
nV n
Ch l cc lib thm vo s tng ng vi cc header ta khai bo trong chng trnh, v ty thuc vo mc ch s dng m ta c th thm vo cc lib cc nhau, gi s ta cn s dng ti cc hm v video, khi ta thm header #include <opencv2/video/video.hpp> th trong phn Additional Dependencies ta phi khai bo thm opencv_video243d.lib. Ch d ng cui cc file trn th hin ta ang hot ng ch debug, ta c th thm cc lib khng c ch d cui nh opencv_core243.lib trong ch release. Tuy nhin khi ang cn h c tp v cn nhiu chnh sa ta nn ch debug.
Lo
ng
Page 9
Tip theo, trong hp thoi opencv Property Pages -> Configuration Properties -> Linker chn Input, tng ng bn phi, thm vo cc gi tr cho mc Additional Dependencies l opencv_core243d.lib, opencv_imgproc243d.lib, opencv_highgui243d.lib.
Vi Eclipse CDT
Ng
uy
Page 10
nV n
Khi ng Eclipse, T ca s Eclipse chn New -> C++ Project , hp thoi C++ Project xut hin, trong hp thoi ta chn Project name l opencv, Project type l Hello World C++ Project (C th chn l Empty Project), Toolchains l MinGW GCC, Chn Finish v ta c mt Project mi. By gi ty chnh cho project ny hot ng c v i OpenCV. Trong ca s ca Eclipse chn Project >Properties, ca s Properties hin ra. Tron ca s Properties chn C/C++ Build->Settings. Trong tab Tool Settings. phn GCC C++ Compiller chn Include ri dn ng dn ti mc Include c a OpenCV l C:\opencv\build\include. Trong phn MinGW C++ Linker chn Library v chn cc mc nh sau: click vo du cng Library search path (-L) v dn ti th mc lib: C:\opencv\build\x86\mingw\lib i vi Windows 32 bit hoc C:\opencv\build\x64\mingw\lib i vi Windows 64 bit. Tip click vo du "cng" thm Library(-I) vo, cc library cn thm ln lt l: opencv_core243, opencv_highgui243, opencv_imgproc243 ... ni chung l ty vo nhu cu s dng c th thm mt hoc nhiu lib vo.
Lo
ng
Ta cng cn phi copy cc *.dll tng ng vo th mc cha file chy *.execa chng trnh chng trnh c th chy thnh cng.
Ng
uy
Page 11
nV n
Lo
ng
Trong bi ny ta s tm hiu mt v d u tin nh mt chng trnh Hello world load v hin th mt nh. Chng trnh nh sau:
Ng
Nh ni trn, trong Opencv vi giao din C++, tt c cc kiu d liu nh, ma trn iu c lu dng cv::Mat. Hm imread s c nh u vo v lu vo bin img. Nguyn mu ca hm ny nh sau: cv::Mat imread(const std::string &filename, int flags) trong , filename l ng dn ti file nh, nu file nh khng nm trong th mc lm vic hin hnh th ta phi ch ra ng dn tng i dng nh D:\Anh\vietnam.jpg hoc D://Anh//Vietnam.jpg. Flags l tham s loi nh m ta mun load vo, c th nu nu mun load nh mu th ta CV_LOAD_IMAGE_COLOR, nu l nh xm th ta CV_LOAD_IMAGE_GRAYSCALE Sau khi load nh thnh cng, mun hin th nh ln mn hnh ta phi to ra mt ca s, hm namedWindow(const std::string &winname, int flags) s to ra ca s vi tiu ca s l mt chui string winname. Tham s flags s ch ra kiu ca s mun to: nu tham s CV_WINDOW_AUTOSIZE c s dng th kch c ca s to ra s c hin th mt cch t ng ty thuc vo kch thc ca nh, nu l tham s CV_WINDOW_AUTOSIZE_FULLSCREEN kch thc ca s s kht vi mn hnh my tnh Cui cng, hm imshow(const std::string &winname, cv::InputArray Mat) s hin th nh ra ca s c to ra trc . Hm waitKey(int delay) s i cho n khi c mt phm c bm vo trong khong thi gian l delay. Ch l nu khng c hm ny th chng trnh sau khi ch y s khng dng li mn hnh v kt thc lun, ta dung hm ny mc ch l dng mn hnh li
Tc gi: Nguyn Vn Long long.06clc@gmail.com
uy
nV n
int main() { cout<<"Chuong trinh dau tien"<<endl; Mat img = imread("vietnam.jpg", CV_LOAD_IMAGE_COLOR); namedWindow("Viet Nam", CV_WINDOW_AUTOSIZE); imshow("Viet Nam", img); waitKey(0); return 0; }
Lo
Page 12
ng
2. Khng gian mu, chuyn i gia cc khng gian mu Khn gian mu l mt m hnh ton hc dng m t cc mu sc trong thc t c biu din di dng s hc. Trn thc t c rt nhiu khng gian mu khc nhau c m hnh s dng vo nhng mc ch khc nhau. Trong bi ny ta s tm hiu qua v ba khng gian mu c bn hay c nhc ti v ng dng nhiu, l h khng gian mu RGB, HSV v CMYK. Khng gian mu RGB RGB l khng gian mu rt ph bin c dng trong ha my tnh v nhiu thit b k thut s khc. tng chnh ca khng gian mu ny l s kt hp ca 3 mu sc c bn : mu (R, Red), xanh lc (G, Green) v xanh l (B, Blue) m t tt c cc mu sc khc. Nu nh mt nh s c m ha bng 24bit, ngha l 8bit cho knh R, 8bi t cho knh G, 8bit cho knh B, th m knh ny mu ny s nhn gi tr t 0-255. Vi mi gi tr khc nhau ca cc knh mu kt hp vi nhau ta s c mt mu khc nhau, nh vy ta s c tng cng 255x255x255 = 1.66 triu mu sc.
Tc gi: Nguyn Vn Long long.06clc@gmail.com
Ng
uy
nV n
Lo
Page 13
ng
trong mt khong thi gian bng tham s delay (tnh theo n v millisecond). Nu mun dng mn hnh li mi mi ta t tham s delay bng 0. V sau y l kt qu chng trnh chay:
Ng
Khng gian mu HSV. HSV v cng gn tng t nh HSL l khng gian mu c dng nhiu trong vic ch nh sa nh, phn tch nh v mt phn ca lnh vc th gic my tnh. H khng gian n y da sau m t mu sc vo 3 thng s H = Hue: mu sc, S = Saturation: m c, s bo ha, V = value: gi tr cng sng. Khng gian mu ny thng c biu din di dng hnh tr hoc hnh nn . Theo ,
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 14
uy
Nguyn l lm vic ca h mu ny nh sau : Trn mt nn giy trng, khi mi mu ny c in ln s loi b dn i thnh phn mu trng. 3 mu C, M, Y khc nhau in theo nhng t l khc nhau s loi b i thnh phn mt cch khc nhau v cui cng cho ta mu sc cn in. Khi cn in mu en, thay v ph i in c 3 mu ngi ta dng mu en in ln. Nguyn l ny khc vi nguyn l lm vic ca h RGB ch h RGB l s kt hp ca cc thnh phn mu, cn h CMYK l s loi b ln nhau ca cc thnh phn mu.
nV n
CMYK l khng gian mu c s dng ph bin trong ngnh cng nghip in n. tng c bn ca h khng gian ny l dng 4 mu sc c bn phc v cho vic pha trn mc in. Trn thc t, ngi ta dng 3 mu l C=Cyan: xanh l, M=Magenta: hng xm, v Y=Yellow: vng biu din cc mu sc khc nhau. Nu ly mu hng xm cng vi vng s ra mu , mu xm kt hp vi xanh l s cho xanh lam ... S kt hp ca 3 mu trn s cho ra mu en, tuy nhin mu en y khn phi l en tuyt i v thng c tng phn ln, nn trong ngnh in, tit kim mc in ngi ta thm vo mu en in nhng chi tit c mu en thay v ph i kt hp 3 mu sc trn. V nh vy ta c h mu CMYK. ch K y l k hiu mu en (Black), c nh ch B c dng biu din mu Blue nn ngi ta ly ch ci cui K biu din mu en?
Lo
ng
V d: mu en l s kt hp ca cc knh mu (R, G, B) vi gi tr tng ng (0, 0, 0) mu trng c gi tr (255, 255, 255), mu vng c gi tr (255, 255, 0), mu tm m c gi tr (64, 0, 128) ...Nu ta dng 16bit m ha mt knh mu (48bit cho ton b 3 knh mu) th di mu s tri rng ln ti 3*2^16 = ... Mt con s rt ln.
Ng
Chuyn i RGB sang CMYK v ngc li. Nh ni trn, thnh phn K l thnh phn ph dng in cho nhng im mu c mu en trong h CYMK, do vy chuyn khng gian mu t RGB sang CMYK trc ht ta chuyn RGB sang CMY sau tm thnh phn K cn li. C ng thc chuyn t RGB sang CMY: (C', M', Y') = ((255 - R), (255 - G), (255 - B)). Vic tnh gi tr ca K li l mt vn khc v n lin quan ti nh sn xut cng ngh in, tuy nhin v mt l thuyt c th chp nhn rng K = min {C/2,55, M/2,55, Y'/2,55} , nh vy 0<= K <=100. Nu K = 100, th C = M = Y =0 (trng hp in mu en) Nu 0< K < 100: C = (C/2.55 - K) * 100 /(100 - K), M = (M'/2.55 - K) * 100 /(100 - K), Y = (Y'/2.55 - K) *100 /(100 - K) v K = K. Trong , C, M, Y, K c lm trn ti ly ch s nguyn. Chuyn i RGB sang HSV v ngc li Gi s ta c mt im mu c gi tr trong h RGB l (R, G, B). ta chuyn sang khng gian HSV nh sau: t M = Max(R, G, B), m = Min(R, G, B) v C = M - m. Nu M = R, H = (G - B)/C mod 6. Nu M = G, H' = (B - R)/C + 2. Nu M = B, H = (R G)/C + 4. V H = H'x60. Trong trng hp C = 0, H = 00 V = M.
Tc gi: Nguyn Vn Long long.06clc@gmail.com
uy
nV n
Lo
ng
Page 15
i theo vng trn t 0 -360 l trng biu din mu sc(Hue). Trng ny bt u t mu u tin (red primary) ti mu xanh lc u tin (green primary) nm trong khong 0-120 , t 120 - 240 l mu xanh lc ti xanh l (green primary - blue primary). T 240 - 360 l t mu en ti li mu .
Trong OpenCV, cc khng gian mu c c chuyn i qua li nh hm cvtColor (convert color), nguyn mu hm ny nh sau: cv::cvtColor(cv::InputArray src, cv::OutputArray dst, int code) Trong , src, dst l nh gc v nh thu c sau khi chuyn i khng gian mu. code m m chuyn i khng gian mu. OpenCV nh ngha kh nhi u chuyn i gia cc khng gian mu chng hn nh code = CV_BGR2GRAY s chuyn nh khng gian mu RGB sang nh xm, code = CV_HSV2BGR s chuyn nh khng gian mu HSV sang khng gian mu RGB
#include #include #include #include "stdafx.h" <opencv2/core/core.hpp> <opencv2/imgproc/imgproc.hpp> <opencv2/highgui/highgui.hpp>
Ng
void main() { Mat src = imread("LucBinh.jpg", CV_LOAD_IMAGE_COLOR); Mat gray, hsv, ycrcb; cvtColor(src, gray, CV_BGR2GRAY); cvtColor(src, hsv, CV_BGR2HSV); cvtColor(src, ycrcb, CV_BGR2YCrCb); imshow("src", src); imshow("gray", gray); imshow("hsv", hsv); imshow("ycrcb", ycrcb); waitKey(0); Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 16
uy
nV n
0 1 2 3 4 5
Lo
ng
S = C/V. Trong trng hp V hoc C bng 0, S = 0. chuyn t HSV sang RGB ta lm nh sau: Gi s ta c khng gian mu HSV vi H = [0, 360], S = [0, 1], V = [0, 1]. Khi , ta tnh C = VxS. H' = H/60. X = C(1 - |H' mod2 -1|). Ta biu din h (R1, G1, B1) nh sau:
Ng
Trong bi ny ta s tm hiu v cu trc ca mt bc nh, cch tip cn v iu chnh ti tng im nh. Mt nh s c lu tr trn my tnh l mt ma trn cc im nh (hay pixel). Trong OpenCV n c biu din di dng cv::Mat. Ta xt mt kiu nh thng thng nht, l nh RGB. Vi nh ny, mi pixel nh quan st c l s kt hp ca cc thnh phn mu R (Red), Green (Green) v Blue (Blue). S kt hp ny theo nhng t l R, G, B khc nhau s to ra v s cc mu sc khc nhau. Gi s nh c m ha bng 8 bit vi tng knh mu, khi mi gi tr ca R, G, B s nm trong khong [0, 255]. Nh vy ta c th biu din ti 255*255*255 ~ 1.6 triu mu sc t ba mu c bn trn. Ta c th xem cch biu din nh trong OpenCV nh dng cv::Mat qua hnh nh sau:
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 17
uy
nV n
Lo
ng
0, 0 1, 0 2, 0 n, 0
0, 0 1, 0 2, 0 n, 0
0, 0 1, 0 2, 0 n, 0
0, 1 1, 1 2, 1 N, 1
0, 1 1, 1 2, 1 n, 1
0, 1 1, 1 2, 1 n, 1
0, m 1, m 2, m n, m
Ng
int main() { cout<<"Chuong trinh dieu chinh do sang va tuong phan"<<endl; Mat src = imread("hoa_huong_duong.jpg", 1); Mat dst = src.clone(); double alpha = 2.0; int beta = 30; for(int i = 0; i < src.rows; i++) for(int j = 0; j < src.cols; j++) for(int k = 0; k < 3; k++) Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 18
uy
nV n
Nh vy, mi nh s c n hng v m ct, m gi l chiu di ca nh (width) v n gi l chiu cao ca nh (heigh). Mi pixel v tr (i,j) trong nh s tng ng vi 3 knh mu kt hp trong n. truy xut ti tng pixel nh vi nhng knh mu ring r ta s dng mu sau: img.at<cv::Vec3b>(i,j)[k] Trong , i ,j l pixel hng th i v ct th j, img l nh m ta cn truy xut ti cc pixel ca n. cv::Vec3b l kiu vector uchar 3 thnh phn, dung biu th 3 knh mu tng ng. k l knh mu th k, k = 0, 1, 2 tng ng vi knh mu B, G, R. Ch l trong OpenCV, h mu RGB c biu din theo th t ch ci l BGR. Sau y ta s p dng kin thc trn lm tng, gim sang v tng phn ca mt nh mu, vic lm ny cng hon ton tng t i vi nh xm, ch khc bit l nh ta dung mt knh duy nht biu din nh xm. Chng trnh tng, gi m sng v tng phn ca mt nh Gi s f l mt hm biu din cho mt nh no , f(x,y) l gi tr ca pixel trong nh v tr (x,y). t g(x,y) = f(x,y) + . Khi , nu 1, th ta ni nh g(x,y) c tng phn gp ln so vi nh f(x,y). Nu 0ta ni sng ca nh g(x,y) thay i mt lng l . Da vo cng thc trn ta c chng trnh thay i sng v tng phn ca nh nh sau:
Lo
ng
0, m 1, m 2, m n, m 0, m 1, m 2, m n, m
Ct 0
Ct 1
Ct m
Trong chng trnh trn, hm clone() s sao chp mt nh ging ht nh nd gc cho vo nh ch (dst = src.clone()). Gi tr ca cc pixel nh f(x,y) v g(x,y) y phi nm trong khong [0, 255], trong khi php bin i g(x,y) = f(x,y) + c th khin cho gi tr ca g(x,y) vt qua ngng . trnh tnh trng trn s hoc kiu d liu khng tng thch, ta dng thm hm saturate_cast<uchar>(type). Hm ny s bin kiu d liu type nu khng phi l uchar thnh kiu d liu uchar Sau y l kt qu chng trnh v i gi tr = 2.0 v = 30
Ng
nh nh phn l nh m gi tr ca cc im nh ch c biu din bng hai gi tr 0 hoc 255 tng ng vi hai mu en hoc trng. Nh phn ha mt nh l qu trnh bin mt nh xm thnh nh nh phn. Gi f(x,y) l gi tr cng sng ca mt im nh v tr (x,y), T l ngng nh nh phn. Khi , nh xm f s c chuyn thnh nh nh phn da vo cng thc f(x,y) = 0 nu f(x,y) T v f(x,y) = 255 nu f(x,y) > T Hnh sau m t mt nh nh phn vi ngng nh phn T = 100
uy
nV n
Page 19
Lo
ng
dst.at<Vec3b>(i,j)[k] = saturate_cast<uchar>( alpha*(src.at<Vec3b>(i,j)[k] ) + beta); imshow("anh goc", src); imshow("anh co sau khi chinh do tuong phan va do sang", dst); waitKey(0); return 0;
nh xm
uy Ng
T = 50
nV n
T = 100
Hm chuyn nh phn ha nh trong OpenCV l hm threshold(). Nguyn mu hm nh sau: threshold(cv::InputArray src, cv::OutputArray dst, double thresh, int maxval, int type) Trong , src l nh u vo mt knh mu (nh xm ), dst l nh sau khi c nh phn ha, thresh l ngng nh phn, maxval l gi tr ln nht trong nh (maxval = 255 i vi nh xm), type l kiu nh phn c th l CV_THRESH_BINARY, CV_THRESH_BINARY_INV, CV_THRESH_OTSU ln lt l nh phn ha thng thng, nh phn ha ngc v nh phn ha theo thut ton Otsu Kt qu ca vic nh phn ha mt nh ph thuc vo ngng T, c ngha l v i mi ngng T khc nhau th ta c nhng nh nh phn khc nhau. Hnh sau m t 3 nh nh phn tng ng vi ngng T = 50, T = 100 v T = 150.
thu c mt nh nh phn tt m khng cn phi quan tm ti cc iu kin nh sng khc nhau (khng cn quan tm ti ngng T), ngi ta dng mt k thut sao cho vi mi ngng xm khc nhau ta lun thu c mt nh nhi phn tt. K thut gi l k
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 20
Lo
nh nh phn
ng
T = 150
Vng nh nh phn thu c trn l vng nh c nh phn vi ngng l trung bnh cng ca tt c cc trong ca s T = (55 + 10 + 100 + )/25 = 65.6. Chng trnh nh phn ha vi ngng ng nh sau
// Adaptive Threshold #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <iostream>
Ng
int main() { cout<<"Nhi phan anh voi nguong dong"<<endl; Mat src = imread("Thap_But.jpg", CV_LOAD_IMAGE_GRAYSCALE); Mat dst; adaptiveThreshold(src, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 35, 5); imshow("Anh xam goc", src); imshow("Anh nhi phan voi nguong dong", dst); waitKey(0); Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 21
uy
nV n
Lo
thut nh phn ha vi ngng ng (Dymamic threshold) hay nh phn thch nghi (Adaptive threshold) C nhiu phng php khc khc nhau thc hin vic ny, tuy nhin chng u da trn tng chnh l chia nh ra thnh nhng vng nh, vi mi vng p dng vic nh phn cho vng vi nhng ngng nh phn khc nhau.Cc ngng nh phn cc vng c tnh ton da trn ln mc xm ca chnh cc pixel trn vng . Gi s ta tnh ton ngng cho mt vng no da trn trung bnh ca cc pixel trong vng (ta c th xem mt vng l mt ca s). Ta xt qu trnh nh phn vi ngng ng trong mt vng ca s 5x5:
ng
return 1;
Trong chng trnh trn, hm thc hin vic nh phn ha vi nh ng l hm adaptiveThreshold, Nguyn mu ca hm nh xau:
cv::adaptiveThreshold(cv::InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
Ng
uy
nV n
nh xm
Lo
nh nh phn
Trong , src l nh xm cn nh phn, dst l nh kt qu thu c, maxValue l gi tr ln nht trong nh xm (thng thng l 255), adaptiveMethod l cch thc nh phn vi ngng ng, n chnh l cch tnh gi tr ngng nh phn trong tng vng cn nh phn, thresholdType nh ni trn, blockSize l kch thc ca s p dng cho vic tnh ton ngng ng, v C l mt thng s b tr trong trng hp nh c tng phn qu ln. Kt qu khi chy chng trnh nh sau:
ng
Page 22
5. Histogram, cn bng histogram trong nh Histogram ca mt nh l mt biu ni ln mi quan h gia cc gi tr ca pixel nh (im nh) v tn sut xut hin ca chng. Nhn vo biu histogram ta c th on c mt nh sng ti nh th no. Nu mt nh c histogram lch v pha phi biu , ta ni nh tha sng. Nu lch v pha tri th nh thiu sng. Hnh bn m t histogram ca mt nh xm, nh ny c histogram lch v pha tri ca biu v do nh ny l kh ti. i vi nh mu, ta c th tnh ton histogram cho tng knh mu mt. Sau y l chng trnh tnh v v biu histogram ca mt nh mu.
#include <iostream> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> using namespace std; using namespace cv;
int main() { std::cout<<"Tim histogram anh mau"<<std::endl; Mat src = imread("buoi.jpg"); vector<Mat> img_rgb; Mat img_r, img_g, img_b; int w = 400, h = 400; int size_hist = 255; float range[] = {0, 255}; const float* hist_range = {range};
Ng
uy
split(src, img_rgb); calcHist(&img_rgb[0], 1, 0, Mat(), img_b, 1, &size_hist, &hist_range, true, false); calcHist(&img_rgb[1], 1, 0, Mat(), img_g, 1, &size_hist, &hist_range, true, false); calcHist(&img_rgb[2], 1, 0, Mat(), img_r, 1, &size_hist, &hist_range, true, false); int bin = cvRound((double)w/size_hist); Mat disp_r(w, h, CV_8UC3, Scalar( 255,255,255) ); Mat disp_g = disp_r.clone(); Mat disp_b = disp_r.clone(); normalize(img_b, img_r, 0, disp_b.rows, NORM_MINMAX, -1, Mat() ); normalize(img_g, img_g, 0, disp_g.rows, NORM_MINMAX, -1, Mat() ); normalize(img_r, img_b, 0, disp_r.rows, NORM_MINMAX, -1, Mat() );
nV n
Page 23
Lo
ng
cv::waitKey(0); return 1;
Ng
uy
Page 24
nV n
Trong chng trnh trn, u tin nh c a vo l mt nh mu, tnh histogram ca tng knh mu mt ta s phn tch nh ny thnh 3 knh mu ring r theo th t l Blue, Green v Red. Hm cv::split(const cv::Mat src, cv::Mat *mvbegin) s tch thnh src thnh cc knh mu tng ng lu trong mvbegin. Hm cv:: calcHist(const cv::Mat *images, int nimages, const int *channels, cv::InputArray mask, cv::OutputArray hist, int dims, const int histSize, const float **ranges, bool uniform = true, bool accumulate = false) s tnh histogram ca nh u vo images v lu kt qu tnh ton vo mng hist. Cc thng s khc bao gm: nimages l s lng nh u vo, channels l danh sch chiu cc knh dung tnh histogram, mask l mt mt n ty chnh, nu khng dung g th l cv::Mat(). dims l chiu ca histogram, bn OpenCV hin ti h tr tnh ton histogram vi s chiu ln ti 32. histSize l kch thc dy histogram mi chiu, hai tham s cui c th mc nh, Sau y l kt qu chng trnh
Lo
for( int i = 1; i < 255; i++ ) { line(disp_r, Point(bin*(i), h), Point(bin*(i), h - cvRound(img_r.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0 ); line(disp_g, Point(bin*(i), h), Point(bin*(i), h - cvRound(img_g.at<float>(i))), Scalar( 0, 255, 0), 2, 8, 0 ); line(disp_b, Point( bin*(i), h), Point(bin*(i), h - cvRound(img_b.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0 ); } namedWindow("src", 0); imshow("src", src); imshow("Histogram of Blue chennel", disp_b); imshow("Histogram of Green chennel", disp_g); imshow("Histogram of Red chennel", disp_r);
ng
Mat src = imread("src.jpeg", CV_LOAD_IMAGE_GRAYSCALE); // Load anh xam imshow("Anh xam goc", src); Mat dst; equalizeHist(src, dst); imshow("anh xam sau khi can bang histogram", dst);
Ng
Ta c kt qu sau:
uy
i vi nh xm, ta c th xem nh n l mt knh mu, do vy tnh histogram ca nh xm ta cng c th lm hon ton tng t bng cch gi hm caclHist() Cn bng histogram Cn bng histogram (histogram equalization) l phng php lm cho biu histogram ca nh c phn b mt cch ng u. y l mt bin i kh quan trng gip nng cao cht lng nh, thng thng y l bc tin x l ca mt nh u vo cho cc bc tip theo. cn bng histogram, ta dung hm equalizeHist(cv::InputArray src, cv::OuputArray dst) trong , src l nh u vo mt knh mu (nh xm chn hn), dst l nh sau khi cn bng. V d:
nV n
Lo
Page 25
ng
#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <iostream> using namespace std; using namespace cv;
int main() { cout<<"Chuong trinh can bang histogram"<<endl; Mat src = imread("Cho_Ben_Thanh.jpg", CV_LOAD_IMAGE_COLOR); Mat hsv, disp; cvtColor(src, hsv, CV_BGR2HSV); vector<Mat> hsv_channels; // Tach hsv thanh 3 kenh mau split(hsv, hsv_channels); // Can bang histogram kenh mau v (value) equalizeHist(hsv_channels[2], hsv_channels[2]); // Tron anh merge(hsv_channels, hsv); // Chuyen doi hsv sang rgb de hien thi cvtColor(hsv, disp, CV_HSV2BGR); imshow("anh mau goc", src); imshow("anh mau sau khi can bang histogram", disp); waitKey(0);
Ng
uy
nV n
cn bng histogram ca mt nh mu, trc ht ta chuyn nh mu dng RGB sang HSV, sau cn bng thnh phn knh mu V (Value tc sng) v bin i ngc li. Chng trnh sau cn b ng histogram ca nh mu
Lo
ng
Nh ni trn, nh s thc cht l mt ma trn cc im nh, do c th phng to, thu nh hay xoay mt tm nh ta c th s dng cc thut ton tng ng trn ma trn. Ta s s dng bin i affine quay v thay i t l to, nh ca mt ma trn. Bin i affine:
Gi s ta c vector = [ , ] v ma trn M 2x2. Php bin i affine trong khng gian hai chiu c th c nh ngha p = Mp trong = [ , ] . Vit mt cch tng minh ta c: =
Hay x = x + y, y = x + y . Xt ma trn =
thay i t l ca ma trn. Nu l trong nh n s phng to hoc thu nh nh. Hnh sau m t php bin i vi t l = = 2
Ng
uy
nV n
Lo
Page 27
ng
cos ( ) sin ( )
Ng
int main() { Mat src = imread("HoaSen.jpg"); Mat dst = src.clone(); double angle = 45.0; Page 28
uy
nV n
= . cos () sin ( )
Lo
ng
Mat mat_rot = getRotationMatrix2D(center, angle, scale); warpAffine(src, dst, mat_rot, src.size()); imshow("Anh goc", src); imshow("Anh sau phep bien doi", dst); waitKey(0); } return 1;
Trong chng trnh trn, hm cv::getRotationMatrix2D(cv::Point center, double angle, double scale) s to ra ma trn vi tm quay center, gc quay angle v t l scale. Ma trn ny c tnh ton trong Opencv l ma trn nh sau:
V i
Ta thy rng ma trn ny l hon hon tng ng vi ma trn ca php bin i affine n i trn, ngoi tr thnh phn th 3 l thnh phn gip dch chuyn tm quay vo chnh gia ca bc nh. Ch l c s khc bit mt cht v chiu ca h ta trong nh, h ta trong nh ly gc trn bn tri lm gc ta (0,0) cn h ta thng thng ta hay ly im di bn tri lm gc, do c s ngc chiu. Kt qu ca chng trnh trn v i t l scale = 1.5 v gc quay = 450 nh hnh sau
. cos (
Ng
Ngoi hai php bin i l t l v quay nh trn, ta c th thc hin cc bin i khc ca php bin i affine nh php trt (shearing), hoc php phn chiu (reflection) bng
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 29
uy
nV n
= ) v = . sin ( )
(1 ). . . . . (1 ).
Lo
. .
ng
double I[2][3] = {1,0.5,0, 0,1,0}; // cac phan tu cua ma tran Mat mat_rot(2,3,CV_64F, I); // khoi tao ma tran warpAffine(src, dst, mat_rot, src.size());
v ta c kt qu:
Ng
Lc s trong nh c ngha quan trng trong vic to ra cc hiu ng trong nh, mt s hiu ng nh s dng cc b lc nh lm m nh(Blur), lm trn nh(Smooth) Nguyn tc chung ca phng php lc nh l cho nh nhn chp vi mt ma trn lc, Idst = M*Isrc
Page 30
uy
7. Lc s trong nh
nV n
1 0.5 0 trt nh 0 1 0 ban u thnh nh mi vi h s trt 0 = 0.5, ch l thnh ph n th ba 0 nh ngha ma tr n trong Opencv s th hin d dch chuyn, ging nh trong v d trn ta chuyn tm quay v tm ca bc nh chng hn. Ta s lm ging ht v d trn, ch thay ma trn M l ma trn ta t nh ngha
Lo
trn
= =
ta s nh ngha ma
ng
vic nh ngha li ma trn M. Ta th nh ngha li ma trn M c mt nh trt ca nh gc. Quay li ma trn M nh trn, nu ta nh ngha = = 1 cn nh n mt gi tr bt k, khi ta s c:
nV n
+1 +2 +1 1 0 +1 2 0 +2 1 0 +1 ( , )=
= nhn chp pixel (2,2)
uy
Trong , ta ang tnh php nhn chp cho im nh c ta (x,y) v v ta ly tm ca ma trn lc l im gc nn u chy t -n (im bn tri) v v chy t -n (im pha trn) n n, vi n = (kch thc mt n - 1)/2. d hiu hn ta xt mt v d v vic lm trn nh s dng mt ma trn lc nh sau: 100 100 100 100 100 100 200 205 203 100 100 100 100 100 100 100 144 205 203 100 100 195 200 200 100 100 200 205 195 100 100 100 100 100 100
1/9 1/9 1/9 * 100 195 200 200 100 1/9 1/9 1/9 100 200 205 195 100
Ng
Lo
1 4 7 4 1 4 16 26 16 4 7 26 41 26 7 4 16 26 16 4 1 4 7 4 1 ( , )
Kch thc ca ma trn thng l mt s l chng hn 3x3, 5x5 Khi , tm ca ma trn s nm giao ca hai ng cho v l im p t ln nh m ta cn tnh nhn chp. Tng cc phn t trong ma trn thng thng bng 1. Nu tng ny ln hn 1, nh qua php lc s c sng ln hn nh ban u. Ngc li nh thu c s ti hn nh ban u.
ng
( , )
Page 31
Isrc, Idst l nh gc v nh sau khi thc hin php lc nh bng cch nhn vi ma trn lc M. Ma trn M i khi cn g i l mt n (mask), nhn (kernel). Vi mi php lc ta c nhng ma trn lc M khc nhau, khng c quy nh c th no cho vic xc nh M, tuy nhin ma trn ny c mt s c im nh sau:
100 100 100 100 100 1/9 1/9 1/9 100 200 205 203 100 1/9 1/9 1/9 * 100 195 200 200 100 1/9 1/9 1/9 100 200 205 195 100 100 100 100 100 100
V kt qu cui cng ta c:
100 100 100 100 100 1/9 1/9 1/9 100 200 205 203 100 1/9 1/9 1/9 * 100 195 200 200 100 1/9 1/9 1/9 100 200 205 195 100 100 100 100 100 100
Ta thy rng, nh ban u vi l nh c tng phn kh ln (cc gi tr ln pixel chnh lch ln: 100, 200, ), sau php lc nh c tng phn gin i hay b lm m i(lc ny chnh lch gi tr gia cc pixel gim i: 100, 144, 167 ). Sau y ta s xem xt mt s b lc trong OpenCV.
Ng
uy
Lc Blur:
nV n
= nhn chp
Lo
100 100 100 100 100 100 144 167 203 100 100 195 200 200 100 100 200 205 195 100 100 100 100 100 100
100 100 100 100 100 100 144 167 145 100 100 167 200 168 100 100 144 166 144 100 100 100 100 100 100
ng
Page 32
B lc ny c tc dng lm trn nh, kh nhiu ht. Hm ci t trong OpenCV c dng: cv::blur(const Mat& src, const Mat& dst, Size ksize, Point anchor, int borderType) trog , src v dst l nh gc v nh sau php lc. ksize l kch thc ma trn lc, ksize = Size(rows, cols), anchor l im neo ca ma trn lc, nu mc nh l (1,-1) th im ny chnh l tm ca ma trn. borderType l phng php c lng v cn chnh cc im nh nu qua php lc chng b vt ra khi gii hn ca nh. Thng thng gi tr mc nh ca n l 4. nh qua php lc blur
uy Ng
1 2 1
Lc Sobel: Lc sobel chnh l cch tnh xp x o hm bc nht theo hng x v y, n cng chnh l cch tnh gradient trong nh. B lc ny thng thng c p dng cho mc ch tm bin trong nh. Ma trn lc theo cc hng x, y ln lt nh sau: 0 0 0 +1 +2 +1 1 0 +1 2 0 +2 1 0 +1
Trong OpeCV, hm ci t php lc ny nh sau: cv::Sobel(const Mat& src, Mat& dst, int ddepth, int xorder, int yorder, int ksize, double scale, double delta, int borderType) Trong , src v dst l nh gc v nh qua php lc. ddepth l su ca nh sau php lc, c th l CV_32F, CV_64F . xoder v yoder l cc o hm theo
Page 33
nV n
Lo
ng
1 1 . . 1
1 1 . . 1
. . . . .
. 1 . 1 . . . . . 1
Lc Laplace: Lc Laplace l cch tnh xp x o hm bc hai trong nh, n c ngha quan trng trong vic tm bin nh v phn tch, c lng chuyn ng ca vt th. = = +
Ng
uy
0 1 0 1 4 1 0 1 0 Trong OpenCV, b lc ny c ci t qua hm: cv::Laplacian(const Mat& src, Mat& dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType) Cc thng s ny c ngha ging nh cc thng s trong b lc Sobel, ch khc ch ksize l mt gi tr int mc nh bng 1 v khi ma trn lc laplace trn c p dng. nh qua php lc Laplace:
nV n
Lo
Page 34
ng
hng x v y, tnh o hm theo hng no ta t gi tr ln 1, ngc li nu gi tr bng 0, hm ci t s b qua khng tnh theo hng . Scale v delta l hai thng s ty chn cho vic tnh gi tr o hm la gi tr vi sai vo nh sau php lc, chng c gi tr mc nh l 1 v 0. borderType l tham s nh trn. nh qua php lc Sobel:
filter2D(const Mat& src, Mat& dst, int ddepth, const Mat& kernel, Point anchor, double delta, int borderType). Trong , src v dst l nh gc v nh thu c qua php lc, kernel l ma trn lc. Thng s anchor ch ra tm ca ma trn, delta iu chnh sng ca nh sau php lc (nh sau php lc c cng vi delta v borderType l kiu xc nh nhng pixel nm ngoi vng nh. Hm cv::filter2D thc cht l hm tnh ton nhn chp gia nh gc v ma trn lc cho ra nh cui sau php lc. Nh vy qua trn ta thy rng tin hnh vic lc nh ta ch cn nh ngha mt ma trn lc kernel. C rt nhiu nghin cu v ton hc nh ngha cc ma trn ny, do vic p dng vo lc nh s l kh n gin. Chng trnh demo phng php l c nh. Chng trnh sau s thc hin mt s b lc nh do chnh ta nh ngha, chng hn ta c 1 1 0 ma trn lc = 1 0 1 , ma trn ny l ma trn s lm ni bt nh ging nh 0 1 1 nh khc 3D, ta s p dng ma trn ny lc mt nh.
#include #include #include #include "stdafx.h" <opencv2\core\core.hpp> <opencv2\imgproc\imgproc.hpp> <opencv2\highgui\highgui.hpp>
Ng
uy
nV n
Ngoi 3 b lc trn, OpenCV cn ci t kh nhiu b lc khc nh lc trung v (medianBlur), lc Gause (gaussianBlur), pyrDown, pyrUp Tuy nhin, ta hon ton c th ci t b lc cho ring mnh thng qua hm cv::filter2D. Nguyn mu hm ny nh sau:
Lo
ng
Page 35
Ng
uy
1 = 1 1 1 7 1 1 1 , 1 =0
nV n
Page 36
Lo
void main() { Mat src = imread("HoaDao.jpg", CV_LOAD_IMAGE_COLOR); Mat dst; double m[3][3] = { -1, -1, 0, -1, 0, 1, 0, 1, 1 }; Mat M = cv::Mat(3,3,CV_64F, m, Point(-1,-1), 128.0); cv::filter2D(src, dst, src.depth(), M); imshow("Anh goc", src); imshow("Anh qua phep loc", dst); cv::waitKey(0); }
ng
1 = 1 1
1 8 1
1 1 , 1
Cc php ton hnh thi hc l nhng php ton lin quan ti cu trc hnh hc (hay topo) ca cc i tng trong nh. Cc php ton hnh thi hc tiu biu bao gm php gin n (dialation) php co (erosion), php m (opening) v php ng (closing).
Ng
Php ton gin n c nh ngha = trong , A l i tng trong nh, B l mt cu trc phn t nh. Php ton ny c tc dng lm cho i tng ban u trong nh tng ln v kch thc (gin n ra)
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 37
uy
nV n
=0
Lo
ng
1 = 1 1
1 8 1
1 1 , 1
Ta hy xt mt nh vi i tng trong nh c biu din bng mu nn nu, sau dng cu trc phn t hnh vung (mu ) lm gin n nh, kt qu l nh c gin n ra v phn gin n ra ta nh du l du x.
x x x
ng dng ca php gin n l lm cho i tng trong nh c tng ln v kch thc, cc l nh trong nh c lp y, ni lin ng bin nh i vi nhng on ri nh Php ton co (erosion)
Ng
Php ton co trong nh c nh ngha = { |( ) } trong A l i tng trong nh, B l cu trc phn t nh. Ta cng s xt mt v d nh trn vi php co trong nh. i tng trong nh c biu din bi mu xm, cu trc phn t nh l khi c vin mu , x l im sau php tha mn php co nh, 0 l im khng tha mn.
uy
nV n
x
Page 38
Lo
ng
Cu trc phn t nh (image structuring element) l mt hnh khi c nh ngha sn nhm tng tc vi nh xem n c tha mn mt s tnh cht no khng, mt s cu trc phn t hay gp l cu trc theo khi hnh vung v hnh ch thp
Ta thy rng sau php ton ny i tng trong nh b co li, chnh v vy m n c ng dng trong vic gim kch thc ca i tng, tch ri cc i tng gn nhau v lm mnh, tm xng i tng. Php ton m (opening) v ng (closing) l s kt h ca php co (erosion) v gin (dialation) nh trn, chng c nh ngha nh sau: Php ton m : Php ton ng: =( )
Php ton ng c ng dng trong vic lm trn ng bao i tng, lp y cc khong trng trn bin v loi b nhng h nh (mt s pixel ng thnh cm c lp) Trong OpenCV, cc php ton hnh thi hc trong nh c ci t trong hm cv::morphologyEx, ring php gin n v php co c th gi trc tip t hm cv::dilate v cv::erode: morphologyEx(const Mat& src, Mat& dst, int op, const Mat& element, Point anchor, int iterations, int borderType, const Scalar& borderValue)
Ng
uy
Php ton m c ng dng trong vic loi b cc phn li lm v lm cho ng bao i tng trong nh tr ln mt m hn.
nV n
=( )
Lo
Page 39
ng
dilate(const Mat& src, Mat& dst, const Mat& element, Point anchor=Point(-1, -1), int iterations, int borderType, const Scalar& borderValue) Mt iu cn ch l tri vi cch din t v cc php hnh thi nh trn, OpenCV c cch ci t ngc li gia i tng v nn nh, ngha l trong php gi n n (dilate), phn c gin n l nn ca nh (background) ch khng phi cc i tng vt th trong nh, iu cng c ngha rng php gin n s lm co li cc i tng vt th trong nh v php co (erode) s lm co nn ca nh ng thi gin n cc i tng vt th trong nh. Sau y ta s xt mt v d v vic s dng cc php ton hnh thi trong nh trong vic pht hin bin s xe t v cch ly cc k t trong bin s. Gi s ta c mt nh cha bin s, v bin s c nn trng v k t mu en, nn trc tin ta nh phn nh , sau tm ng bao ca cc i tng (contour) t xc nh c xem nhng ng bao no c kh nng l bin s xe nht da trn t l cc cnh chiu di, rng ca hnh ch nht bao quanh ng bao (d nhin y l m t cch tip cn rt n gin!). Tuy nhin, ta ch xc nh c ng bao quanh i tng khi tp cc im nm trn bin ca n to thnh mt vng kn. Trong nhiu trng hp ca bin s, vic b mt mt vi im nh trong qu trnh nh phn trn bin l chuyn thng xuyn xy ra v do s kh xc nh c mt ng bao quanh bin s. khc phc
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 40
Ng
uy
nV n
Php ton v gin n v co c th c gi t hm cv::morphologyEx thng qua hai i s op l MORPH_DILATE v MORPH_ERODE hoc chng c th c gi trc tip t hm cv::dilate v cv::erode, Cu trc ca hai hm ny l tng t nhau v cc tham s hon ton ging vi tham s trong hm morphologyEx:
Lo
Trong , src, dst l nh u vo v nh sau php x l hnh thi hc. op l kiu la chn php hnh thi hc, chng hn nh php gin n l MORPH_DILATE, php ng l MORPH_OPEN . element l cu trc phn t nh, c ba cu trc c bn l theo khi hnh vung, hnh ch thp v hnh elip. to ra cc cu trc ny ta c th t nh ngha mt ma trn vi cc hnh khi tng ng hoc s dng hm getStructuringElement, hm ny c cu trc nh sau: getStructuringElement(int shape, Size ksize, Point anchor), vi shape l kiu hnh khi (mt trong 3 hnh khi trn), ksize l kch thc ca hnh khi v l khch thc ca hai s nguyn l, anchor l im neo v thng thng nhn gi tr l ((ksize.width 1)/2, (ksize.height 1)/2). Thng s tip theo anchor c ng c ngha tng t. iterations l s ln lp li ca php ton hnh thi v hai thng s cui cng l v gii hn bin ca nhng im nh nm ngoi kch thc nh trong qu trnh tnh ton, n c ngha nh cc v d trong bi trc.
ng
Ng
uy
vector<vector<Point> > contours1; findContours(binary, contours1, CV_RETR_LIST, CV_CHAIN_APPROX_NONE ); for(size_t i = 0; i < contours1.size(); i++) { Rect r = boundingRect(contours1[i]); if(r.width/(double)r.height > 3.5f && r.width/(double)r.height < 4.5f) rectangle(src1, r, Scalar(0, 0, 255), 2, 8, 0); else rectangle(src1, r, Scalar(0, 255, 0), 1, 8, 0); } imshow("Ket qua phat hien truoc phep gian no", src1); vector<vector<Point> > contours2; findContours(morpho, contours2, CV_RETR_LIST, CV_CHAIN_APPROX_NONE ); for(size_t i = 0; i < contours2.size(); i++) { Rect r = boundingRect(contours2[i]); if(r.width/(double)r.height > 3.5f && r.width/(double)r.height < 4.5f) rectangle(src2, r, Scalar(0, 0, 255), 2, 8, 0); else rectangle(src2, r, Scalar(0, 255, 0), 1, 8, 0); } Page 41
nV n
void main() { Mat src1 = imread("BienSo.jpg", CV_LOAD_IMAGE_COLOR); Mat src2 = src1.clone(); // copy anh Mat gray, binary; cvtColor(src1, gray, CV_BGR2GRAY); threshold(gray, binary, 100, 255, CV_THRESH_BINARY); imshow("Anh nhi phan goc", binary); Mat morpho; Mat element = getStructuringElement(MORPH_CROSS, Size(3,3), Point(1,1)); erode(binary, morpho, element, Point(-1,-1), 3); imshow("Anh sau khi thuc hien phep gian no", morpho);
Lo
ng
tnh trng ny, ta s lm gin n ng bin (iu s tng ng vi vic gi hm erode lm co li nn nh) cc im nh trn bin tr ln lin ln.
imshow("Ket qua phat hien sau khi phep gian no", src2); } waitKey(0);
Trong chng trnh trn, ta l n lt thc hin tm bin vi hai nh nh phn, mt nh nh phn thng thng v mt nh nh phn c lm gin n thng qua hm erode. Hm findContours s tm ng bao quanh ca cc i tng c nh nhp ha v lu ng bao ny vo mt vector l cc im nm trn ng bao , hm boundingRect s tm ra mt hnh ch nht bao mt tp im ca mt ng bao c tm ra t hm findContours. Da vo t l kch thc chiu di/rng ca hnh ch nht ny ta c th xem xt liu ng bao m ta tm c c phi l mt vng ca bin s hay khng, nu phi ta s v hnh ch nht ny thng qua hm rectangle vi mt mu khc (Scalar(0, 0, 255) : mu ) v nt m hn. Kt qu chy chng trnh nh sau
Ng
Ta thy rng, im t trong nh c ni lin nh s gin n ca bin cnh bin s (s co li ca nn nh) nn ta tm c mt hnh bao khp kn quanh bin s, tuy nhin ta cng nh n thy rng khi cc i tng vt th trong nh gin n ra, cc k t s c xu hng dnh vo nhau v vic tch cc k t ra l kh khn, chng hn trn hnh do c inh vit gi m s 2 v s 9 gn nh ni lin. y l lc ta cn thc hin vic co li ca cc i tng (s gin n ca nn nh), v do bn c hon ton c th ci t tch ra cc k t ny.
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 42
uy
nV n
Lo
ng
B lc Canny l s kt hp ca nhiu bc khc nhau tm v ti u ng bin, kt qu l cho ra mt ng bin kh mnh v chnh xc. Qu trnh tm bin s dng phng php canny c th c thc hin qua 4 bc sau: Bc 1: Loi bt nhiu trong nh.
Ngi ta loi nhiu trong nh, lm cho nh m i bng cch nhn chp nh vi mt b lc Gause, chng hn b lc Gaus 5x5 vi h s = 1.4: 2 4 1 = 5 159 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2
V ng bin trong nh l ni phn cch gia cc i tng khc nhau, nn ti gradient ca n s bin i mnh m nht. tnh ton gradient trong nh, ta c th s dng b lc Sobel, hoc trc tip nhp chp ma trn nh vi cc m n theo hng x v y 1 0 +1 1 2 1 chng hn = 2 0 +2 , = 0 0 0 1 0 +1 +1 +2 +1 Sau tnh ln gradient trong nh : = + v =
Trong , Gx, Gy chnh l o hm theo hng X, Y ca im nh ta ang xt. Gc s c lm trn theo cc hng thng ng, nm ngang v hng cho, ngha l n s c lm trn nhn cc gi tr 0, 45, 90 v 135 . Bc 3: Loi b cc gi tr khng phi l cc i Bc ny s tm ra nhng im nh c kh nng l bin nh nht bng cch loi b i nhng gi tr khng phi l cc i trong bc tm gradient nh trn. Ta thy rng, vi gi tr ca gc trn th bin ca i tng c th tun theo bn hng, v ta c bn kh nng sau:
Ng
uy
nV n
Lo
ng
Page 43
Sau bc trn, ta thu c tp cc im tng ng trn ng bin kh mng. V nhng im c gi tr gradient ln bao gi cng c xc sut l bin tht s hn nhng im c gi tr gradient b, o xc nh chnh xc hn na bin ca cc i tng, ta s dng cc ngng. Theo , b lc canny s s dng mt ngng trn (upper threshold) v mt ngng di (lower threshold), nu gradient ti mt im trong nh c gi tr ln hn ngng trn th ta xc nhn l mt im bin trong nh, nu gi tr ny b hn ngng di th khng phi im bin. Trong trng hp gi tr gradient nm gia ngng trn v ngng di th n ch c tnh l im trn bin khi cc im lin kt bn cnh ca n c gi tr gradient ln hn ngng trn. Tm bin nh bng b lc canny trong OpenCV: OpenCV cung cp mt hm cho ta xc nh bin trong nh ca cc i tng. Nguyn mu ca hm ny nh sau : canny(Mat src, Mat dst, int lower_threshold, int upper_threshold, int kernel_size)
Ng
Trong , src l nh cn pht hin bin (l nh xm), dst l nh cha bin c pht hin, lower_threshold, upper_threshold l ngng di, ngng trn nh ni bn trn, kernel_size l kch thc ca mt n dng cho bc th hai tnh ton gradient ca cc im trong nh. Chng trnh demo tm bin trong nh da trn b lc canny:
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 44
uy
nV n
4. Nu = 00, khi , im A s c xem l mt im trn bin nu ln gradient ti A ln hn ln gradient ca cc im ti A3, A7 . 5. Nu = 450, khi , im A s c xem l mt im trn bin nu ln gradient ti A ln hn ln gradient ca cc im ti A4, A8 6. Nu = 900, khi , im A s c xem l mt im trn bin nu ln gradient ti A ln hn ln gradient ca cc im ti A1, A5 . 7. Nu = 1350, khi , im A s c xem l mt im trn bin nu ln gradient ti A ln hn ln gradient ca cc im ti A2, A6
Lo
ng
Trong chng trnh trn, trc khi tm bin bng phng php canny ta lm trn mt nh xm bng b lc GaussianBlur (vic lm ny c rt ln trong vic gim thiu cc tiu tit khng mong mun trong ng bin sau ny). V nguyn tc, b lc GaussianBlur cng l m t b lc s nh gii thiu bi trc v lc s trong nh, cu trc ca hm GaussianBlur nh sau: cv::GaussianBlur(cv::InputArray src, cv::OutputArray dst, cv::Size ksize, double sigmaX, double sigmaY = 0, int borderType = 4), trong src v dst s l cc mng d liu u vo v kt qu. Mt nh cng c th coi l mt mng d liu, o src v dst chnh l nh u v nh thu c sau khi bin i, ksize l kch thc ca ma trn lc, sigmaX, sigmaY l lch chun theo hng x v y. Nu sigmaY = 0, lch chun theo hng y s c ly theo sigmaX. BorderType l cch ni suy bin i vi nhng im nh trn ra ngoi kch thc ca nh. Kt qu thu c sau cc ngng t1, t2 khc nhau, ta c nhng bin c chi tit khc nhau nh hnh sau.
Ng
uy
nV n
void main() { Mat gray = cv::imread("TuoiTho.jpg", CV_LOAD_IMAGE_GRAYSCALE); Mat dst1, dst2; imshow("Anh xam", gray); GaussianBlur(gray, gray, Size(9,9), 2); double t1 = 30, t2 = 200; Canny(gray, dst1, t1, t2, 3, false); t1 = 100; t2 = 120; Canny(gray, dst2, t1, t2, 3, false); imshow("Bien trong anh voi nguong 1", dst1); imshow("Bien trong anh voi nguong 2", dst2); waitKey(0); }
Lo
Page 45
ng
Ng
Chuyn i Hough (Hough transformation) l mt phng php c dng nhiu trong phn tch v x l nh, mc ch chnh ca phng php ny l tm ra nh ng hnh dng c trng trong nh bng cch chuyn i khng gian nh ban u sang mt khng gian ca cc tham s nhm n gin qu trnh tnh ton, trong bi ny ta xt chuyn i Hough cho ng thng v ng trn.
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 46
uy
nV n
Lo
ng
Ta bit rng, mt ng thng trong khng gian hai chiu c th c biu din di dng y = kx + m v cp h s gc k, gi tr m c th c chn lm c trng cho mt ng thng. Tuy nhin, cch biu din theo cp (k, m) kh tha mn vi nhng ng thng thng ng khi m h s gc l mt s v cng. trnh trng hp ny, ta s biu din ng thng trong h ta cc. Phng trnh ng thng trong h ta cc c dng nh sau: = ( )+ ( )
Trong , r l khong cch t gc ta O ti ng thng, l gc cc. Nh vy, vi mi im (x0, y0) ta c mt h cc ng thng i qua tha mn phng trnh ( )+ ( ) =
Phng trnh ny biu din mt ng cong, nh vy trong mt tm nh c n im (n pixel) ta s c n cc ng cong. Nu ng cong ca cc im khc nhau giao nhau, th cc im ny cng thuc v mt ng thng. Bng cch tnh cc giao im ny, ta s xc nh c ng thng, l ni dung tng ca thut ton Hough cho ng thng. Chuyn i Hough cho ng trn
Chuyn i Hough cho ng trn cng tng t nh vi ng thng, phng trnh ng trn c xc nh bi: = = + +
Ng
Trong , (u,v) l tm ng trn, R l bn knh ng trn, l gc c gi tr t 0 ti 360 . Mt ng trn s hon ton c xc nh nu ta bit c b ba thng s (u,v,R). T phng trnh trn ta c th chuyn i tng ng = =
uy
nV n
Lo
Page 47
ng
tm ng thng trong nh, th vin OpenCV c h tr hm cv::HoughLines v cv::HoughLinesP, hai hm ny v c bn u thc hin mt thut ton, nhng a ra kt qu hai dng khc nhau. Dng 1: a ra kt qu ca ng thng l mt cp gi tr (r, )
cv::HoughLines(src, lines, rho, theta, threshold, param) Trong , src l nh nh phn cha bin ca cc i tng cn c pht hin ng thng (trong thc t ta c th s dng l mt nh xm), lines l vector cha kt qu u ra ca (r, ) c pht hin, rho l phn gii ca r (tnh theo pixel, thc cht l bc tng nh nht ca r tnh ton), theta l phn gii ca gc (c gi tr t 0 ti 360 ), threshold l gi tr nh nht ca tng cc giao im ca cc ng cong xc nh ng thng, param l mt thng s mc nh ca OpenCV cha s dng n (n c gi tr bng 0) Dng 2: a ra kt qu l ta im u v im cui ca ng thng cv::HoughLinesP(src, lines, rho, theta, threshold, minLenght, maxGap)
Ng
cv::HougCircles(src, circles, method, dp, min_dist, param1, param2, min_radius, max_radius) Trong , src c th l mt nh nh phn cha bin ca i tng hoc nh xm (chng trnh s t ng d bin bng phng php canny), circles l vector cha kt qu pht
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 48
uy
Trong , cc thng s src, rho, theta, threshold ging nh dng 1, lines l vector cha ta im u v ta im cui ca ng thng pht hin c (x1, y1, x2, y2), minLength l di nh nht c th xem n l mt ng thng (tnh theo n v pixel), maxGap l khong cch ln nht ca hai im cnh nhau xc nh chng c thuc v mt ng thng hay khng (tnh theo n v pixel)
nV n
Lo
ng
Ta xt vi trng hp bit trc gi tr ca R. Khi , vi mi im nh (x,y) ta s xc nh c mt gi tr (u,v) v lu n vo mt mng. Tm ca ng trn s l gi tr xut hin trong mng vi tn sut ln nht. Trong trng hp R cha bit, ta tng gi tr ca R t mt ngng min ti ngng max no v tin hnh nh vi trng hp bit trc gi tr R
Trong :
void main() { Mat src = imread("DongHo.jpg", 1); Mat gray; cvtColor(src, gray, CV_BGR2GRAY); GaussianBlur(gray, gray, Size(9, 9), 2, 2 );
Ng
uy
// Tim duong thang Mat canny; Canny(gray, canny, 100, 200, 3, false); vector<Vec4i> lines; HoughLinesP(canny, lines, 1, CV_PI/180, 50, 60, 10); // Tim duong tron vector<Vec3f> circles; HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 100, 200, 100, 0, 0); // Ve duong thang, duong tron len anh for(int i = 0; i < lines.size(); i++ ) { Vec4i l = lines[i]; line(src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 2); } Page 49
nV n
Lo
hin ng trn vi 3 tham s (a, b, R), method l phng php pht hin ng trn (hin ti phng php trong OpenCV l CV_HOUGH_GRADIENT), dp l t s nghch o ca phn gii (p dng trong phng php hin ti), min_dist l khong cch nh nht gia hai tm ng trn pht hin c, param1, param2 l cc thng s ngng trn v ngng di phc v cho vic pht hin bin bng phng php canny, min_radius v max_radius l gii hn nh nht, ln nht ca bn knh ng trn ta cn pht hin(Nu ta khng bin bn knh, mc nh hai gi tr ny bng khng th chng trnh s ln tng gi tr bn knh mt cch t ng tm ra tt c cc ng trn trong nh).
ng
Ng
uy
Page 50
nV n
Trong chng trnh trn, u tin nh c ti vo mt bin src, sau c chuyn i qua nh xm gray v c lm trn i nh hm GaussianBlur. i vi vic pht hin ng thng, ta cn pht hin ra tp cc im bin ca i tng, do vy ta s dng hm canny cho ra nh nh phn cha tp cc im bin. Trong trng hp pht hin ng trn, hm HoughCircles ng m tm bin cho ra thng thng qua hai ngng t sn (trong chng trnh trn l 200 v 100) v do ta khng c n phi thc hin vic ny. Kt qu thu c c v ln nh gc nh hnh sau.
Lo
imshow("Anh sau khi tim thay duong thang - Duong tron", src); waitKey(0);
ng
for(int i = 0; i < circles.size(); i++ ) { Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); // Tam int radius = cvRound(circles[i][2]); // Ban kinh circle(src, center, radius, Scalar(0,0,255), 2, 8, 0 ); }
Khi ng Visual Studio, t menu chn File -> New - > Project (hoc nhn Ctrl + Shift + N). Hp thoi New Project hin ra, hn Visual C++ (c th s phi chn mc Other langguge trc khi hin ra Visual C++) sau chn MFC Application. Ta t tn cho project trong trng Name (gi s tn l xyz) sau click OK n bc tip theo. bc tip theo, tip tc chn Next ta c hp thoi sau
Ng
uy
Page 51
nV n
Lo
MFC (Microsoft Foundation Classes) l b th vin c Microsoft pht trin phc v cho vic lp trnh trn Window. Bn cht ca th vin ny l cung cp cho ta cc lp, cc cng lm vic vi cc hm API ca Window, do vy vic lp trnh tr nn n gin hn rt nhiu. Trong phn ny v phn sau, cc v d v ng dng s c to ra nh vo giao din Dialog ca MFC. Vic nghin cu mt cch y v bi bn v MFC l mt vic cn u t v thi gian v cng sc. Trong khun kh cun sch ny, ta ch i xem xt mt phn nh v cc th thut lm vic nhanh nht c vi MFC.
ng
Application type chn Dialog based, Project type chn MFC standard Ch rng vic tick vo chn Use Unicode libraries s c nhng ngha v cch dng khc nhau, ta s xt trng hp ny sau. Ta nhn next i ti hp thoi tip theo, hp thoi ny cho php ta ty chnh mt s chc nng ca ca s nh c thm nt phng to, thu nh, menu c th mc nh v chn next
Ng
uy
Page 52
nV n
Lo
ng
Ta nhn Next i ti ty chnh tip mt s ty chn nng cao, nu cha hiu r ta c th mc nh v nhn Next. Hp thoi cui cng xut hin yu cu ta chn MFC khi to lp. Ta chn l CxyzDlg v nhn Finish
Ng
uy
Page 53
nV n
Lo
ng
n y ta kh i to xong mt project MFC c da trn nn Dialog, Dialog hin ra mc inh c mt button OK, button Cancel v mt label, ta c th s dng hoc xa i v thit k theo ring ca mnh. 3. Lm vic vi cc iu khin (Control) ca MFC t tn bin cho cc control Khi mun s dng mt Control no, ta ko control t Toolbox v cho vo dialog. lm vic vi cc control mt cch d dng, ta n t tn bin cho cc control. t tn bin cho mt control, ta click chut phi vo control, sau chn Add Variable. Mt hp thoi Add Member Variable Wizard hin ra v trong mc variable name ta t tn cho control . Ch l i vi cc control m ID ca n c dng IDC_STATIC (nh Static Text) th ta ch c th t tn bin c khi i
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 54
Ng
uy
nV n
Lo
ng
Ly gi tr nhp vo t mt Edit Control ly gi trn nhp vo t mt Edit Control, ta s dng hm GetWindowText(). Gi s nh Edit Control c t tn l text_box, khi ta c th ly gi tr text trong Edit Control nh sau:
CString text; text_box.GetWindowTextW(text);
Ta c th ty chnh trnh dch build theo ch Unicode hoc Multi-byte bng cch vo Project -> Properties (hoc nhn Alt + F7), hp thoi Properties hin ra, chn Configuration Properties -> General v ty chnh mc Character Set.
Ng
Hin th text ln cc control hin th text ln cc control (Button, Edit control, Static Text ..), ta dng hm SetWindowText(CString text)
text_box.SetWindowTextW(_T("text")); // Unicode text_box.SetWindowTextA("text"); // Multi-byte Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 55
uy
Gi tr ly c s c lu trong mt chui CString text. Mt im cn ch t gi v sau l cc hm trong MFC khi c build ch Unicode v ch Multi-byte th cc gi cc hm, cch s dng cc hm cng c nhng im khc nhau nho nh, chng hn nh cng l l y gi tr trong mt Edit Control nhng nu ch Multi-byte ta s dng lnh sau:
nV n
Lo
ng
text_box.EnableWindow(flase); // Vo hieu hoa edit control text_box.EnableWindow(true); // Cho phep edit control hoat dong
Ly gi tr la chn t Combo Box Combo box cho php ta la chn, chuyn i gia cc la chn mt cch nhanh chng. thm cc la chn vo Combo Box ta c th in trc tip vo mc Data trong properties ca n, (gi s ta c cc la chn v tnh thnh Vit Nam nh HaNoi, ThanhHoa, DaNang ta s click chut phi vo Combo box, chn properties, trong bng properties mc Data ta in vo HaNoi;ThanhHoa;DaNang cc la chn c phn cch bi du ";" ). xem la chn no ang c chn, ta dng hm GetCurSel(). int choice = combo_box.GetCurSel(); Gi tr tr v l th t cc d liu trong mc Data ca Combo box Dialog m file v lu file Mc ch ca loi dialog ny l to ra mt hp thoi cho php ngi dng chn n ng dn m file v lu file. Kt qu cui cng m ta quan tm nht l ly c ng dn m ngi dng la chn.
CString Filter=_T("image files (*.bmp; *.jpg) |*.bmp;*.jpg|All Files (*.*)|*.*||"); CFileDialog dlg(TRUE, _T("*.jpg"), NULL, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,Filter,NULL);// Mo file CFileDialog dlg(FALSE, _T("*.jpg"), NULL, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,Filter,NULL);// Luu file
Ng
Filter s lc v ch hin th nhng file tng ng m ta cn quan tm, trong trng hp trn ta ang xt m hoc lu mt file nh do ta file m rng l bmp hoc jpg. Nu mun hin th tt c cc loi file ta ch vic filter l *.*, hp thoi m file v lu file
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 56
uy
nV n
Ly gi tr t thanh trt (Slider Control) Gi s thanh trt c t tn l slider, khi ta c th ly gi tr hin ti ca thanh trt bng hm GetPos() : int value = slider.GetPos(); Ta cng c th dng hm SetRange t gi tr ln nht v b nht cho thanh trt, v dng hm SetPos t v tr cho thanh trt:
Lo
Enable, disable mt control Ta s dng hm EnableWindow cho php control c c php s dng hay khng
ng
Hin th nh ln mt control hin th nh ln mt control, ta dng hm SetBitmap(). on code sau load mt nh bitmap t D v hin th ln mt button c tn l btn:
X l s kin khi thay i la chn Combo Box S kin thay i la chn ca Combo Box l CBN_SELENDOK. on code sau m t s thay i la chn ca ngi dng trn Combo Box, vi mi la chn ta sinh ra mt Message Box tng ng.
void CxyzDlg::OnCbnSelendokCombo1() { int index = combo_box.GetCurSel(); switch(index) { case 0: MessageBoxA(NULL, "Ban chon HaNoi", "Thong bao", 0); break; case 1: MessageBoxA(NULL, "Ban chon ThanhHoa", "Thong bao", 0); break; Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 57
Ng
uy
nV n
X l s kin khi click chut vo button Hu ht cc control trong MFC u c mt hoc nhiu s kin khi ngi dng tng tc vi n, chng hn s kin click chut vo button, s kin ko thanh trt ca slider control x l cc s kin cho cc control, trong mc properties ca control tng ng ta chn vo icon s kin sau chn cc s kin cn x l. Chng hn i vi button, ta chn BN_CLICKED ri chn OnBnClickedButton1, khi ta s c mt hm c t ng sinh ra v ta c th x l cc vn lin quan ti s kin click chut. Hm sau s sinh ra mt Message Box khi click vo button1
Lo
ng
ch khc nhau thng s u tin khi to i tng dlg, nu l m file ta t l TRUE, lu file ta t l FALSE. Ta hin th hp thoi ny v ly ng dn ngi dng chn nh sau:
Ng
uy
Page 58
nV n
Thm menu vo chng trnh, x l s kin khi click vo menu Menu trong MFC c xem l resource ca chng trnh . Vic thm menu vo dialog i hi ta phi thm n vo resource ca chng trnh. Tr c ht ta hin th ca s xem cc resource ca chng trnh b ng cch t menu ca Visual Studio chn View -> Resource View (hoc nhn t hp phm Ctrl + Shift + E). Ca s Resource View hin ra, ta click chut phi vo , chn Add->Resource Ca s Add Resource hin ra, ta chn Menu v click vo button New. Ngay sau ta s c mt resource cha menu chng, ta tin hnh in tn cc menu m ta mun chng trnh th c hin. Hnh bn ta in 3 menu chc nng nh l Open, Save v Exit Khi t o xong menu, n vn ch nm trong resource ca chng trnh, mu n menu ny c gn vo dialog khi chy, ta vo properties ca dilog, trong mc Menu chn IDR_MENU1, vi IDR_MENU1 chnh l ID ca menu ta va to ra. x l s kin click chut ca menu no, ta click chut phi vo mune y v chn Add Event Handler
Lo
ng
case 2: MessageBoxA(NULL, "Ban chon DaNang", "Thong bao", 0); break; default: MessageBoxA(NULL, "Khong chon?", "Thong bao", 0); break; }
hp thoi Event Handler Wizard ta chn lp m ta mun thm menu vo sau click vo button Add and Edit i ti hm x l s kin khi click vo menu, v d sau l ta gi hm OnCancel() thot khi chng trnh
void CxyzDlg::OnUpdateFileExit(CCmdUI *pCmdUI) { OnCancel(); }
Ngoi mt s iu khin thng dng nh c ti trn, MFC cn cung cp rt nhiu cc iu khin khc gip cho vic to ra giao din mt cch d dng v p mt hn. Bn c tham kho thm cc ti liu khc v phn ny. 4. Chuyn i cc kiu d liu trong MFC
Ng
Cc kiu d liu ca MFC v c bn l ging vi cc kiu d liu trong C, tuy nhin c mt s trng hp ta phi chuyn i qua li gia cc kiu d liu ph hp vi u vo, u ra ca mt vic no , chng hn khi ta dng CFileDialog m mt ng dn sau c nh t ng dn ny, kt qu tr v ng dn ca CFileDialog l mt chui CString tuy nhin hm cv::imread li c nh t mt chui string, do ta phi
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 59
uy
nV n
Lo
ng
Chuyn i string sang CString v ngc li Vi ch bin dch khng s dng Unicode, ta c th chuyn i hai kiu d liu ny d dng:
std::string str = "chuoi string"; CString cstr = str.c_str();
vi ch bin dch c s dng Unicode: 10. Chuyn t string sang CString: 11. Chuyn t CString sang string
std::string str = "chuoi string"; CStringW cstr = (CStringW)(str.c_str()); CString cstr = _T("chuoi cstring"); std::wstring wstr = (std::wstring)cstr; std::string str; str.assign(wstr.begin(), wstr.end());
Chuyn i s sang CString v ngc li Cch chuyn i ny gip ta ly s liu di dng s ca cc Edit Control hoc hin th s ln cc control. 12. Chuyn i CString sang s
Ng
uy
13. Chuyn s sang CString
CString cstr1 = "123"; int num1 = atoi(cstr1); // Chuyen sang so nguyen khong su dung Unicode int num1 = _wtoi(cstr1); // Chuyen sang so nguyen su dung Unicode CString cstr2 = "10.5"; float num2 = atof(cstr2) // Chuyen sang so thuc khong su dung Unicode float num2 = _wtof(cstr2) // Chuyen sang so thuc su dung Unicode char s1[20]; int num = 10; sprintf(s1, "%d", num); CString cstr1 = s1; // chuyen so nguyen sang cstring - khong unicode CString cstr2; cstr2.Format(_T("%d"), num); // chuyen so nguyen sang cstring unicode Tng t vi s thc ta c th chuyn i tng t v thay "%d" bng "%f".
nV n
Lo
Page 60
ng
chuyn i t CString sang string. Mt s chuyn i sau y l hu ch cho vic hin th giao din, v ly d liu t giao din ngi dng.
Ta to mt mi mt project, t tn project l HienThiThongTinAnh v thit k giao din nh hnh sau: Group Box Picture control
Labels Label
Trong , cc Labels hin th thng tin ca nh chnh l Static Text, ID IDC_STATIC ca chng c i v chng c t tn bin l l_width, l_height, l_channels, l_path (i vi cc static text dng hin th kt qu). ID ca Picture Control c i thnh IDC_STATIC_PICTURE. By gi, ta s tin hnh x l s kin cho cc button Tai Anh, Thong Tin v Thoat
void CHienThiThongTinAnhDlg::OnBnClickedButton1() { // Load anh va hien thi anh
Ng
uy
static CString Filter=_T("image files (*.bmp; *.jpg) |*.bmp;*.jpg|All Files(*.*)|*.*||"); CFileDialog Load(TRUE, _T("*.jpg"), NULL, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,Filter,NULL); Load.m_ofn.lpstrTitle= _T("Load Image"); if (Load.DoModal() == IDOK) { path = Load.GetPathName(); std::string filename(path); src = cv::imread(filename,1); cv::namedWindow("Hien thi anh", 1); HWND hWnd = (HWND) cvGetWindowHandle("Hien thi anh"); HWND hParent = ::GetParent(hWnd); ::SetParent(hWnd, GetDlgItem(IDC_STATIC_PICTURE)->m_hWnd); Page 61
nV n
Button
Lo
ng
} }
void CHienThiThongTinAnhDlg::OnBnClickedButton2() { // Hien thi thong tin anh if(src.empty()) MessageBoxA("Chua tai anh", "Thong bao", 0); else { int width_ = src.cols; int height_ = src.rows; int channels_ = src.channels(); CString result; result.Format("%d", width_); l_width.SetWindowTextA(result);
Ng
Trong hm trn, u tin ta kim tra xem nh c ti bc trn hay cha, nu cha th hin ra thng bo cha ti c nh, nu t i c nh ri th tnh ton chiu di, chiu rng, knh mu ca nh sau hin th thng tin ny ln cc label tng ng. hin ln label hoc bt k mt iu khin no ca MFC ta dng thuc tnh
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 62
uy
}
nV n
Trong hm trn hm cvGetWindowHandle() tr v mt HWND ca ca s hin th nh trong OpenCV, sau hm SetParent() s t ca s ny vo iu khin Picture Control ca MFC, y l cch ta dng hin th mt nh ln bt k mt control no ca MFC thay v phi chuyn i nh sang HBITMAP v dng hm SetBitmap. Hm cv::resize() gip chuyn t mt nh bt k v nh c kch thc 320x240 gip hin th trn trong kch thc ca Picture Control. Cui cng, khi gi hm cv::imshow() trong OpenCV, ta s thy nh c hin th trong Picture Control.
Lo
ng
::ShowWindow(hParent, SW_HIDE); // resize va hien thi anh cv::Mat dst; cv::resize(src, dst, cv::Size(320, 240), 0, 0, 1); cv::imshow("Hien thi anh", dst);
Ng
uy
Page 63
nV n
Lo
ng
SetWindowText(). Tuy nhin i s u vo ca hm ny li c nh dng CString, do vy cc gi tr nh int, float, double .. mun hin th c trn cc iu khin ca MFC ta phi chuyn i kiu d liu nh ni trn. button Thoat, khi click vo vo chng trnh s thot ra, vic thot khi chng trnh l rt n gin, c th t c bng cch gi hm OnCancel().
Mc ch ca bi ny l tng hp li cc kin thc v k nng c b n ca cc thut ton x l nh thong qua vic vit mt chng trnh tng c kh nng chnh sa nh tng t nh phn mm Photoshop, tuy nhin xt v mi mt th n gi n hn rt nhiu. Mt s chc nng ca phn mm m ta c th s dng chnh sa nh nh: chuyn i qua li gia cc khng gian mu(HSV, YCmCb, RGB), Tng gim sang/ tng phn, o ngc nh(nh m bn), nh phn nh, quay nh, thay i kch thc nh, cn bng histogram trong nh, lm m nh, mo nh Ngoi ra ta c th xem xt cc thng tin v nh, xem biu histogram nh v lch s chnh sa nh v xem nh trc khi ng chnh sa. Giao din chng trnh nh sau:
Ng
qun l chng trnh c n gin, ta chia chng trnh lm 3 phn, mt phn chuyn v cc hm x l nh c lu trong mt lp v t tn l ImgProcessing. Phn cho php ta xem trc kt qu x l l mt Dialog c cha cc thanh trt gip ta iu chnh cc tham s ng thi xem trc kt qu ca qu trnh x l. Phn ny c nh ngha trong l p ImgPreview. Cui cng l phn cha giao din chnh ca chng trnh l Dialog c thit k t u, ta nh ngha cc bin v x l s kin trong file My Photo EditorDlg.h v Photo EditorDlg.cpp. Ta s ln lt xem qua cc phn ny. Phn cha cc hm x l nh chnh
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 64
uy
nV n
Lo
ng
// heade file #pragma once #include <opencv2\core\core.hpp> using namespace cv; class ImgProcessing { public: ImgProcessing(void); ~ImgProcessing(void); // Ham xu ly void Grayscale(Mat&, Mat&); void ColorSpace(Mat&, Mat&, int); void Brightness(Mat&, Mat&, int); .
}
uy
nV n
Ng
if(src.channels() == 3) { for(int i = 0; i < src.rows; i++) for(int j = 0; j < src.cols; j++) for(int k = 0; k < 3; k++) dst.at<Vec3b>(i,j)[k] = saturate_cast<uchar>(src.at<Vec3b>(i,j)[k] + value); }
Lo
value); Page 65
ng
Cc hm x l trong ImgProcessing c dng void TenHam(cv::Mat &src, cv::Mat& dst, type value) trong , src l nh a vo x l, dst l nh cha kt qu v value th ty thuc vo c trng ca tng hm m c cc kiu v gi tr khc nhau. Ta nh ngha header ca lp ImgProcessing nh sau:
Cc hm khc c th ci t mt cch tng t ging nh nhiu bi trc cp. Phn xem trc kt qu chnh sa
Picture Control
Ng
V trong chng trnh c rt nhiu cc hm x l cn n vic phi xem trc kt qu v vic vi mi hm x l cn n mt dialog xem trc l rt phc tp v ta phi to ra s lng dialog ln tng ng vi lng hm x l. khc phc tnh trng ny, ta ch to ra mt dialog preview duy nht v ty thuc vo yu cu x l ca tng hm m ta
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 66
uy
thm lp vo dialog ny ta click chut phi vo dialog sau chn Add Class, hp thoi MFC Add Class Wizard hin ra, ta t tn cho class mc Class name l ImgProcessing v mc Base class ta chn l CDialogEx. Nhn Finish hon thnh qu trnh khi to lp v ta c hai file mi c thm vo, l ImgProcessing.h v ImgProcessing.cpp . Tip ta thm bin cho cc iu khin(Control) bng cch click chut phi vo cc iu khin sau chn Add Variable . Cc bin ca slider ty chn tham s c tn l silder1, slider2, slider3 , cc bin l nhn (Static text) dung t tn hin th cho slider c tn ln lt l l_disp1, l_disp2, l_disp3 v cui cng tn ca bin hin th kt qu khi ko trt slider l param1, param2, param3.
nV n
Slider Control Button
Lo
Static text
Phn ny nm trong lp ImgPreview k tha t lp CDialogEx ca MFC. to ra lp ny, cch n gin nht l thm vo project mt dialog v thm lp vo cho dialog . C th, t ca s Resource View -> My Photo Editor -> My Photo Editor.rc -> Dialog hy click chut phi v chn Insert Dialog, thit k mt dialog c dng nh sau:
ng
enum {m_brightness = 0, m_contrast = 1,m_threshold = 2, m_rotation = 3, m_size = 4, m_blur = 5, m_noise = 6, m_distort = 7, m_edge = 8};
V khi dialog Image Preview c khi to, trong hm OnInitDialog() ta, s cn c vo yu cu ca hm cn x l to ra ca s thch hp
this->slider2.EnableWindow(false); this->slider3.EnableWindow(false);
switch(type) { case m_brightness: { this->param1.SetWindowTextA("Brightness"); } break; case m_contrast: { this->param1.SetWindowTextA("Contrast"); this->slider1.SetRange(0, 100); this->slider1.SetPos(10); } .
Ng
Trong , type l l kiu x l c truyn t chng trnh chnh tng ng vi tng hm x l khc nhau. type c nh ngha trong file ImageProcessing.h l
private: int type;
uy
}
nV n
// Khoi tao cac thanh phan this->slider1.SetRange(0, 450); this->slider1.SetPos(225); this->slider2.SetRange(0, 450); this->slider2.SetPos(225); this->slider3.SetRange(0, 450); this->slider3.SetPos(225);
Lo
Page 67
ng
cho n mt kiu nht nh. Do vy ta s nh ngha mt kiu lit k cc kiu x l trong file ImpProcessing.h nh sau:
case m_contrast: { d_param1 = double(slider1.GetPos() / 10.0); l_disp1.SetWindowTextA(ToString(d_param1)); process.Contrast(img_display, img_dst, d_param1); cv::imshow("Image Preview", img_dst); } break; } }
Khi vic xem trc hon tt, nu ta ng vi kt qu v bm vo nt OK, mt bin thnh vin is_ok s c gn gi tr cho chng trnh chnh bi t rng ngi dung ng vi vic chnh sa , ngc li nu nt Cancel c bm, bin ny s c gi tr false.
void ImgPreview::OnBnClickedButton1() { // Button OK this->is_ok = true; ImgPreview::OnCancel(); }
Ng
uy
Trong , img_dst l mt nh thu nh ca nh gc, c thay i kch thc hin th ph hp trong khung hnh thng qua hm ImageDisplay()
nV n
} break;
Lo
void ImgPreview::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); switch(type) { case m_brightness: { i_param1 = slider1.GetPos() - (int)slider1.GetRangeMax()/2; l_disp1.SetWindowTextA(ToString(i_param1)); process.Brightness(img_display, img_dst, i_param1); cv::imshow("Image Preview", img_dst);
ng
Page 68
Khi thanh trt iu chnh cc thong s thay i v tr, nh phi c x l v hin th trc quan ln Picture Control. S kin thay i v tr thanh trt c ci t nh sau:
Phn ny cha giao din ngi dung trong qu trnh x l nh. N bao gm cc thao tc m file nh, thc hin cc hm x l nh nu trn, hin th cc ca s view khc nhau v la file nh sau khi hon tt x l.
x l s kin click chut cho menu, ta hy quay li phn thit k menu, click chut phi vo menu cn x l sau chn Add Event Handler. S kin click chut vo menu Open c dng nh sau:
void CMyPhotoEditorDlg::OnUpdateFileOpen1(CCmdUI *pCmdUI) { // Open Image Files static CString Filter=_T("image files (*.bmp; *.jpg) |*.bmp;*.jpg|All (*.*)|*.*||"); CFileDialog Load(TRUE, _T("*.bitmap"), NULL, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,Filter,NULL); Load.m_ofn.lpstrTitle= _T("Load Image"); if (Load.DoModal() == IDOK) { img_path = Load.GetPathName(); img_name = Load.GetFileName(); src = cv::imread(img_path); }
Ng
S kin m file nh ca nt Open cng c th c nh ngha mt cch tng t. Sau khi file nh c m, ta c th tin hnh thc hin cc php x l nh thng qua h thng menu va thit k trn. i vi cc php x l cho kt qu trc tip m khng
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 69
uy
nV n
Lo
Ta thit k giao vi h thng menu, button v cc ca s hin th nh c to ra t Picture Control nh hnh 1. Cc Control khc trong MFC l kh quen thuc, i vi h thng menu, thm vo dialog u tin ta thit k h thng menu bng cch click chut phi vo Project sau chn Add -> Resource-> Menu. Sau khi hon thnh h thng menu ta hy vo dialog chnh, mc Properties ca dialog ny chn Menu v chn ID ca menu m ta va to ra, gi s l IDR_MENU1
ng
i vi nhng menu cn xem trc kt qu th ta ch s l nh khi nh n c tham s t dialog preview, nh vy trc khi x l ta phi khi to mt dialog preview, truyn tham s cho dialog ny v nhn tham s x l. S kin ca nhng menu c dng nh sau:
Ng
Bn cnh qu trnh x l, ta thit k thm cc ca s nhn khc nm c thng tin chi tit hn v nh ang x l , l c a s cho php xem thng tin chi tit v nh (kch thc chiu di, rng, ), ca s hin th thng tin histogram nh (mt hoc nhiu knh mu) v ca s cho php xem lch s chnh sa nh. Cc ca s ny thng qua h thng menu view cho php n hot ng hay khng hot ng v ta s dng cc bin kim tra xem ca s ny c c kch hot hay khng trong cc hm x l. Nu n c kch hot (c check menu view) th sau mi hm x l ta phi cp nht thng tin cho n, nu khng th b qua bc ny, s tit kim c thi gian x l.
void CMyPhotoEditorDlg::OnUpdateViewHistogram(CCmdUI *pCmdUI)
uy
Trong on code trn, ta truyn hai tham s cho lp ImgPreview l m_threshold cho lp ny bit kiu cn x l l kiu g v src l nh gc cn c xem trc trong qu trnh x l. Hm ImageDisplay() c tc dng ty chnh kch thc hin th nh trong ph hp trong khung hnh sau hin th nh ln. Process l mt i tng ca lp ImgProcessing c khai bo trong file My Photo EditorDlg.h
nV n
void CMyPhotoEditorDlg::OnUpdateAdjustmentsThreshold(CCmdUI *pCmdUI) { // Threshold ImgPreview dlg; dlg.SetType(m_threshold); dlg.src = src; dlg.DoModal(); if(dlg.is_ok) { process.Threshold(src, src, dlg.i_param1); ImageDisplay(src); } }
Lo
ng
Page 70
cn phi xem trc kt qu (nh chuyn sang mu xm, lm ngc nh ) th s kin click chut vo menu c s l c dng nh sau:
Trong hm UpdateHistogram s tnh ton histogram v hin th histogram ca nh ln ca s, history_list l mt Edit Control s hin th lch s ca bc va thao tc . Khi qu trnh chnh sa nh hon tt ta c th lu nh li thng qua nt Save hoc menu Save. Khi lu nh, ta cho php ngi s dng c la chn cht lng nh thng qua t s nn nh. T s ny cng cao th nh nn c dung lng cng thp, tuy nhin thng tin nh c th b mt nhiu. Ngc li nu t s nn thp th nh s chi tit tuy nhin dung lng li ln. Ta thit k mt dialog SaveOption v x l s kin nh i vi lp ImgPreview
Ng
uy
nV n
Lo
Page 71
// View histogram is_histogram = !is_histogram; CMenu *m_histogram = GetMenu(); m_histogram->GetSubMenu(3); if(is_histogram) { m_histogram->CheckMenuItem(ID_VIEW_HISTOGRAM, MF_CHECKED); UpdateHistogram(0); } else { m_histogram->CheckMenuItem(ID_VIEW_HISTOGRAM, MF_UNCHECKED); cv::imshow("Histogram", hist_init); }
ng
void CMyPhotoEditorDlg::ValidateMenu() { // Kiem tra tinh hop le cua menu trong tung truong hop CMenu *m_file = GetMenu(); m_file->GetSubMenu(0); CMenu *m_image = GetMenu(); m_image->GetSubMenu(1);
Ng
uy
else { } if(is_gray)
nV n
Page 72
Lo
Mt phn na cng rt quan trng trong qu trnh x l l xc nh tnh hp l ca tng menu. Theo , h thng trnh gp nhng li pht sinh th menu ch c php s dng khi c cc i u kin c sn. Chng hn nh khi nh cha c ti vo chng trnh th ton b cc menu s n, ch c menu v nt Open v c php hot ng nu khng khi click vo bt k menu x l no h thng s gp li b nh do nh x l l nh rng. Hoc khi ang lm vic vi nh xm (grayscale) th menu chuyn i sang cc khng gian mu khc (HSV chng hn) phi b n nu khng mun chng trnh g p s c v thot ra ngoi mun. Ta xc nh tnh hp l ca h thng menu thng qua cc bin v hm ValidateMenu(). V d nh bin is_load s kin tra xem nh c ti hay cha, bin is_gray kim tra nh c phi l nh xm hay khng cc bin ny c t ngay sau cc hm tng ng ca chng :
ng
} }
Hm EnableMenuItem() l hm cho php mt menu n hoc hin th thng qua tham s MF_DISABLED hoc MF_ENABLED Hnh sau l kt qu ca qu trnh x l khi ta iu chnh sng ca mt nh.
Ng
Bi ton nhn dng bin s xe c nhiu ngha trong th c t, n gip vic gim st, qun l, thng k cc phng tin mt cch d dng, tin li v nhanh chng. Mt s ng dng in hnh c trin khai trong thc t nh ng dng trong qun l bi xe thng minh, ng dng thu ph cc trm thu ph, ng dng pht hin li vi phm giao thng mt cch t ng Trong phn ny ta nghin cu v mt k thu t ca mt bi ton nhn dng bin s xe, vit chng trnh demo v cc b c cn thit a bi ton vo ng dng thc t. Gi s ta ang xy dng bi ton nhn dng bin s xe t, vi u vo l mt nh cha bin s xe v u ra l mt chui k t ca bin s c nhn dng. Nu quan st bng mt ngi ta c th d dng nhn bit c mt bin s, tuy nhin vi my tnh, l mt iu khng d dng g, n rt d b nhiu, b nhm bi cc hnh khi xung quanh tng
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 73
uy
2. Nhn dng bin s xe
nV n
Lo
ng
Ng
uy
V bin s xe c nhng c trng c bn c quy nh bi cc c quan chc nng nn ta c th da vo c trng ny phn bit vi cc i tng khc. Theo quy nh ca b cng an, bin s xe ng trc ca cc loi xe dn dng l mt hnh ch nht, c kch thc 470x110 (mm), phng nn mu trng v cc k t ch ci in hoa mu en. Cc k t ch s bao gm t 0 ti 9 v cc k t ch s bao gm A, B, C, D, E, F, G, H, K, L ,M , N, P, S, T, U, V, X, Y, Z (20 k t). Ta s da vo cc c trng hnh h c ny trch chn ra vng cha bin s xe, cc bc thc hin nh sau: Bc 1: Load nh, tin x l nh (kh nhiu, lm mm ) Bc 2: Chuyn nh ban u thnh nh xm ri nh phn ha nh . nh nh phn thu c kt qu tt v khng b ph thuc vo cc iu kin nh sng khc nhau, ta s dng phng php nh phn ha vi ngng ng (adaptive threshold) nh ni trn. Bc 3: Tm cc ng bao quanh i tng. Sau khi nh phn nh, cc i tng s l cc khi hnh en trn n n trng, vi mi i tng ta lun v c mt ng bin
Page 74
nV n
Lo
C nhiu cc khc nhau thc hin bi ton nhn dng ny, cc phn mm thng mi hon chnh, n l s kt hp v ti u ca kh nhiu thut ton phc tp, trong bi ny, ta i theo hng tip cn chia bi ton thnh hai bi ton nh: pht hin bin s xe, cch ly k t v nhn dng cc k t.
ng
t, bi cc iu kin thi tit, gc hn ch bt c nhng kh khn ny, nhiu h thng nhn dng trong thc t thng gii hn cc iu kin, chng hn nh camera thu nh c c nh mt v tr, xe c i vo mt khe hp nht nh
Bc 5: Tm ra cc hnh ch nht c kh nng l vng cha bin s, nu hnh ch nht thu c bc 4 l vng cha bin s th n phi tha mn t nht c mt s iu kin sau: o T l chiu di/ rng phi xp x 4.3. Trong ci t thc t ta c th cho t l ny dao ng trong khong [4.0, 4.5]. o S i tng tha mn l mt k t bin s trong vng hnh ch nht phi l mt s ln hn mt ngng no . Vi bin s xe 4 ch s, s k t ny l 7, vi bin s xe mi vi 5 k t s, s k t ny l 8, cng c m t s bin s xe c nhiu hn 8 k t do c 2 k t ch ci xc nh mt i tng l k t hay khng, ta cng s da vo c im hnh hc ca k t nh t l chiu di/rng i tng, t l chiu cao, di ca i tng so vi t l chiu cao, di ca hnh ch nht ang c xem xt l bin s, t l pixel en/trng ca di tng Nu xc nh l mt k t ca bin s xe ta cng s ng thi lu n li, chnh l cch ta cch ly i tng trong bin s. o Ngoi ra, ty thuc vo iu kin ca bi ton ta c th c nh thm mt s c tnh chc chn hn vng cha bin s, chng hn nh kch thc ca hnh ch nht khng c vt qu mt na kch thc ca nh u vo, t l pixel en/trng trong hnh ch nht phi nm trong mt ngng no
Sau khi xc nh c vng c kh nng l bin s, ta s ct vng hnh , ng thi ly ra cc k t trong vng lu vo mt mng thc hin vic nhn dng. Nhn dng k t
Ng
Cc k t sau khi c cch ly l nhng k t n l trong mt khung hnh ch nht c kch thc nht nh. nhn dng c k t ny ta c th s dng rt nhiu phng php khc nhau, t n gin nh phng php s dng tng quan cho (cross correlation) cho n nhng phng php s dng cc m hnh my hc (machine learning) nh mng Neuron nhn to, SVM i vi cc phng php s dng my hc, ta cn su tm mt lng mu cc k t nht nh, t vi trm cho ti hng nghn mu ri a vo cc b hun luyn, kt qu hun
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 75
uy
nV n
Lo
Bc 4: Xc nh hnh ch nht bao quanh cc ng bao quanh tm c t bc 3. ng bao quanh tm c bc 3 l mt chui cc im bin ni lin ca i tng, da vo ta ca cc im bin ny ta s xc nh c hnh ch nht ngoi tip bao quanh i tng.
ng
bao quanh i tng . trnh trnh trng cc i tng khng to ra c cc ng bin khp kn do cc vt dn nt hoc nhiu gy ra, trc khi tm bin ta nn lm mm ng bin bng cc php gin n (hoc co) nh ni trong bi tr c.
Ng
Quay li bi ton nhn dng k t bin s xe ta ang xt, lm sao nhn dng c cc k t ny da trn m hnh SVM? Trc ht cn phi nhn thy rng SVM l mt b my phn loi d liu, mun s dng c n ta cn phi c d liu, d liu i vi cc k t m ta cn nhn dng y chnh l cc c trng trong nh ca k t . Gi s ta cn phn loi 30 lp d liu (tng ng vi 30 k t trong bin s xe), vi mi lp d liu, ta tnh ton c 10 vector c trng (10 mu), v mi vector c trng tng ng vi cc c trng trong mt nh. Khi ta s a vo b hun luyn SVM ton b d liu ny, sau vi mt nh bt k, ta s tnh ton mt vector c trng ca nh , m hnh SVM s xem xt xem d liu ny (tc vector c trng ny) thuc vo lp no trong s nhng lp m n c hun luyn. Tnh ton c trng trong nh. c trng trong nh l nhng c im ring bit gip phn bit nh ny vi nh khc. Vic xem xt nh th no l cc c trng trong nh l mt vic khng c quy c trc, n ph thuc vo cch nghin cu, ci t ca tng trng hp c th v vn ang c nghin cu a ra nhng phng php tt nht. Trong phn ny ta s tnh ton cc vector c trng da trn tng ca phng php Haar, ch r ng bn c c p dng phng php tnh ton c trng trong nh hay hn, hiu qu hn. Gi s ta c hai k t nh hnh bn, nhn bng mt thng ta c th d dng phn bit c hai k t 0 v 4, tuy nhin lm sao my tnh phn bit c hai k t ny? By gi
Tc gi: Nguyn Vn Long long.06clc@gmail.com
uy
nV n
luyn ny s c dng nhn dng cc mu mi. chnh xc ca kt qu nhn dng ni chung ca phng php ny ty thuc vo phc tp ca m hnh, khi lng mu hun luyn, thi gian tnh ton. Trong phn ny ta s dng phng php SVM nhn dng k t. Phng php SVM. (Chi tit v phng php ny bn c c th tham kho trong cc ti liu chuyn ngnh khc). SVM (Surport Vector Machine) l mt m hnh my hc gim st c dng trong vic phn tch, phn lp d liu da vo cc siu phng. Gi s ta c mt tp d liu hai chiu nh hnh bn, khi ta c th phn lp d liu ny thnh hai phn nh mt siu. Siu phng trong mt phng l mt ng thng, trong khng gian 3 chiu l mt mt phng v tng qut trong khng gian n chiu l mt khng gian n-1 chiu. Trong trng hp d d liu l khng tuyn tnh, ta cn nh x tp d liu ln mt khng gian c s chiu ln hn thun tin cho vic phn loi d liu, nhim v l cn phi tm siu phng sao cho khong cch ti cc bin ca d liu l ln nht. Hiu mt cch n gin v phng php ny nh sau: cho mt tp cc mu hun luyn, vi mi mu c gn vo mt nhn, qu trnh hun luyn SVM s xy dng mt m hnh cho php d on mt tp d diu khc thuc v nhn no, tc phn loi tp d liu thuc vo lp no.
Lo
ng
Page 76
Ta nhn thy rng nu tnh tng cc pixel en trong cc ca hai bc nh th s 0 v s 4 c th phn bit da vo cc (1,1), (1, 4), (2, 2), (3,3) ti nhng , tng s cc im nh en l khc nhau hon ton. Tnh ton s im nh en ca 16 vung ny ta c th thu c 16 c trng ca mt nh, 16 c trng ny phn bit k t 0 v 4. Tuy nhin, vi 30 k t ta cn phi tnh ton nhiu hn cc c trng, cc c trng khng nht thit phi l 0 (tc khng c im nh en no) hc 1(tc l ton s im nh en trong ) m c th l mt t l tng i no . T 16 c trng c bn trn, ta kt hp chng li to ra nhng c trng khc, chng hn nh ly tng cc c trng trn ng cho (1,1) + (2,2) + (3,3) + (4,4) ho c tng cc c trng xung quanh ng bin ca nh s c trng cng ln th vic phn loi cc lp cng t b sai, c ngha l xc sut nhn dng cng ln. Ci t chng trnh Nhn dng bin s xe t
Ng
Ta to mt chng trnh da trn Dialog ca MFC, t tn project l LPR (License Plate Recognition). V c bn c th chia chng trnh thnh 3 ph n chnh nh sau: phn cha giao din chnh ca chng trnh (c nh ngha trong file LPRDlg.h v LPRDlg.cpp), phn cha cc hm chnh cho vic pht hin, nhn dng bin s xe v khng lin quan ti giao din (c nh ngha trong file LprCore.h v LprCore.cpp) v phn cha mt cng c gip cho ta c th hun luyn c m hnh SVM mt cch ty (c nh ngha trong file TrainSVM.h v TrainSVM.cpp). Ngoi ra cn c mt s phn nh gip cho vic lp trnh c d dng hn nh phn chuyn i cc bin d liu trong MFC chng hn (unity_conversion.h). Hun luyn m hnh SVM to c m hnh SVM phc v cho vic nhn dng k t sau ny, ta cn hun luyn v lu m hnh sau khi hun luyn.
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 77
uy
nV n
Lo
ng
Ng
uy
vector<float> r; resize(img, img, Size(40, 40)); int h = img.rows/4; int w = img.cols/4; int S = count_pixel(img); int T = img.cols * img.rows; for(int i = 0; i < img.rows; i += h) { for(int j = 0; j < img.cols; j += w) { Mat cell = img(Rect(i,j, h , w)); int s = count_pixel(cell); float f = (float)s/S; r.push_back(f); } }
for(int i = 0; i < 16; i+= 4) { float f = r[i] + r[i+1] + r[i+2] + r[i+3]; r.push_back(f); } for(int i = 0; i < 4; ++i) { float f = r[i] + r[i+4] + r[i+8] + r[i+ 12]; r.push_back(f); } r.push_back(r[0] + r[5] + r[10] + r[15]); Page 78
nV n
vector<float> calculate_feature(Mat src) { Mat img; if(src.channels() == 3) cvtColor(src, img, CV_BGR2GRAY); threshold(img, img, 100, 255, CV_THRESH_BINARY);
Lo
Chun b c s d liu. Ta cn chun b c s d liu l tp hp ca cc k t trong bin s xe. C 30 k t thng gp trong bin s xe, do ta cn phn loi 30 lp ny, trong trng hp y gi s vi mi lp, tc l mi t t ta c 10 nh, ta s lu cc nh ny vo cc folder, tn cc folder c t tn theo cc k t, chng hn nh folder 0 cha 10 nh ca k t 0, folder 1 cha 10 nh ca k t 1, folder 30 cha 10 nh ca k t Z. ta cn nh tn folder theo s t t, v s th t cng chnh l nhn tng ng a vo vic nhn dng. Ta s tnh ton c trng ca tng k t v lu tt c cc c trng ny vo mt ma trn phc v cho vic hun luyn. Hm tnh ton c trng trong mt nh s da trn tng tng cc im en trong mt khung hnh, tuy nhin n c chun ha bng cch chia cho tng tt c cc im nh en ca k t.
ng
on code sau s hun luyn mt m hnh svm, vi u vo l mt folder cha d liu hun luyn nh ni trn (folder ny cha 30 folder con, mi folder con cha 10 k k t mu)
const int number_of_class = 30; const int number_of_sample = 10; const int number_of_feature = 32;
Ng
CvSVMParams params; params.svm_type = CvSVM::C_SVC; params.kernel_type = CvSVM::RBF; params.gamma = 0.5; params.C = 16; params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); SVM svm; Mat data = Mat(number_of_sample * number_of_class, number_of_feature, CV_32FC1); Mat label = Mat(number_of_sample * number_of_class, 1, CV_32FC1); int index = 0; vector<string> folders = list_folder("D:/Data"); for(size_t i = 0; i < folders.size(); ++i) { cout<<i<<"..."<<endl; vector<string> files = list_file(folders.at(i)); Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 79
uy
nV n
Lo
ng
Ng
uy
Trong oan chng trnh trn, ta ln lt c qua tt c cc folder con trong th mc D:/Data bng hm list_folder (hm ny ta vit da trn header dirent.h, vi mc ch lit k danh sch cc folder trong mt th mc), sau ta tnh ton tt c cc c trng ca cc nh trong cc folder ny v lu vo ma trn data. Ma trn label cha nhn ca cc lp cn nhn dng, n cng chnh l tn c a cc folder tng ng c nh s th t tng dn. Hm train_auto s thc hin vic hun luyn mt cch t ng v ti u cc thng s ca m hnh. y cc thng s params ta s dng ch l mt trong s nhiu m cch m ta c th t thng s. Cng c ci t trong chng trnh l mt lp TrainSVM k tha t lp CDialog to ra nhiu ty chnh gip cho vic a cc thng s u vo, u ra mt cch d dng hn.
nV n
Lo
string folder_path = folders.at(i); string label_folder = folder_path.substr(folder_path.length() - 1); for(size_t j = 0; j < files.size(); ++j) { src = imread(files.at(j)); if(src.empty()) continue; vector<float> feature = calculate_feature(src); if(feature.size() < number_of_feature) { cout<<"error " <<endl; continue; }
ng
Page 80
Pht hin v nhn dng bin s xe Ta ci t mt lp nhn pht hin v nhn dng bin s xe theo nh cc bc ni trn, v t tn cho lp ny LprCore. Ta s ci t lp ny vi giao din sao cho vic s dng n l d dng nht, giao din (interface) ca lp ny c nh ngha nh sa u:
// lprcore.h header #pragma once #include <opencv2/core/core.hpp> #include <opencv2/ml/ml.hpp> using namespace std; using namespace cv;
Ng
class LprCore { public: LprCore(void); ~LprCore(void); void set_image(Mat); void set_svm_model(string); void do_process(); vector<string> get_text_recognition(); vector<Mat> get_plate_detection(); vector<Mat> get_character_isolation(); vector<vector<Mat> > get_character(); vector<double> get_process_time(); Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 81
uy
nV n
Lo
ng
Ng
Ta s xt hai hm ci t hm chnh ca lp l hm bool plate_detection() v hm char character_recognition(Mat). Hm bool plate_recognition() thc cht l vic l vic gi hm char character_recognition(Mat) cho mt chui cc nh k t trong bin s. Hm bool plate_detection(),tr v kt qu true nu pht hin c bin s ng thi lu cc bin s pht hin c vo vector vector<Mat> plates:
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 82
uy
nV n
cc lp khc khi s dng giao din ny, ch vic a nh u vo, a m hnh hnh svm c hun luyn, gi hm do_process v sau c th ly ra cc kt qu nh bin s nhn dng c, kt qu nhn dng c, thi gian ca cc qu trnh Bn cht ca hm do_process s gi hm plate_detection v hm plate_recognition. Nu gi hai hm ny thnh cng, c ngha l qu trnh thc hin thnh cng v ta gn cho bin trng thi l true
Lo
void clear(); private: bool done; bool ready; SVM svm; Mat image; vector<Mat> plates; vector<Mat> draw_character; vector<vector<Mat> > characters; vector<string> text_recognition; vector<double> process_time; char character_regconition(Mat); bool plate_detection(); bool plate_recognition(); };
ng
cvtColor(image, gray, CV_BGR2GRAY); adaptiveThreshold(gray, binary, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 55, 5); findContours(binary, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); if(contours.size() <= 0) return false; for(size_t i = 0; i < contours.size(); ++i) { Rect r = boundingRect(contours.at(i)); if(r.width > image.cols/2 || r.height > image.cols/2 || r.width < 120 || r.height < 20 || (double)r.width/r.height > 4.5 || (double)r.width/r.height < 3.5) ... continue;
Nu cc hnh ch nht bao quanh khng tha mn c iu kin l bin s ta s b qua khng xt tip na m chuyn ti cc ng bao khac. Trong trng hp tha mn, ta tip tc vng lp bng cch tm cc hnh bao quanh i tng trong hnh ch nht tha mn i u kin ca mt k t trong bin s xe
Mat sub_image = image(r); vector<Rect> r_characters; for(size_t j = 0; j < sub_contours.size(); ++j) { Rect sub_r = boundingRect(sub_contours.at(j)); if(sub_r.height > r.height/2 && sub_r.width < r.width/8 && sub_r.width > 5 && r.width > 15 && sub_r.x > 5) { Mat cj = _plate(sub_r); double ratio = (double)count_pixel(cj)/(cj.cols*cj.rows); if(ratio > 0.2 && ratio < 0.7) { r_characters.push_back(sub_r); rectangle(sub_image, sub_r, Scalar(0,0,255), 2, 8, 0); } } }
Ng
Trong on code trn, tha mn cc ng bao quanh i tng l mt k t bin s, ngoi so sch t l tng quan di, rng ca i tng so vi bin s ta cn so snh t l pixel en trn tng s pixel ca i tng v ta gi s rng nu l mt k t ca bin s th
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 83
uy
nV n
Lo
ng
Trc ht,ta thc hin cc php bin i thng thng thu c mt nh nh phn c kt qu tt, sau thc hin php tm ng bao quanh (contour), vi mi ng bao, ta v hnh ch nht bao quanh v xem xt cc iu kin ca hnh ch nht :
Hm char character_regconition(Mat img_character) tr v kt qu l mt k t kiu char vi mt nh u vo tng ng. thc hin vic nhn dng, u tin ta cn tnh ton cc c trng ca nh u vo img_character. Vic tnh ton cc c trng s cho ta mt vector cha cc c trng ca nh , ta s dng hm predict ca di tng svm xem xem vector thuc v lp no. Kt qu tr v ca hm predict l mt s thc tng ng vi nhn m ta hu n luyn, c 30 nhn tng ng vi cc s t 0 9 v t A Z. Ch l khng phi tt c cc ch ci u c s dng, do vy sau kt qu thu c t hm predict cn phi c chuyn i sang cc k t tng ng. Ch l trc khi s dng hm predict d on ta cn phi load m hnh SVM c hun luyn t bc trn.
char LprCore::character_recognition(Mat img_character) { char c = '*'; // truong hop khong cho ket qua tra ve * if(img_character.empty()) return c; // neu anh rong if(!ready) return c; // neu chua load mo hinh svm vector<float> feature = calculate_feature(img_character); Mat m = Mat(number_of_feature, 1, CV_32FC1); for(size_t i = 0; i < feature.size(); ++i) m.at<float>(i, 0) = feature[i]; float r = this->svm.predict(m); // du doan mau moi int ri = (int)r; if(ri >= 0 && ri <= 9) c = (char)(ri + 48); //ma ascii 0 = 48 if(ri >= 10 && ri < 18) c = (char)(ri + 55); //ma accii A = 65, --> tu A-H if(ri >= 18 && ri < 22) c = (char)(ri + 55 + 2); //K-N, bo I,J if(ri == 22) c = 'P'; if(ri == 23) c = 'S'; if(ri >= 24 && ri < 27) c = (char)(ri + 60); //T-V, if(ri >= 27 && ri < 30) c = (char)(ri + 61); //X-Z Page 84
Ng
uy
nV n
Lo
ng
n nm trong khong 0,2 n 0,7. Sau bc ny, nu s lng r_characters ln mt ngng no (thng l > 7) th ta s cng nhn n r l mt vng cha bin s, cc k t ct ra c sau cn phi sp xp li theo th t t tri sang phi cho n tng ng vi th t cc ch ci trong bin s trc khi p dng cho vic nhn dng.
return c;
this->text_recognition.push_back(result);
Ng
uy
Giao din chng trnh chnh Ta thit k giao din chng trnh chnh bao g m cc picture control hin th nh, cc button, menu cho vic iu khin v cc label hin th kt qu nh sau:
nV n
bool LprCore::plate_recognition() { if(plates.size() <= 0 ) return false; double t = (double)cvGetTickCount(); for(size_t i = 0; i < characters.size(); ++i) { string result; for(size_t j = 0; j < characters.at(i).size(); ++j) { char cs = character_recognition(characters.at(i).at(j)); result.push_back(cs); }
Lo
ng
Page 85
Cc button, label c khai bo trong trong header LPRDlg.h v cc hm x l s kin c ci t trong file LPRDlg.cpp
// LPRDlg.h : header file #pragma once #include <opencv2/core/core.hpp> #include "LprCore.h" #include "afxwin.h"
Ng
private: cv::Mat src; cv::Mat plate; cv::Mat character; LprCore lpr; string file_name; string text_recognition; // Implementation protected: ... DECLARE_MESSAGE_MAP() public: Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 86
uy
// CLPRDlg dialog class CLPRDlg : public CDialogEx { public: CLPRDlg(CWnd* pParent = NULL); enum { IDD = IDD_LPR_DIALOG }; ...
nV n
Lo
ng
};
Ng
uy
lpr.set_image(src); lpr.do_process(); vector<Mat> plates = lpr.get_plate_detection(); vector<Mat> characters = lpr.get_character_isolation(); vector<double> t = lpr.get_process_time(); vector<string> text = lpr.get_text_recognition(); if(plates.size() > 0) { plate = plates[0]; resize(plate, disp_plate, Size(280,50)); imshow("plate", disp_plate); character = characters[0]; resize(character, disp_character, Size(280,50)); imshow("character", disp_character); text_recognition = text[0]; Page 87
nV n
// CLPRDlg.cpp void CLPRDlg::OnUpdateFileOpenimage(CCmdUI *pCmdUI) { // Open Image ... CFileDialog dlg(TRUE, _T("*.bitmap"), NULL, ...) if(dlg.DoModal() == IDOK) { file_name = to_string(dlg.GetPathName()); src = imread(file_name); if(src.empty()) return; ... }
Lo
Menu Open image hoc button Load Image c chc nng to ra cc dilog m file, file c m s c c, l vo bin src v s l nh u vo cho chng trnh.
ng
} else { } }
Ngoi ra, chng trnh cn c m t s menu khc nhm gip ta lu kt qu nh bin s hoc kt qu nhn dng c di dng mt chui text, menu hin th dialog cho vic hun luyn m hnh SVM Hnh sau m t kt qu chy chng trnh:
Ng
uy
Page 88
nV n
Trong on code trn, ta s kim kim tra xem nh u vo c rng khng trc khi t n vo i tng lpr thc hin cc php x l. Sau khi thc hin cc php x l, ta s kim tra xem nu nh kt qu u ra m ln hn mt bin s (plates.size() > 0) th ta s hin th cc kt qu ln. Lu l hi n ti ta mi ch hin th kt qu u tin, trong trong nh c nhiu hn mt bin s ta c th ln lt hin th cc kt qu mt cch d dng.
Lo
...
ng
Ng
uy
Page 89
nV n
Lo
Bi ton nhn dng bin s xe ny xy dng mt m hnh chung tng qut, ng dng trong thc t ta cn gii hn bt li mt s iu kin gip cho vic tm kim bin s c chnh xc hn, thm vo cc mu hun luyn k t cn phi c su tp nhiu hn, cc vector c trng cng phi c tnh ton t m hn gip cho kt qu nhn dng c chnh xc cao hn na. Ngoi ra, cn nhiu kha cnh khc lin quanh n bi ton ng dng ny trong thc t nh cn phi xy dng h c s d liu lu tr kt qu, so snh kt qu, xy dng h thng phn cng, iu khin phn cng iu khin h thng nh cc h thng th t RFID, h camera, h ng c cho cc iu khin c hc
ng
Cu trc ca mt file video. Ta thng xem mt bi clip ca nhc, mt b phim trn my tnh, trn Youtube Chng c gi chung l mt video. Mt file video c th c nhiu nh dng khc nhau nh avi, mp4, mov , xt v cu trc, mt file video c to nn t nhiu thnh phn khc nhau gi l cc track, chng hn nh track v video, track v audio, track v ph Track Video Ta cn phi phn bit v nh dng mt file video (file extention) v b gii m video (video codec). nh Track Audio dng file, chng hn nh avi, mp4, mov, flv l cch cu trc ca mt file trong my tnh, n ch ra cch Track Ph lu tr cc d liu trn a nh th no, cc phn t c xp xp ra sao trong khi b gii m (video Track thi gian codec) ch ra video c m ha nh th no, c c nn hay khng v cch c c d liu video . Cc b gii m m ta thng thy nh H.264, XVID, MPEG, UYVY Cng l mt nh dng file nhng c th c nhiu codec khc nhau, chng hn nh file *.avi c th c m ha v gii m bi b codec XVID, UYVY , iu l gii mt s my tnh c c file avi ny nhng mt s my tnh khc li khng c c file avi , nguyn nhn l do my cha c ci b codec m file avi cha b m m ha/gii m. Tng t, audio cng c b codec ring ca n nh ACC, MP3 nu my thiu video codec m c audio codec th trong mt s trng hp, file video ch chy c phn m thanh m khng hin th c hnh nh. X l video. X l video l mt khi nim chung, nu nh theo ng nh cu trc trn ca mt video, khi ni n x l video c ngha l ta ang x l tt c cc track ca mt file video bao gm track video, track audio tuy nhin trong khun kh ca vic p dng x l nh trong thc t, ta ch lm vic vi track video m khng lm vic vi cc track cn li ca file video. Xt mt cch tng qut, ta c th xem nhng track video (hay video stream) l mt chui cc nh lien tip nhau gi l cc frame, cch hin th cc frame ny c quy nh bi mt thng s v tc frame (frame rate), chnh l s frame xut hin trong mt giy v c n v tnh l frame/giy (frame per second hay fps). Vic x l video thnh ra li l vic x l cc frame nh ny. Tuy nhin cn phi ch l cc php x l nh tnh khng c nhu cu khc khe v thi gian, tuy nhin vi video khi m mi giy ta s phi x l ti hang chc nh (cc video thng thng c tc 15-30 hnh/giy
Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 90
Ng
uy
nV n
Lo
Trong phn ny, ta s to mt chng trnh c th thu nhn nh t webcam v bng cc hm x l nh n gin nh trong cc v d trn to ra nhng hiu ng video p mt, chng trnh c mt s chc nng chnh nh: thu nhn video t webcam, cc chc nng x l video da trn cc hm x l nh (lm m, lm mo, chuyn i khng gian mu ) chc nng chp hnh, ghi hnh, iu chnh mt s thng s Nhng trc ht chng ta hy tm hiu cu trc ca mt video, cch x l trn video v s h tr ca th vin OpenCV lm vic vi video nh th no.
ng
Ng
Th vin OpenCV i vi x l video. Th vin OpenCV ch h tr ta cc hm bt nh t mt thit b nh webcam, camera , ghi cc frame nh thnh file video, cn vic lm x l video ta c th s dng cc hm x l nh m th vin cung cp x l cc frame video. Tuy nhin, th vin OpenCV l mt th vin chuyn v x l nh, nn n ch h tr track video trong cu trc ca file video ni trn, ngha l khi thu video, ghi video ta ch c phn hnh (video stream) m khng th nghe c phn ting. Mt hn ch na l ban u OpenCV ch h tr lm vic trn cc video avi khng nn, iu s lm cho vic kch thc ca vic lu tr file tng ln rt nhiu, gi s ta cn ghi mt on video avi khng nn trong thi gian l mt pht vi tc l 25 hnh/giy v nh thu t webcam c kch thc 640x480 (nh mu, mi knh mu ca mt pixel l 8 bit) khi kch thc ca mt file cn phi c l 1*60*25*640*480*3*8 = 11059200000 bit tc khong 1Gb. Tuy nhin, hin ti ta c th lm vic c trn nhiu dng file avi nn, file mpeg, flv min my c ci cc b codec tng ng. c video t mt file video hoc mt thit b webcam, camera th vin OpenCV cung cp cho ta lp cv::VideoCapture. V d ta c t mt file video, ta c th khi to i tng VideoCaputre nh sau: cv::VideoCapture capture = cv::VideoCapture(D:/test.avi); c video t mt thit b: cv::VideoCapture capture = cv::VideoCapture(int device) Trong , device l mt s nguyn ch ra thit b video trn my, thng thng ta device bng 0 ch ra rng thit b ang s dng l webcam mc nh trn my tnh laptop, nu khng bit c th thit b l g, ta c th vit mt chng trnh nh kim tra thit b ph hp bng cch tn bin device t 0 ti mt s no (100 chng hn), vi mi gi tr ca device, kim tra xem capture c c to ra hay khng, nu thit b ph hp, capture s tr v mt gi tr khc null, ngc li n s l null: for(int device = 0; device < 100; ++device) { cv::VideoCapture capture = cv::VideoCapture(int device) if(capture) cout<<thiet bi phu hop <<device <<endl } ly ra c cc frame nh trong video, ta c th s dng hm read(cv::Mat& img), kt qu l frame ca video s c lu vo trong bin img. Ta cng c th s dng ton t >> ly ra cc frame t i tng capture: cv::Mat img; capture << img;
uy
nV n
Lo
ng
Page 91
hoc hn na) th ta cn phi ti u ha php x l ti mc c th video c th chy c trong thi gian thc (khng b git cc, tc hnh).
Mycamcore.h:
Ng
uy
Chng trnh c to ra da trn nn Dialog ca MFC, cng cc hm x l nh trong OpenCV bit nh trn. Ta chia chng trnh lm hai ph n, mt phn cha cc hm x l nh v mt phn thuc v giao din MFC. Phn cha cc hm x l nh c t tn l lp MyCamCore, n bao gm mt file header nh ngha giao din hm mycamcore.h v mt file ci t mycamcore.cpp. Cu trc ca hai file ny c dng nh sau:
nV n
cv::VideoCapture capture = cv::VideoCapture(0); if(!capture.isOpened()) exit(0); cv::Mat img; capture >> img; cv::VideoWriter writer = cv::VideoWriter("D:/test.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25, img.size(), true); while(1) { capture >> img; writer << img; }
Lo
lu cc frame nh thnh video, OpenCV xy dng mt lp cv::VideoWriter. Constructor ca i tng ny nh sau: VideoWriter(string& filename, int fourcc, double fps, cv::Size frameSize, bool isColor) Trong , filename l file ng dn y ca file cn lu, chng hn D:/Movie/test.avi. fourcc l mt s nguyn i din cho bn k t ca b codec dng m ha/gii m video. Nu ta bit tn ca b m ha (tn ca b m ha l bn k t) th ta c th tm c s nguyn ny da vo macro CV_FOURCC(char c1, char c2, char c3, char c4), chng hn nh b m ha XVID s c tm bng CV_FOURCC('X', 'V', 'I', 'D'). frameSize l kch thc ca cc frame nh, chng hn 640x480 isColor l mt bin kim tra xem video la vo c phi l da trn cc nh mu hay khng, n c gi tr mc nh l true. la tr video, ta c th gi hm write, hoc ton t <<. V d nh sau m t cch c video t webcam v la nh thu c vo mt file video.
ng
};
MyCamCore::~MyCamCore(void) { } void MyCamCore::Gray(Mat &src, Mat &dst) { if(src.channels() != 1) cvtColor(src, dst, CV_BGR2GRAY); else dst = src; }
Ng
void MyCamCore::Blur(Mat &src, Mat &dst) { } } Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 93
uy
nV n
Lo
V mycamcore.cpp:
ng
Trong hm trn, php cng tr ma trn ch c thc hin trn mt knh mu, nn u tin ta tch nh thnh 3 knh mu ring bit, sau khi thc hin php ton xong ta li trn ln 3 knh my ny vo.
Ng
i vi phn giao din ca chng trnh, ta thi t k mt giao din trn Dialog nh sau:
uy
static Mat mask = 255*Mat::ones(src.rows, src.cols, CV_8UC1); std::vector<Mat> src_bgr; std::vector<Mat> dst_bgr; split(src, src_bgr); for(size_t i = 0; i < src_bgr.size(); ++i) { Mat temp = mask - src_bgr[i]; dst_bgr.push_back(temp); } cv::merge(dst_bgr, dst);
nV n
Lo
ng
Page 94
Ng
class CMyCamDlg : public CDialogEx { public: CMyCamDlg(CWnd* pParent = NULL); enum { IDD = IDD_MYCAM_DIALOG }; Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 95
uy
Cc button c t tn bin c dng btn_rgb, btn_capture Video c hin th nh hin th lin tip cc frame nh ln mt ca s, cu s ny c ly handle sau c gn vo picture box ging nh cch hin th nh trn giao din MFC trong cc v d trc ni. Lp ci t giao din v cng l chng trnh chnh khi ch y l lp CMyCam, lp ny c khi to mc nh khi ta tin hnh to chng trnh v ch n Dialog base. Ta s thm vo header MyCamDlg.h v file ci t MyCamDlg.cpp mt s bin, mt s hm iu khin chng trnh. Header CMyCam.h s c dng nh sau:
nV n
Lo
ng
protected: virtual void DoDataExchange(CDataExchange* pDX); private: // Cc bin, cc hm chc nng trong chng trn h bool is_stoped; bool is_captured; int type; cv::Mat src; cv::Mat dst; double fps; std::string output_folder; cv::Size size; std::string video_file_name; std::string img_file_name; cv::VideoWriter writer; cv::VideoCapture capture; MyCamCore mycam; void Start(); void InitAppearance(); bool ReadConfig(std::string); std::string CreateFileName(); protected: HICON m_hIcon; // cac ham override virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnClose(); DECLARE_MESSAGE_MAP() public: // cc button CButton btn_snapshot; CButton btn_capture; CButton btn_setting; CButton btn_rgb; CButton btn_gray; ... // Cc hm khi click vo button afx_msg void OnBnClickedSnapshot(); afx_msg void OnBnClickedCapture(); afx_msg void OnBnClickedSetting(); afx_msg void OnBnClickedRgb(); afx_msg void OnBnClickedGray(); ... Tc gi: Nguyn Vn Long long.06clc@gmail.com
Ng
uy
nV n
Lo
Page 96
ng
11};
enum {RGB = 0, GRAY = 1, INVERT = 2, HSV = 3, YCRCB = 4, CANNY = 5, SOBEL = 6, BLUR = 7, NOISE = 8, ROT = 9, DIV = 10, DISTORT =
};
Cc bin iu khin ca chng trnh bao g m is_stoped, is_captured, type nhm kim tra xem vng lp c tip tc c thc hin hay khng, button capture c c bm cha hoc th hm x l nh no m ta ang gi Mt s hm c ci t trong file MyCamDlg.cpp nh:
Trong MFC, t mt nh vo mt button hay mt Control no ta c th dng hm SetBitmap vi i s ca hm l mt HBITMAP, nh vy ta c th ci t hm to ra giao din trang tr InitAppearance nh sau:
void CMyCamDlg::InitAppearance() { HBITMAP snapshot_bmp = (HBITMAP)LoadImageA(0, "../MyCam/res/snapshot.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); btn_snapshot.SetBitmap(snapshot_bmp); HBITMAP capture_bmp = (HBITMAP)LoadImageA(0, "../MyCam/res/capture.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); btn_capture.SetBitmap(capture_bmp); HBITMAP setting_bmp = (HBITMAP)LoadImageA(0, "../MyCam/res/setting.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); btn_setting.SetBitmap(setting_bmp); HBITMAP folder_bmp = (HBITMAP)LoadImageA(0, "../MyCam/res/folder.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); btn_folder.SetBitmap(folder_bmp); ...
Ng
uy
}
Hm bool ReadConfig(std::string) c tc dng c file config ca chng trnh, file ny cha mt s tham s nh tc hnh trn giy (fps), folder cha nh chp hoc video ghi vo (output_folder) Ban u cc tham s ny cha gi tr
Page 97
nV n
Lo
Hm void InitAppearance(): Hm ny c tc dng ci t giao din khi to cho chng trnh, m c ch l lm cho giao din tr nn p hn bng cch thm cc nh trang tr vo cc button. Chng hn nh bn button Snapshot, Capture, Open Folder, Setting c trang tr bng cc nh nh sau:
ng
Ng
uy
Hm std::string CreateFileName() c tc dng to ra mt chui tn khc nhau cc thi im khc nhau nhm mc ch t tn cho cc file nh chp hoc file video quay. to ra c cc chui tn khng b trng nhau, tt nht l ta ly theo thi gian, nh vy mi thi im ch c duy nht mt tn c to ra. Nu nh ta nhn vo nut Snapshot (chp nh) thi im l 11 gi 30 pht 10 giy th 6 ngy 28 thng 12 nm 2012 th tn ca file nh lu li s l Fri Dec 28 11_30_10 2012.jpg. t ng cho vic ci t hm ny l ly thi gian ca h thng, sau thay th cc k t hai chm : ca thi gian bng k t gch ni di _ (v k t hai chm l khng hp l t tn trong window):
std::string CMyCamDlg::CreateFileName() { CreateDirectoryA(output_folder.c_str(), NULL); time_t rawtime; time(&rawtime); std::string t = (std::string)ctime(&rawtime); int pos = t.find(":"); if(pos != t.npos) { t.replace(pos, 1, "_"); t.replace(pos + 3, 1, "_"); t.pop_back(); } std::string path = output_folder + "/"; return path + t; }
nV n
bool CMyCamDlg::ReadConfig(std::string file_name) { std::ifstream ifs(file_name); if(!ifs) return false; std::vector<std::string> lines; std::string line; while(ifs >> line) { lines.push_back(line); } if(lines.size() < 2) return false; fps = atof(lines.at(0).c_str()); output_folder = lines.at(1); ifs.close(); return true; }
Lo
Page 98
ng
mc nh, tuy nhin khi ngi dng iu chnh bng cch nhn vo button Setting th cc tham s ny s c thay i v lu li trong file config, nhng ln ch y sau, cc thng s s c c v c gi tr l gi tr m ngi dng ty chnh cho chng, hm ny s c gi ngay khi chng trnh c chy, hm ci t ch yu da vo cc hm chun trong C++ c dng nh sau:
void CMyCamDlg::Start() { if(!capture.isOpened()) return; size = cv::Size((int) capture.get(CV_CAP_PROP_FRAME_WIDTH), (int) capture.get(CV_CAP_PROP_FRAME_HEIGHT)); while(!is_stoped) { capture >> src; switch(type) { case RGB : dst = src; break; case GRAY : mycam.Gray(src, dst); break; case INVERT: mycam.Invert(src, dst); break; case HSV : mycam.ToHSV(src, dst); break; case ... : ... break; default: dst = src; break; } cv::imshow("Video", dst); if(is_captured && writer.isOpened()) writer << dst; cv::waitKey(1);
Ng
uy
} }
nV n
Page 99
Lo
ng
14. Hm void Start() l hm cha vng lp ca c chc nng x l nh thu c t webcam v hin th nh qua x l. nh c x l nh th no th ty vo bin s type. Hm ny s c gi ngay t u chng trnh sau khi cc giao di n v cc thng s c khi to ht, bin is_stoped s dung kt thc vng lp ca hm ny, bin ny c t gi tr l true khi chng trnh k t thc trong hm OnClose(). Hm Start c ci t nh sau:
15.
Ng
uy
} else {
nV n
} 16. Hm khi click vo button Snapshot (chp nh): void CMyCamDlg::OnBnClickedSnapshot() { img_file_name = CreateFileName() + ".jpg"; std::vector<int> p(2); p.at(0) = CV_IMWRITE_JPEG_QUALITY; p.at(1) = 90; if(!dst.empty()) { cv::imwrite(img_file_name, dst, p); }
writer = cv::VideoWriter(video_file_name, CV_FOURCC('X','V', 'I', 'D'),8, size, true); btn_capture.SetBitmap((HBITMAP)(LoadImageA(0,"../MyCam/res/ stop.bmp",0, 0, 0, LR_LOADFROMFILE))); btn_snapshot.EnableWindow(false); btn_setting.EnableWindow(false); btn_folder.EnableWindow(false);
Lo
ng
Cc hm dng iu khin qu trnh x l video khi click vo cc button u c chung mt dng lnh v c dng nh sau (gi s hm khi click vo button btn_invert):
Hm ny s m folder cha cha nh chp v video c ghi li bng hm sytem(command), trong command l mt chui kiu char gi hm explorer.exe vi i s l ng dn ti folder cn m.
19. Hm khi click button Setting: void CMyCamDlg::OnBnClickedSetting() { Setting setting; is_stoped = true; setting.DoModal(); fps = setting.Fps; output_folder = setting.OutputPath; if(fps <= 0) fps = 8; if(output_folder == "") output_folder = "..\\Output"; std::ofstream ofs("config.txt"); if(!ofs) return; ofs << fps <<std::endl; ofs << output_folder; ofs.flush(); ofs.close(); is_stoped = false; Start();
Ng
uy
}
nV n
18. Hm khi click vo button Open Folder (m folder cha file nh file video): void CMyCamDlg::OnBnClickedFolder() { std::string str_command = "explorer.exe " + output_folder; const char *command = str_command.c_str(); system(command); }
Lo
Khi button Capture c nhn, i tng writer s c to mi vi tn ca file video c to ra t hm CreateFileName(), nh dng ta s dng y l avi vi codec l XVID, ng thi trng thi ca chng trnh cng chuy n sang trng thi ghi hnh, ngha l button Capture by gi c thay bi nh c tn l Stop, cc button khc nh Snapshot, Open Folder, Setting s b v hiu ha. Nu button ny c click ln th hai (khi qu trnh ghi hnh ang din ra) th ta s ngng vic ghi video li, hy i tng writer v trng thi chng trnh tr v nh ban u.
ng
Page 101
Ng
uy
Page 102
nV n
Lo
ng
Hm ny s m ra mt dialog ngi dung t cc gi tr cho chng trnh nh fps, output_folder (bn c c th thm vo mt s thng s nh iu chnh sang cho nh trong qu trnh x l chng hn) Kt qu sau php ci t ny c ghi vo file config v c s dng cho cc ln chy chng trnh ti p theo.
Ng
uy
Chng trnh trn c ci t dng n gin to ra mt chng trnh c th lm vic vi cc video stream m c th y l thu t webcam. Trn mt kha cnh no n ging vi tng ca chng trnh Cyberlink YouCam kh n i ting v c thng mi ha, tuy nhin n n gin hn kh nhiu c v chc nng ln giao din. Bn c c th t pht trin thm nhiu hm, nhiu modul t to ra cho mnh mt chng trnh thc s th v da trn nhng iu c bn nht.
------------------------------Ht-----------------------------Mt s vn d kin s c tho lun trong phn ti: Pht hin - nhn dng mt ngi, nhn dng ch vit tay, theo di i tng (object tracking), camera calibration - sterio vision v ti to khng gian 3D, robot vision mt s vn v vic p dng x l nh trong cc k thi robocon
nV n
Lo
Page 103
ng