You are on page 1of 103

nV

Lo

ng

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

Ng

uy

long.06clc@gmail.com

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

Page 1

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

ng

M u

Ng

uy

nV
n

Lo

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

Page 2

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

ng

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.

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.

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

Ng

uy

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

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

Page 3

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

ng

Mc Lc

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

Lo

Chng I. Lm quen vi th vin OpenCV

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

5
5
6

12
13
17
19
23
27
30
37
43
46

Chng III. Lp trnh x l nh vi giao din MFC

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

uy

1.
2.
3.
4.
5.

51
51
54
59
61

Chng IV. Mt s ng dng trong thc t

Ng

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

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

64
73
90

Page 4

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

Chng I. Lm quen vi th vin OpenCV

ng

1. Gii thiu v th vin OpenCV

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

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

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.

Ng

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

Page 5

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:

Lo

ng

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

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

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

uy

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

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

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

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

Page 6

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

Trn Microsoft Visual Studio

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

uy

nV
n

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

Ng

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

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

Page 7

nV
n

Lo

ng

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

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.
chng trnh c th chy c
vi th vin OpenCV ta cn ty chnh li mt s thuc tnh ca project nh sau

Ng

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

ng

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.

nV
n

Lo

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.

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, ta 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.

uy

Sau khi hon tt 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.
#include
#include
#include
#include

<opencv2/core/core.hpp>
<opencv2/imgproc/imgproc.hpp>
<opencv2/highgui/highgui.hpp>
<iostream>

Ng

using namespace std;


using namespace cv;
void main()
{
...
}

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

Page 9

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

Vi Eclipse CDT

Ng

uy

nV
n

Lo

ng

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
vi
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
ca
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.

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

Page 10

nV
n

Lo

ng

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

Ng

uy

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.

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

Page 11

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

ng

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


1. Chng trnh u tin

#include
#include
#include
#include

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

using namespace std;


using namespace cv;

Lo

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:

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

Ng

uy

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

Page 12

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

nV
n

Lo

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:

2. Khng gian mu, chuyn i gia cc khng gian mu

Ng

uy

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

Page 13

Khng gian mu CMYK.

Lo

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

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

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?

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

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

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

Hnh trn biu din mu sc (HUE)

nV
n

Khng gian mu HSV

Lo

ng

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 .

Chuyn i gia cc khng gian mu.

Ng

uy

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

Page 15

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


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

nV
n

Chng trnh chuyn i cc khng gian mu


0
1
2
3
4
5

Lo

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

(0, , )

( , 0, )

, 0, )

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:

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
"stdafx.h"
<opencv2/core/core.hpp>
<opencv2/imgproc/imgproc.hpp>
<opencv2/highgui/highgui.hpp>

uy

#include
#include
#include
#include

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

Lo

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

ng

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

3. iu chnh sang v tng phn trong nh

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

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


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

Ct m

0, 1
1, 1
2, 1
n, 1

0, m
1, m
2, m
n, m

0, m
1, m
2, m
n, m

0, m
1, m
2, m
n, m

Lo

Hng 0
Hng 1
Hng 2
Hng n

Ct 1

ng

Ct 0

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

uy

#include
#include
#include
#include

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:

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

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

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;

uy

nV
n

Lo

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 vi gi tr = 2.0 v = 30

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

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

Page 19

Lo

ng

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

nh xm

nh nh phn

uy

nV
n

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.

Ng

T = 50

T = 100

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

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

nV
n

Lo

ng

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:

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

uy

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

return 1;

ng

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)

nV
n

Lo

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

uy

nh xm

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

nh nh phn

Page 22

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

Lo

nV
n

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.

ng

5. Histogram, cn bng histogram trong nh

#include <iostream>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace std;
using namespace cv;

