Sie sind auf Seite 1von 103

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc th vi th vin OpenCV C/C++


Nguyn Vn Long
long.06clc@gmail.com

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
Page 1

nV n

Lo

ng

ng dng x l nh trong thc t vi th vin OpenCV

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

ng dng x l nh trong thc t vi th vin OpenCV

Hng dn s dng sch

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

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 III. Lp trnh x l nh vi giao din MFC 1. 2. 3. 4. 5.

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

Chng I. Lm quen vi th vin OpenCV 1. Gii thiu v th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

Trong khi , OpenCV 2.x thc hin nh sau:

// 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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

ng

Trn Microsoft Visual Studio

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

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.

#include #include #include #include

using namespace std; using namespace cv;

Ng

void main() { ... }

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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.

ng dng x l nh trong thc t vi th vin OpenCV

Vi Eclipse CDT

ng dng x l nh trong thc t vi th vin OpenCV

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
Page 11

nV n

Lo

ng

Chng II. Cc php x l nh v ng dng c bn


1. Chng trnh u tin

ng dng x l nh trong thc t vi th vin OpenCV

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:

using namespace std; using namespace cv;

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

#include #include #include #include

"stdafx.h" <iostream> <opencv2\highgui\highgui.hpp> <opencv2\core\core.hpp>

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 dng x l nh trong thc t vi th vin OpenCV

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

Khng gian mu CMYK.

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 dng x l nh trong thc t vi th vin OpenCV

Khng gian mu HSV

Hnh trn biu din mu sc (HUE)

Chuyn i gia cc khng gian mu.

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 .

ng dng x l nh trong thc t vi th vin OpenCV

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>

using namespace cv;

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

Chng trnh chuy n i cc khng gian mu

(0, 0, 0) ( , , 0) ( , , 0) (0, , ) ( 1, 1, 1) = (0, , ) ( , 0, ) , 0, )

0 1 2 3 4 5

<1 <2 <3 <4 <5 <6

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 dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

Sau y l hnh nh khi chuyn i cc khng gian mu trn

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

3. iu chnh sang v tng phn trong nh

nV n

Lo

ng

ng dng x l nh trong thc t vi th vin OpenCV


Hng 0 Hng 1 Hng 2 Hng n

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

using namespace std; using namespace cv;

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

#include #include #include #include

"stdafx.h" <iostream> <opencv2\core\core.hpp> <opencv2\highgui\highgui.hpp>

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy

4. nh nh phn, nh phn ha vi ngng ng

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;

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

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>

using namespace std; using namespace cv;

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 dng x l nh trong thc t vi th vin OpenCV

ng

return 1;

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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;

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

ng

ng dng x l nh trong thc t vi th vin OpenCV

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:

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

// Can bang histogram

#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

Sau y l kt qu ca chng trnh trn


Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 26

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

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy

nV n

6. Phng to, thu nh v xoay nh

. Nu = = 0, khi x = x v y = y, php bin i ny lm

Lo
Page 27

ng

ng dng x l nh trong thc t vi th vin OpenCV

Nu ta nh ngha ma trn gc quay l .

cos ( ) sin ( )

sin ( ) th php bin s quay p thnh p vi cos ( )

Nu ma trn M c nh ngha thnh

va l php bin i theo t l v quay.

By gi ta s xt chng trnh phng to, thu nh v quay nh.


// Chuong trinh phong to, thu nho va quay anh #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> using namespace cv;

Ng