int main()
{
std::cout<<"Tim histogram anh mau"<<std::endl;

uy

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

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

Ng

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

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

Page 23

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

cv::waitKey(0);
return 1;

Lo

ng

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

uy

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

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

Page 24

nV
n

Lo

ng

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

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:

Ng

Mat src = imread("src.jpeg", CV_LOAD_IMAGE_GRAYSCALE); // Load anh xam


imshow("Anh xam goc", src);
Mat dst;
equalizeHist(src, dst);
imshow("anh xam sau khi can bang histogram", dst);

Ta c kt qu sau:

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

Page 25

Lo

ng

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

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 bng histogram ca nh mu
// 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);

Ng

uy

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

Sau y l kt qu ca chng trnh trn


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

Page 26

Lo

ng

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

nV
n

6. Phng to, thu nh v xoay nh

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:

uy

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 =

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

Ng

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

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

Page 27

Nu ta nh ngha ma trn

cos ( )
sin ( )

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

nV
n

gc quay l .

Lo

ng

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

Nu ma trn M c nh ngha thnh

. cos ()
sin ( )

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

uy

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>

Ng

using namespace cv;

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

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

Page 28

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

ng

double scale = 1.5;


Point2f center(src.cols/2, src.rows/2);

Lo

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:

(1 ).
. .
.
. (1 ).

nV
n

Vi

. cos (

) v

. sin (

.
.

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.

Ng

uy

Kt qu ca chng trnh trn v i t l scale = 1.5 v gc quay = 450 nh hnh sau

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

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

=
=

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:
ta s nh ngha ma

1 0.5 0
trt nh
0 1 0
ban u thnh nh mi vi h s trt
0
= 0.5, ch l thnh phn 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

nV
n

trn

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

uy

v ta c kt qu:

Ng

7. Lc s trong nh

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

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

Page 30

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

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.

Lo

ng

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:

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


0
0
0

4
16
26
16
4

nV
n

1
2
1

1
4

7
4
1

+1
+2
+1

1
0
+1

2
0
+2

Cng thc c th cho vic lc nh nh sau:


( , )=

( , )

1
0
+1

( , )=

7
26
41
26
7

4
16
26
16
4

( , )

1
4

7
4
1
( , )

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:

1/9 1/9 1/9

100 100 100 100 100

100 100 100 100 100

100 200 205 203 100

100 144 205 203 100

Ng

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

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

100 195 200 200 100

nhn chp

100 200 205 195 100

pixel (2,2)

100 100 100 100 100

Page 31

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


100 144 167 203 100

100 195 200 200 100

nhn chp

100 200 205 195 100

pixel (2,3)

100 100 100 100 100

nV
n

100 100 100 100 100

Lo

ng

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

V kt qu cui cng ta c:

1/9 1/9 1/9

100 100 100 100 100

100 100 100 100 100

100 200 205 203 100

100 144 167 145 100

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


100 200 205 195 100

uy

1/9 1/9 1/9

100 100 100 100 100

nhn chp

100 167 200 168 100


100 144 166 144 100
100 100 100 100 100

Ng

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.
Lc Blur:

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

Page 32

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


=

1
1
.
.
1

.
.
.
.
.

. 1
. 1

. .
. .
. 1

ng

Ma trn lc ca phng php ny c dng :

1
1

.
.
1

nV
n

Lo

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

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:
1
2
1

0
0
0

+1
+2
+1

1
0
+1

2
0
+2

1
0
+1

Ng

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

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

Page 33

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

nV
n

Lo

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:

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

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:

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

Page 34

Lo

ng

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

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

uy

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.

Ng

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>

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

Page 35

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

nV
n

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

using namespace cv;

uy

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:

1
7
1

Ng

1
= 1
1

1
1 ,
1

=0

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

Page 36

1
8
1

1
1 ,
1

1
= 1
1

1
8
1

1
1 ,
1

=0

nV
n

Lo

1
= 1
1

ng

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

uy

=0

8. Cc php ton hnh thi hc trong nh

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

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

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

uy

x
x
x

nV
n

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.

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

Page 38

ng

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


0

nV
n

Lo

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:

=( )

=( )

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

Ng

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)

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

Page 39

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

Lo

ng

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.

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:
dilate(const Mat& src, Mat& dst, const Mat& element, Point anchor=Point(-1, -1),
int iterations, int borderType, const Scalar& borderValue)

uy

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.

Ng

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


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

using namespace cv;


using namespace std;

Lo

#include
#include
#include
#include

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.

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

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

Ng

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

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

Page 41

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

uy

nV
n

Lo

Trong chng trnh trn, ta ln 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

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

ng

9. Tm bin nh da trn b lc Canny

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:

Lo

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:
4
9
12
9
4

5
12
15
12
5

4
9
12
9
4

2
4

5
4
2

nV
n

2
4
1
=
5
159
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 :

uy

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

Ng

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:

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

Page 43

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

nV
n

Lo

ng

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
Bc 4: Chn ra bin ca i tng trong nh

uy

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

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

ng

#include
#include
#include
#include

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

using namespace cv;

nV
n

Lo

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

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:

uy

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.

Ng

Kt qu thu c sau cc ngng t1, t2 khc nhau, ta c nhng bin c chi tit khc
nhau nh hnh sau.

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

Page 45

uy

nV
n

Lo

ng

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

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

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

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

ng

Chuyn i Hough cho ng thng.

Phng trnh ng thng trong h ta cc


c dng nh sau:
=

( )+

( )

nV
n

Trong , r l khong cch t gc ta O ti


ng thng, l gc cc.

Lo

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.

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.

uy

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

Page 47

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

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

Lo

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

nV
n

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)

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)