int main() { Mat src = imread("HoaSen.jpg"); Mat dst = src.clone(); double angle = 45.0; Page 28

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy

nV n
= . cos () sin ( )

Lo

sin ( ) th php bin i s . cos ( )

ng

double scale = 1.5; Point2f center(src.cols/2, src.rows/2);

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

ng dng x l nh trong thc t vi th vin OpenCV

V d v ma trn lc (ma trn lc Sobel theo hng x, y v ma trn Gausian Blur) 1 2 1 0 0 0

Cng thc c th cho vic lc nh nh sau: ( , )= ( , )

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

1/9 1/9 1/9 * 100 195 200 200 100 1/9 1/9 1/9 100 200 205 195 100

Ng

100 100 100 100 100

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

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

nhn chp pixel (2,3)

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV


Ma trn lc ca phng php ny c dng : =

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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. = = +

Ma trn lc c dng nh sau:

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

using namespace cv;

ng dng x l nh trong thc t vi th vin OpenCV

Kt qu ca chng trnh nh sau:

Mt s b lc sau c th hu ch cho vic to ra cc hiu ng nh p mt:

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV


=0

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 (dilation)

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

8. Cc php ton hnh thi hc trong nh

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.

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV


0 x

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

ng

#include #include #include #include

"stdafx.h" <opencv2/core/core.hpp> <opencv2/highgui/highgui.hpp> <opencv2/imgproc/imgproc.hpp>

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

using namespace cv; using namespace std;

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.

ng dng x l nh trong thc t vi th vin OpenCV

imshow("Ket qua phat hien sau khi phep gian no", src2); } waitKey(0);

ng dng x l nh trong thc t vi th vin OpenCV

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

9. Tm bin nh da trn b lc Canny

ng dng x l nh trong thc t vi th vin OpenCV

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

Bc 2: Tnh ton gi tr gradient trong nh

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy

nV n

Lo

ng
Page 43

Bc 4: Chn ra bin ca i tng trong nh

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

ng dng x l nh trong thc t vi th vin OpenCV

Lo

ng

using namespace cv;

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

#include #include #include #include

ng dng x l nh trong thc t vi th vin OpenCV


"stdafx.h" <opencv2/core/core.hpp> <opencv2/imgproc/imgproc.hpp> <opencv2/highgui/highgui.hpp>

ng dng x l nh trong thc t vi th vin OpenCV

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

10. Chuyn i Hough, Pht hin ng thng, ng trn trong nh

nV n

Lo

ng

Chuyn i Hough cho ng thng.

ng dng x l nh trong thc t vi th vin OpenCV

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 = =

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy

nV n

Lo
Page 47

ng

Tm ng thng, ng trn trong nh.

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)

i vi ng trn, ta cng p dng hm tng t: cv::HougCircles(), nguyn mu ca hm nh sau:

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

ng dng x l nh trong thc t vi th vin OpenCV

Trong :

Chng trnh tm ng thng, ng trn trong nh:


#include #include #include #include #include "stdafx.h" <opencv2\core\core.hpp> <opencv2\imgproc\imgproc.hpp> <opencv2\highgui\highgui.hpp> <iostream>

using namespace cv; using namespace std;

void main() { Mat src = imread("DongHo.jpg", 1); Mat gray; cvtColor(src, gray, CV_BGR2GRAY); GaussianBlur(gray, gray, Size(9, 9), 2, 2 );

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

ng

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 ); }

ng dng x l nh trong thc t vi th vin OpenCV

Chng III. Lp trnh x l nh vi giao din MFC 1. Gii thiu v MFC

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
Page 51

nV n

2. Khi to project MFC

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

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
Page 52

nV n

Lo

ng

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
Page 53

nV n

Lo

ng

ng dng x l nh trong thc t vi th vin OpenCV

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

ID ca n, chng hn nh i thnh IDC_STATIC1, IDC_LABEL

ng dng x l nh trong thc t vi th vin OpenCV

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);

CString text; text_box.GetWindowTextA(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

HBITMAP image = (HBITMAP)LoadImageA(0, "D:/test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); btn.SetBitmap(image);

text_box.EnableWindow(flase); // Vo hieu hoa edit control text_box.EnableWindow(true); // Cho phep edit control hoat dong

slider.SetRange(0, 100); slider.SetPos(50);

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:

ng dng x l nh trong thc t vi th vin OpenCV

if(dlg.DoModal() == IDOK) { CString file_name = dlg.GetPathName();// lay duong dan day du }

void CxyzDlg::OnBnClickedButton1() { MessageBoxA(NULL, "Button1 duoc click", "Thong bao", 0); }

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 dng x l nh trong thc t vi th vin OpenCV

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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; }

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

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();

9. Chuyn t CString sang string


CString cstr = "chuoi cstring"; std::string str = std::string(cstr);

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

8. Chuyn t string sang CString:

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.

ng dng x l nh trong thc t vi th vin OpenCV

5. Chng trnh ti nh v hin th nh trn giao din MFC

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

} }

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
}

result.Format("%d", height_); l_height.SetWindowTextA(result); result.Format("%d",channels_); l_channels.SetWindowTextA(result); l_path.SetWindowTextA(path);

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);

Kt qu chy chng trnh nh sau:

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
Page 63

nV n

Lo

void CHienThiThongTinAnhDlg::OnBnClickedButton3() { // Thoat khoi chuong trinh this->OnCancel();

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().

ng dng x l nh trong thc t vi th vin OpenCV

Chng IV Mt s ng dng x l nh trong thc t.

ng dng x l nh trong thc t vi th vin OpenCV

1. My Photo Editor, phn mm chnh sa nh n gin

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); .
}

V file ci t ImgProcessing.cpp c dng nh sau (i vi hm tng gim sang):


// Brightness void ImgProcessing::Brightness(Mat &src, Mat &dst, int value) { if(src.channels() == 1) { for(int i = 0; i < src.rows; i++) for(int j = 0; j < src.cols; j++) dst.at<uchar>(i,j) = saturate_cast<uchar>(src.at<uchar>(i,j) + }

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); }

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

ng dng x l nh trong thc t vi th vin OpenCV

Cc hm khc c th ci t mt cch tng t ging nh nhiu bi trc cp. Phn xem trc kt qu chnh sa

ng dng x l nh trong thc t vi th vin OpenCV

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;

v c gn gi tr thng qua phng thc SetType(int type_) :