Ng

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


hm nh sau:
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

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

Lo

ng

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

Chng trnh tm ng thng, ng trn trong nh:


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

nV
n

#include
#include
#include
#include
#include

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

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

Ng

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

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

Page 49

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

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

Lo

imshow("Anh sau khi tim thay duong thang - Duong tron", src);
waitKey(0);

Ng

uy

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

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

Page 50

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

ng

Chng III. Lp trnh x l nh vi giao din MFC


1. Gii thiu v 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.

nV
n

2. Khi to project MFC

Ng

uy

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

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

Page 51

nV
n

Lo

ng

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

Ng

uy

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

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

Page 52

nV
n

Lo

ng

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

Ng

uy

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

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

Page 53

nV
n

Lo

ng

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

n y ta khi 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.

uy

3. Lm vic vi cc iu khin (Control) ca MFC

Ng

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

nV
n

Lo

ng

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

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

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

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

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:
HBITMAP image = (HBITMAP)LoadImageA(0, "D:/test.bmp", IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
btn.SetBitmap(image);

Lo

Enable, disable mt control


Ta s dng hm EnableWindow cho php control c c php s dng hay khng
text_box.EnableWindow(flase); // Vo hieu hoa edit control
text_box.EnableWindow(true); // Cho phep edit control hoat dong

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:
slider.SetRange(0, 100); slider.SetPos(50);

uy

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.

Ng

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

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

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

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:
if(dlg.DoModal() == IDOK)
{
CString file_name = dlg.GetPathName();// lay duong dan day du

Lo

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

uy

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.

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

ng

case 2:
MessageBoxA(NULL, "Ban chon DaNang", "Thong bao", 0);
break;
default:
MessageBoxA(NULL, "Khong chon?", "Thong bao", 0);
break;
}

Lo

Ng

uy

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 bng 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 thc hin. Hnh
bn ta in 3 menu chc nng nh l Open, Save v
Exit Khi to 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

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

Page 58

nV
n

Lo

ng

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

uy

void CxyzDlg::OnUpdateFileExit(CCmdUI *pCmdUI)


{
OnCancel();
}

Ngoi mt s iu khin thng dng nhc 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.

Ng

4. Chuyn i cc kiu d liu trong MFC

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

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

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.

8. Chuyn t string sang CString:


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

nV
n

vi ch bin dch c s dng Unicode:

Lo

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:

10. Chuyn t string sang CString:

std::string str = "chuoi string";


CStringW cstr = (CStringW)(str.c_str());

11. Chuyn t CString sang string

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

uy

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

13. Chuyn s sang CString

Ng

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

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

Page 60

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

ng

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

Ta to mt mi mt project, t tn project l HienThiThongTinAnh v thit k giao din


nh hnh sau:

Labels
Label

nV
n

Picture
control

Lo

Group Box

Button

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

uy

void CHienThiThongTinAnhDlg::OnBnClickedButton1()
{
// Load anh va hien thi anh

static CString Filter=_T("image files (*.bmp; *.jpg) |*.bmp;*.jpg|All


Files(*.*)|*.*||");

Ng

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

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

Page 61

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

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

Lo

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

uy

CString result;
result.Format("%d", width_);
l_width.SetWindowTextA(result);

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

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

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

Ng

uy

nV
n

Kt qu chy chng trnh nh sau:

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

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

Page 63

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

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

ng

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

uy

nV
n

Lo

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

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

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:

#pragma once
#include <opencv2\core\core.hpp>
using namespace cv;

nV
n

class ImgProcessing
{
public:
ImgProcessing(void);
~ImgProcessing(void);
// Ham xu ly
void Grayscale(Mat&, Mat&);
void ColorSpace(Mat&, Mat&, int);
void Brightness(Mat&, Mat&, int);
.

Lo

// heade file

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

uy

// 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) +
}

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

Ng
}

value);

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

Page 65

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

ng

Cc hm khc c th ci t mt cch tng t ging nh nhiu bi trc cp.


Phn xem trc kt qu chnh sa

Lo

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:

nV
n

Picture Control

Slider Control

Static text

Button

Ng

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

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

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

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

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

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;

uy

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

Page 67

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

ng

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:

}
break;

nV
n

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

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;

}
}

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()
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 bit rng ngi dung ng
vi vic chnh sa , ngc li nu nt Cancel c bm, bin ny s c gi tr false.

Ng

void ImgPreview::OnBnClickedButton1()
{
// Button OK
this->is_ok = true;
ImgPreview::OnCancel();
}

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

Page 68

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

ng

Phn chng trnh chnh

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.

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

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

uy

Files

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

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

ng

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:

Lo

void CMyPhotoEditorDlg::OnUpdateAdjustmentsInvert(CCmdUI *pCmdUI)


{
// Invert Image
process.Invert(src, src);
ImageDisplay(src);

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:

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

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

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

Page 70

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

Lo

ng

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

nV
n

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 .

Ng

uy

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

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

Page 71

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

Lo

ng

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 :

nV
n

void CMyPhotoEditorDlg::OnUpdateFileOpen1(CCmdUI *pCmdUI)


{
// Open Image

if (Load.DoModal() == IDOK)
{

is_load = true;

}
}

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

uy

CMenu *m_image = GetMenu();


m_image->GetSubMenu(1);

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

Ng

else
{

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

}
if(is_gray)

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

Page 72

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

ng

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

Lo

Hm EnableMenuItem() l hm cho php mt menu n hoc hin th thng qua tham s


MF_DISABLED hoc MF_ENABLED

uy

nV
n

Hnh sau l kt qu ca qu trnh x l khi ta iu chnh sng ca mt nh.

2. Nhn dng bin s xe

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

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

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

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.

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

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

Ng

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

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

Page 74

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

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.

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

uy

nV
n

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

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

nV
n

Lo

ng

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

uy

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

Page 76

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

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

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

uy

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

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

Lo

ng

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.

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

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

Ng

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

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

Page 78

r.push_back(r[3] + r[6] + r[9] + r[12]);


...
return r; //32 dac trung

ng

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

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

nV
n

Lo

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

uy

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

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

Lo

ng

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

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

svm.train_auto(data, label, Mat(), Mat(), params);


svm.save("E:/svm.txt");

Ng

uy

Trong oan chng trnh trn, ta ln lt c qua tt c cc folder con trong th mc


D:/Data bng hm list_folder (hm ny ta vit da trn header dirent.h, vi mc ch lit
k danh sch cc folder trong mt th mc), sau ta tnh ton tt c cc c trng ca
cc nh trong cc folder ny v lu vo ma trn data. Ma trn label cha nhn ca cc lp
cn nhn dng, n cng chnh l tn ca 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.

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

Page 80

nV
n

Lo

ng

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:

uy

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

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

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

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

uy

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

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

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 :

...

nV
n

Lo

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

Ng

uy

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

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

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

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.

Lo

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.

nV
n

void LprCore::set_svm_model(string file_name)


{
this->svm.load(file_name.c_str());
ready = true;
}

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

Ng

uy

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

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

Page 84

return c;

ng

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

nV
n

Lo

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);
}
this->text_recognition.push_back(result);

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