void ImgPreview::SetType(int type_) { this->type = type_;

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

BOOL ImgPreview::OnInitDialog() { CDialogEx::OnInitDialog();

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:

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

ng dng x l nh trong thc t vi th vin OpenCV

Phn chng trnh chnh

ng dng x l nh trong thc t vi th vin OpenCV

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)

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

void CMyPhotoEditorDlg::OnUpdateAdjustmentsInvert(CCmdUI *pCmdUI) { // Invert Image process.Invert(src, src); ImageDisplay(src); }

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:

ng dng x l nh trong thc t vi th vin OpenCV

V trong cc hm x l ta kim tra bin is_histogram update ca s view


void CMyPhotoEditorDlg::OnUpdateAdjustmentsInvert(CCmdUI *pCmdUI) { // Invert Image process.Invert(src, src); ImageDisplay(src); if(is_histogram) UpdateHistogram(0); if(is_history) history_list.AddString("Invert Image"); }

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

ng

V hm ValidateMenu() c dng nh sau:

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
else { } if(is_gray)

if(!is_load) { m_file->EnableMenuItem(ID_FILE_SAVE1, MF_DISABLED|MF_GRAYED); m_image->EnableMenuItem(ID_MODE_GRAYSCALE, MF_DISABLED|MF_GRAYED); save_btn.EnableWindow(false); }

m_file->EnableMenuItem(ID_FILE_SAVE1, MF_ENABLED); m_image->EnableMenuItem(ID_MODE_GRAYSCALE, MF_ENABLED);

nV n
Page 72

void CMyPhotoEditorDlg::OnUpdateFileOpen1(CCmdUI *pCmdUI) { // Open Image if (Load.DoModal() == IDOK) { is_load = true; } }

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 dng x l nh trong thc t vi th vin OpenCV

ng

ng dng x l nh trong thc t vi th vin OpenCV

} }

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

m_image->EnableMenuItem(ID_MODE_HSV, MF_DISABLED|MF_GRAYED); m_image->EnableMenuItem(ID_MODE_YCrCb, MF_DISABLED|MF_GRAYED);

Pht hin vng cha bin s xe v cch ly k t.

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

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 dng x l nh trong thc t vi th vin OpenCV

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.

ng dng x l nh trong thc t vi th vin OpenCV

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

ta s a hai k t ny v cng mt kch thc, chia nh cc k t thnh 16 nh khc nhau nh sau

ng dng x l nh trong thc t vi th vin OpenCV

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

ng

Trong hm count_pixel l hm tnh ton s pixel en trong mt nh


int count_pixel(Mat img, bool black_pixel = true) { int black = 0; int white = 0; for(int i = 0; i < img.rows; ++i) for(int j = 0; j < img.cols; ++j) { if(img.at<uchar>(i,j) == 0) black++; else white++; } if(black_pixel) return black; else return white; }

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

r.push_back(r[3] + r[6] + r[9] + r[12]); ... return r; //32 dac trung

ng dng x l nh trong thc t vi th vin OpenCV

svm.train_auto(data, label, Mat(), Mat(), params); svm.save("E:/svm.txt");

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

for(size_t t = 0; t < feature.size(); ++t) data.at<float>(index, t) = feature.at(t); label.at<float>(index, 0) = i; index++; }

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 dng x l nh trong thc t vi th vin OpenCV

ng
Page 80

ng dng x l nh trong thc t vi th vin OpenCV

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

void LprCore::do_process() { if(this->plate_detection() && this->plate_recognition()) done = true; }

Cc hm ly kt qu s tr v kt qu tng ng nh bin s, chui k t nhn dng c


vector<string> LprCore::get_text_recognition() { if(done) return this->text_recognition; } vector<Mat> LprCore::get_plate_detection() { if(done) return this->plates; }

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 dng x l nh trong thc t vi th vin OpenCV

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 :

ng dng x l nh trong thc t vi th vin OpenCV

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.

Hm ci t cho nhn dng k t nh sau:

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy

nV n

void LprCore::set_svm_model(string file_name) { this->svm.load(file_name.c_str()); ready = true; }

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.

ng dng x l nh trong thc t vi th vin OpenCV

return c;

ng dng x l nh trong thc t vi th vin OpenCV

V cui cng, ton b k t trong bin s c nhn dng qua hm bool


plate_recognition()

} t = (double)cvGetTickCount() - t; t = (double)t/(cvGetTickFrequency()*1000.); //convert to second process_time.push_back(t); return true;

this->text_recognition.push_back(result);

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

ng dng x l nh trong thc t vi th vin OpenCV

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

};

Button Show Result s thc hin cc hm x l v hin th kt qu khi n c nhn vo.


// CLPRDlg.cpp void CLPRDlg::OnBnClickedButton2() { // Show results if(src.empty()) return; Mat disp_plate, disp_character;

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

afx_msg afx_msg afx_msg CStatic ...

ng dng x l nh trong thc t vi th vin OpenCV


void OnUpdateFileOpenimage(CCmdUI *pCmdUI); void OnBnClickedButton1(); void OnBnClickedButton2(); text_result;

ng dng x l nh trong thc t vi th vin OpenCV

} 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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

text_result.SetWindowTextW(to_wstring(text_recognition)); num_plate.SetWindowTextW(to_wstring((int)plates.size())); time_detection.SetWindowTextW(to_wstring(t[0]) + " ms"); ...

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

ng

3. MyCam, mt s hiu ng nh vi video.

ng dng x l nh trong thc t vi th vin OpenCV

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;

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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).

ng dng x l nh trong thc t vi th vin OpenCV

To chng trnh MyCam.

Mycamcore.h:

#pragma once #include <opencv2\core\core.hpp>

Ng

class MyCamCore { public: MyCamCore(void); ~MyCamCore(void);

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

void Gray(cv::Mat&, cv::Mat&); Page 92

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 dng x l nh trong thc t vi th vin OpenCV

ng

};

#include #include #include #include

"MyCamCore.h" <opencv2\core\core.hpp> <opencv2\highgui\highgui.hpp> <opencv2\imgproc\imgproc.hpp>

using namespace cv; MyCamCore::MyCamCore(void) { }

MyCamCore::~MyCamCore(void) { } void MyCamCore::Gray(Mat &src, Mat &dst) { if(src.channels() != 1) cvtColor(src, dst, CV_BGR2GRAY); else dst = src; }

void MyCamCore::ToHSV(Mat &src, Mat &dst) { }

Ng

void MyCamCore::Blur(Mat &src, Mat &dst) { } } Tc gi: Nguyn Vn Long long.06clc@gmail.com Page 93

uy

void MyCamCore::Invert(Mat &src, Mat &dst) { }

nV n

Lo

V mycamcore.cpp:

ng

void Invert(cv::Mat&, cv::Mat&); void ToHSV(cv::Mat&, cv::Mat&); void Blur(cv::Mat&, cv::Mat&);

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV


Cch ci t ny l kh ging vi cch ci t ca chng trnh x l nh n gin nh trn, ngha l c mt nh u vo src th qua php x l s cho ra mt nh dst, tuy nhin c mt s im khc l cc hm c ci t ti u hn gip cho vic hin th video c th lin tc, khng b git cc, chng hn nh vi hm invert. Hm invert c tc dng lm o ngc cc gii tr pixel nh, ngha l dst(x,y) = 255 src(x,y). ci t hm ny theo cch thng thng, ta phi duyt qua tt c cc phn t ca cc knh mu v thc hin php ton trn. Tuy nhin cch tip cn ti cc im nh trong mt nh l tn kh nhiu thi gian v kt qu l tn kh nhiu thi gian x l, lm cho video hin th ln b git cc. khc phc tnh trng ny ta quy nh v ma trn v thc hin php ton trn ma trn dst = matran(255) src, vi matran(255) l mt ma trn c cng kch thc v gi tri tt c cc pixel ton l 255. V OpenCV t i u ha cc php tnh trn ma trn (nh s dng c block cc nh ca bin ma trn thay v tip cn tng im, chia php ton thnh nhiu tiu trnh nh song song ) nn php thc hin trn s nhanh hn rt nhiu. Hm invert by gi c ci t nh sau:
void MyCamCore::Invert(Mat &src, Mat &dst) {

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:

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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 dng x l nh trong thc t vi th vin OpenCV

// MyCamDlg.h : header file #pragma once #include #include #include #include

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:

<opencv2\core\core.hpp> <opencv2\highgui\highgui.hpp> "MyCamCore.h" "afxwin.h"

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 =

ng dng x l nh trong thc t vi th vin OpenCV

};

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

ng dng x l nh trong thc t vi th vin OpenCV

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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:

ng dng x l nh trong thc t vi th vin OpenCV

15.

void CMyCamDlg::OnBnClickedInvert() { type = INVERT;

Hm ny c tc dng lu nh qua x l vi tn file nh l tn chui c to ra t hm CreateFileName nh ni trn v nh dng l jpg.


17. Hm khi click vo button Capture (ghi hnh) void CMyCamDlg::OnBnClickedCapture() { is_captured = !is_captured; if(is_captured) { video_file_name = CreateFileName() + ".avi"; if(size.height > 0 && size.width > 0)

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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);

btn_capture.SetBitmap((HBITMAP)(LoadImageA(0,"../MyCam/res/ capture.bmp",0, 0, 0, LR_LOADFROMFILE))); btn_snapshot.EnableWindow(true); btn_setting.EnableWindow(true); btn_folder.EnableWindow(true); Page 100

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):

ng dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV


if(writer.isOpened()) writer.release(); } }

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

Tc gi: Nguyn Vn Long long.06clc@gmail.com

uy
Page 102

nV n

Lo

Sau y l kt qu chy chng trnh v i trng hp to ra cc hnh i xng v nh m bn:

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 dng x l nh trong thc t vi th vin OpenCV

ng dng x l nh trong thc t vi th vin OpenCV

Ng

Tc gi: Nguyn Vn Long long.06clc@gmail.com

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

Das könnte Ihnen auch gefallen