Ng

uy

Giao din chng trnh chnh


Ta thit k giao din chng trnh chnh bao gm cc picture control hin th nh, cc
button, menu cho vic iu khin v cc label hin th kt qu nh sau:

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

Page 85

nV
n

Lo

ng

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"

uy

// CLPRDlg dialog
class CLPRDlg : public CDialogEx
{
public:
CLPRDlg(CWnd* pParent = NULL);
enum { IDD = IDD_LPR_DIALOG };
...

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

};

afx_msg
afx_msg
afx_msg
CStatic
...

void OnUpdateFileOpenimage(CCmdUI *pCmdUI);


void OnBnClickedButton1();
void OnBnClickedButton2();
text_result;

ng

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

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.

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

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

uy

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

Ng

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

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

Page 87

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

...

Lo

}
else
{

ng

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

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

Ng

uy

Hnh sau m t kt qu chy chng trnh:

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

Page 88

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

Ng

uy

nV
n

Lo

ng

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

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

Page 89

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

ng

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

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.

nV
n

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

uy

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.

Ng

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

ng

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

uy

nV
n

Lo

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

Page 91

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

Lo

ng

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.

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

To chng trnh MyCam.

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 phn, 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:
Mycamcore.h:

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

Ng

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

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

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

Page 92

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

#include
#include
#include
#include

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

using namespace cv;

ng

V mycamcore.cpp:

Lo

};

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


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

nV
n

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

uy

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


{

}
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

ng

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

nV
n

Lo

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 ti 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)
{

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

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 thit k mt giao din trn Dialog nh sau:

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

Page 94

nV
n

Lo

ng

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

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 chn 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:
// MyCamDlg.h : header file
#pragma once

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

Ng

#include
#include
#include
#include

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

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

protected:
virtual void DoDataExchange(CDataExchange* pDX);

Ng

uy

nV
n

Lo

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

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 =

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

Page 96

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

ng

};

Cc bin iu khin ca chng trnh bao gm 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:

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:

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

uy

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

Ng

HBITMAP folder_bmp = (HBITMAP)LoadImageA(0,


"../MyCam/res/folder.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
btn_folder.SetBitmap(folder_bmp);
...

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

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

Page 97

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

nV
n

Lo

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

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

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

Ng

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

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

Page 98

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

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 din 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 kt thc trong hm
OnClose(). Hm Start c ci t nh sau:
void CMyCamDlg::Start()
{
if(!capture.isOpened()) return;
size = cv::Size((int) capture.get(CV_CAP_PROP_FRAME_WIDTH),
(int) capture.get(CV_CAP_PROP_FRAME_HEIGHT));

uy

nV
n

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;

Ng

default:
dst = src;
break;

}
cv::imshow("Video", dst);
if(is_captured && writer.isOpened())
writer << dst;
cv::waitKey(1);

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

Page 99

15.

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

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

nV
n

Lo

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

ng

Cc hm dng iu khin qu trnh x l video khi click vo cc button


u c chung mt dng lnh v c dng nh sau (gi s hm khi click vo button
btn_invert):

Hm ny 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.

uy

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

else
{

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

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

Page 100

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


}

ng

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

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.

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

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.

uy

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

Ng

std::ofstream ofs("config.txt");
if(!ofs) return;
ofs << fps <<std::endl;
ofs << output_folder;
ofs.flush();
ofs.close();
is_stoped = false;
Start();

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

Page 101

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

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 tip theo.

Ng

uy

nV
n

Lo

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


bn:

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

Page 102

nV
n

Lo

ng

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

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.

Ng

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

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

Page 103

You might also like