You are on page 1of 10

Mt s hm x l nh trong OpenCV

OpenCV l mt th vin x l nh ngun m ca Intel. N c nhiu tc dng nh : nhn


dng mt, d tm mt, pht hin mt, lc Kalman, n th hin s a dng ca tr tu nhn to
(AI). Thm vo n ci thin rt nhiu cc thut ton c bn ca th gic my nh cc hm API
cp thp hn.
Hiu c phng thc lm vic ca chng nh th no l cch rt tt khi s dng
OpenCV. Trong bi ny, ti s gii thiu v OpenCV v cch s dng chng nhn dng nh,
d tm nh Sau ti s gii thch cch thc lm vic ca chng v a ra cho bn cc li
khuyn cng nh nhng kinh nghim c th tip thu chng mt cch tt nht.
Trong bi bo gii thiu ny. Ti s ni cho bn bit lm th no ci t v s dng mt
vi chc nng ca OpenCV trn my ca bn. Bn s hc c cch c v vit cc file nh, bt
nh, chuyn i gia cc nh dng nh v truy nhp vo d liu ca phn t nh ( fixel) thng
qua giao din OpenCV.

I.Tng quan v OpenCV
OpenCV l th vin x l nh m
ngun m hon ton min ph. Bn c th
ti n t a ch
http://sourceforge.net/projects/opencvlibrar
y .
Intel a ra phin bn OpenCV u
tin vo nm 1999. Ban u n yu cu phi
c th vin x l nh ca Intel. Sau v s
l thuc ny m h phi g b v by gi
chng ta c th s dng th vin ny hon
ton c lp.
OpenCV rt a dng, n h tr rt
nhiu h iu hnh nh: Window, Linux v
MacOSX.
II.Nhng im c trng
OpenCV c rt nhiu chc nng.
Bn c th bt ng khi ln u tip xc vi
n. Tuy nhin, bn s ch cn mt vi ln u khi ng n.
Sau y l nhng tm tt c bn v h thng cc v chc nng ca cc hm trong
OpenCV, m c th y l ver 1.0 ( phin bn ra cng thi gian vi bi vit ny)
2.1/Image and Video I/O
Nhng giao din ny s gip bn c c d liu nh t file hoc trc tip t video. Bn
cng c th to cc file nh v video vi giao din ny
2.2/Th gic my v cc thut ton x l nh ( General computer-vision and image-
processing algorithms(mid and low level APIs))
S dng nhng giao din ny, bn c th thc hnh vi rt nhiu chun th gic my m
khng cn phi c m ngun ca chng.
Figure 1:Rt nhiu tc dng ca OpenCV: d tm mt(
pha trn, bn tri), d bin( pha trn, bn phi), d
cnh (bn di)

2.3/Modul th gic my cp cao
OpenCV gm mt vi tc dng cp cao. Thm vo nhn dng mt, d tm, theo di.
N bao gm lung th gic ( s dng camera di ng xc nh cu trc 3D), kch c camera
v m thanh ni.
2.4/AI and machine-learning
Cc ng dng ca th gic my thng yu cu my mc phi hc ( machine learning)
hoc cc hnh thc tr tu nhn to khc. Mt vi trong s chng l c sn trong gi OpenCV
2.5/Ly mu nh v php bin i
N thng rt tt cho qu trnh x l mt nhm phn t nh nh l mt n v. OpenCV
bao gm ly tch ra, ly mu ngu nhin, phc ch, xoay nh, lm cong nh ( warping), thay i
hiu ng ca nh.
2.6/Cch thc to v phn tch nh nh phn
nh nh phn thng xuyn c dng trong cc h thng kim tra c khuyt im hnh
dng hoc cc b phn quan trng. S biu din nh cng rt thun tin khi chng ta bit r vt
th cn bt.
2.7/Cch thc cho tnh ton thng tin 3D ( methods for computing 3D information)
Nhng hm ny rt c ch khi cn sp xp v xc nh vi mt khi lp th (with a stereo
rig) hoc vi khng gian nhn phc tp ( multiple views) t mt camera ring.
2.8/Cc php ton cho x l nh, th gic my v biu din nh( image
interpretation)
OpenCV s dng cc php ton ph bin nh: i s hc, thng k v tnh ton hnh hc
2.9 / ha
Nhng giao din ny gip bn vit ch v v trn hnh nh. Thm vo nhng chc
nng ny c s dng nhiu trong ghi nhn v nh du. V d nu bn vit mt chng trnh
cn nhn dng nhiu i tng th n s rt c ch cho to nhn nh ( label image) vi kch thc
v v tr.
2.10/Phng thc GUI
OpenCV bao gm ca s giao din ca chnh bn thn n. Trong khi nhng giao din
ny c so snh gii hn vi kh nng c th thc hin trong mi mi trng. Chng cung cp
nhng mi trng API a phng tin v n gin hin th hnh nh, cho php ngi dng
nhp d liu thng qua chut , bn phm v iu khin qu trnh.
2.11 Cu trc d liu v gii thut
Vi nhng giao din ny bn c th gi li, tm kim, lu v cch danh mc iu khin,
cc tuyn tp(cng nh cc tp hp lnh c gi ), ha v s nhnh mt cch hiu qu.
2.12/Kh nng tn ti lu di ca d liu(Data persistence)

Nhng phng php ny cung cp cc giao din mt cch thun li lu tr cc dng
khc nhau ca d liu vo a c th khi phc khi cn thit.
Hnh 1 cho chng ta thy mt vi v d v tc dng ca OpenCV nh: nhn dng mt,
nhn dng ng vin, nhn dng bin.







3.Cch t chc


Cu trc OpenCV gm
nhiu module.
CXCORE bao gm cc
dng d liu c bn r rang. V
d cu trc d liu v nh,
im, hnh ch nht c xc
nh trong file cxtypes.h.
CXCORE cha cc php ton
i s tuyn tnh v thng k,
cc hm lu tr lu di (
persistence fun) v cc li
thao tc. C iu l lung thay l
cc hm ha c cho vic
v nh cng c lu tr ti
y.
CV cha ng qu trnh x l nh v cc phng php nh gi s b kch thc nh.
Nhng hm tnh ton hnh hc cng c lu tr ti y.
CVAUX c m t trong vn bn ca OpenCV nh l modul c v ch dng th
nghim. Tuy nhin, giao din n gin nht cho nhn dng mt c nm trong modul ny.
Nhng m ngun nm trong module ny rt ph hp cho vic nhn dng mt v chng c s
dng rng ri cho mc ch ny.
3.1/ML cha ng giao din machine- learning
Nhng hm cn li c nm trong HighGUI v CVCAM. C hai u nm th mc c
tn otherlibs, s dng chng rt d gp li. V rng HighGUI cha cc th vin vo ra c bn ,
bn s mun chc chn hn, ng b st n.N cng cha ng nhiu ca s a chc nng.
CVCAM l th vin cha cc hm truy nhp video thng qua DirectX trn mi trng
Window 32 bit. Tuy nhin, HighGUI cng c cc giao din video.Trong bi bo ny, ti ch xem
xt HighGUI. Chng n gin, lm vic trn nhiu mi trng. Nu bn s dng Window XP
hoc 2000, bn c th lm tng hiu qu ca n bng cch chuyn qua giao din CVCAM,
nhng hc OpenCV s n gin hn khi dng HighGUI.
4.Khi to OpenCV
4.1/Khi to c bn
OpenCV cho Linux v MacOSX c ng gi nh mt gi m ngun lu tr. Bn s
phi xy dng c th vin tnh v c nhng i tng chia s (shared-object). Bn cn xy dng
RPM trc tin v ci t t n, hoc bin dch v ci t n ngay.Cu trc cho c hai c nm
trong INSTALL.
Vi Window ta khi ci t OpenCV,n s cop file OpenCV vo th mc m bn chn.Cch thc
la chn trong ng dn h thng ca bn cha m nh phn OpenCV, ng k mt vi b lc
DirectX.Mc nh n ci t n C:/Program Files/OpenCV/<version>
4.2/Nhng yu cu khi khi to trng window
Vi ngi s dng Window, tht d dng ci t OpenCV, nhng ci t mc nh
lun lm vic. Nhng mt cht ci tin c th lm bn ko vui v v kt qu.V y l mt vi
gi nh.
Figure 2:Thm file header vo th mc include

K t lc OpenCV c pht trin nh mt b cng c - khng phi mt chng trnh-
bn mun lu n vo mt ni no khc na m khng phi th mc Program Files. Nu bn
thc s mun lu mt ni no khc th trc tin bn cn chy file ci t v in ci th mc
bn mun lu khi c hi.
Bn cng s quyt nh-trc khi khi to bn mun Window tm kim nhng file dlls
ca OpenCV nh th no?Bn c th la chn chnh sa ng dn h thng c sn ca bn thay
cho ng dn ca h hoc bn thay i th mc bin ca OpenCV bng th mc gc ca bn.
Nu bn thch chuyn nhng file dlls, nhng bn khng chc chc th mc gc ca bn
nm u, bn c th lu chng bng cch chy chng trnh sysinfo utility c sn a ch
www.cognotics.com/utilities
Nu bn thch chnh sa ng dn hn l thay i file dlls, bn c th khi ci t v
la chn vo hp thoi Add bin directory to PATH.
4.3/Sau khi khi to
Trong th mc OpenCV c ch mt vi th mc khc. Ta cng xem xt nhng th mc
. Th mc docs cha file vn bn html cho ton b cc hm OpenCV v kiu d liu.T file
vn bn ny bn c th lm cc v d, bn cng c th mun xem th mc samples.
Nhng file header s cn thit khi bn dch chng trnh s dng OpenCV.
C Linux v Window bn c th xc nh file header bng cch tm kim trong th mc
ci t v nhng th mc khc nhng file c dng *.h, *.hpp. S c rt nhiu tuy nhiu, tuy
nhin bn khng cn qu nhiu. Header dng cho tt c cc module tr HighGUI c tch ring
trong include. Bn c th b header trong th mc src. Khi dng HighGUI bn cn
highgui.h. N nm trong otherlibs/highgui.
5.Mt vi c bn v chng trnh ca OpenCV
5.1/Nhng th cn bit v Header v Library
Hu ht chng trnh OpenCV cn cv.h v highgui.h.Sau nhn dng mt chng ta
cn thm cvaux.h. Phn cn li ca file header c thm vo bi nhng header cao nht ( high-
level headers).
Nu bn c qun nhng file header trong nhnh th mc (ci t mc nh ) , bn phi
chc chn ng dn thm vo khi dch phi cha nhng th mc ny. Nu bn tng tp hp
cc header vo mt th mc , th chc chn ci th mc ny c thm vo khi dch.
Mi lin kt ca bn s cn c ng dn th vin ln tn ca th vin tnh c s
dng. Thu vin tnh bn cn lin kt ti cxcore.lib, cv.lib v highgui.lib. Sau phc v cho
qu trnh nhn dng mt bn cn lin kt ti cvaux.lib. Tt c th vin ny u nm trong th
mc lib ca OpenCV.
5.2/c v ghi hnh nh (S dng th vin: highgui.h)
Nhp v xut nh l rt n gin vi OpenCV. Hnh 3 cho chng ta thy mt chng
trnh hon chnh c mt nh t file v ghi n file th 2, trong mt inh dng khc.
Vic c mt file nh, ta gi hm cvLoadImage(), trong v d n nm dng th 12.
OpenCV h tr hu ht cc nh dng ph bin nh JPEG, PNG v BMP. Bn khng cn cung
cp cc thng tin nh dng. cvLoadImage() nhn din nh dng file bng cch c file header.

Vic ghi mt nh vo file ta gi hm cvSaveImage(). Hm ny quyt nh nh dng file
ta s dng t file ban u. Trong v d ny, file ban u c nh dng png, v vy n s ghi d
liu nh dng PNG.
Figure 3:V d chng trnh c
mt nh t file v ghi n vo mt
file khc vi dnh dng khc
C cvLoadImage() v
cvSaveImage() u nm trong
modul HighGUI.
Khi chng ta kt thc qu
trnh nhp nh v s dng xong
hm cvLoadImage(), chng ta cn
gi hm cvReleaseImage() nh
dng 29. Hm ny tr v a ch ca
im khi m ta nhp vo bi v n
m bo an ton d liu. N tr t
do cho cu trc nh nu n l khng
rng. Sau khi gii phng n, n to
mt im nh bng 0 ( image
pointer)

Trc khi hin th nh ln mn
hnh th chng ta phi bit lm nh
th no ti mt c t a.
Chng ta s s dng hm
cvLoadImage();
IplImage* cvLoadImage(
const char* filename,
int iscolor = CV_LOAD_IMAGE_COLOR
);
filename: Tn ng dn nh iscolor: Ch hin th nh
Mt s gi tr ca iscolor:
CV_LOAD_IMAGE_GRAYSCALE
CV_LOAD_IMAGE_ANYDEPTH
CV_LOAD_IMAGE_UNCHANGED
Sau khi c c nh t cng chng ta s hin th ln mn hnh
bng hm cvShowImage(); ng thi chng ta phi to mt ca s
hin th nh (Dng hm cvNamedWindow();)

cvNamedWindow(Tn ca s hin th);

void cvShowImage (
const char* name,
const cvArr* image
);
Name: tn ca s hin th nh
Image: tn nh
V d:
#include "highgui.h" int
main()
{
IplImage* img = cvLoadImage(imag); // To bin cha nh
cvNamedWindow("ShowIMG",CV_WINDOW_AUTOSIZE); // To mt ca
s hin th nh cvShowImage("ShowIMG",img); // hin th nh
cvWaitKey(0); // i ngi dng nhp vo mt phm bt k
cvReleaseImage(&img); // Gii phng b nh cha nh
cvDestroyWindow("ShowIMG"); // ng ca s cha nh
}
5.3/ Lu nh
void cvSaveImage (
const char* name,
const cvArr* image,
const int* params CV DEFAULT(0)
);
OpenCV lu tr nh ging nh trong C bi IplImage. Chun IPL cho th vin x l nh
l mt s tha k t phin bn OpenCV ban u.
Kiu d liu IplImage c xc nh trong CXCORE. Thm vo l d liu phn t
nh th.N cha mt vng c miu t, ci m ta gi l u nh ( Image Header). Chng
gm:
-Width: chiu rng ca phn t nh
-heght: chiu di ca phn t nh.
-Depth:Mt trong s vi gi tr khng i xc nh, n i hi s bit trn mi phn t
nh ca knh. V d, nu depth =IPL_DEPTH_8U , th d liu cho mi knh phn t nh c
lu bi 8 bit, v kiu unsigned.
-nChanel: S knh d liu ( T 1 n 4) . Mi knh cha mt kiu ca d liu phn t
nh. V d, nh RGB c ba knh: , xanh l cy v xanh sm ( thnh thong gi l mu BGR,
bi v d liu im nh c lu tr bi mu xanh sm, xanh l cy v sau l mu ).nh
en trng ch cha mt knh duy nht l sng ca im nh.


V d:
#include "highgui.h"
int main()
{
IplImage* img = cvLoadImage(imag); // To bin cha nh
cvNamedWindow("ShowIMG",CV_WINDOW_AUTOSIZE); // To mt ca
s hin th nh cvShowImage("ShowIMG",img); // hin th nh
IplImage* out = cvCreateImage(cvGetSize(img),img->depth,img-
>nChannels); cvConvertImage(img,out, CV_CVTIMG_FLIP); //
Chuyn i nh cvSaveImage("D:/test.bmp",img); // Lu nh vi
mt tn khc cvWaitKey(0); // i ngi dng nhp vo mt phm
bt k cvReleaseImage(&img); // Gii phng b nh cha nh
cvDestroyWindow("ShowIMG"); // ng ca s cha nh
}


5.4/Nhp video trc tip
Chp nh t mt webcam hoc t mt thit b hinh nh s khc tht d dng ging nh
chy t mt file.Hnh 4 cho chng ta mt danh sch chng trnh y c tc dng chp nh,
v lu tr mt vi trng thi video cng nh ng giao din chp li.
Giao din chp c khi to dng th 19 trong v d. N c gi ra bi hm
cvCaptureFromCAM(). Hm ny tr v mt im n mt cu trc cvCapture. Ta khng th truy
nhp v cu trc ny ngay c. Thay vo , ta s lu tr im ny thng qua hm
cvQueryFrame().
Sau khi kt thc qu trnh nhp video, gi hm cvReleaseCapture() gii phng m
ngun video. Ging nh cvReleaseImage(), ta tr a ch a ch ca im Cvcapture v hm
cvReleaseImage().
ng gii phng hoc thay i IplImage m bn nhn c t cvQueryFrame()! Nu bn
mun chnh sa d liu nh, hy to mt bn copy lm vic:
// Copy the video frame
IplImage *pImgToChange =
cvCloneImage(pVideoFrame);
// Insert your image-processing code here ...
// Free the copy after using it
cvReleaseImage(&pImgToChange);
5.4/Chuyn i mu
Hnh 5 trnh by m ngun chuyn i mt nh mu qua nh en trng. OpenCV h tr
chuyn i t nhiu chun mu mu khc nhau, gm RGB, HSV, YCrCb v CIELAB.
C mt ch l hm cvCvtColor() yu cu hai nh trong danh sch nhp vo ca n. Ci
u tin pRGBImg l nh ngun.Cn li l pGrayImg l nh gi ti.
Bi v m hnh ny ca m ngun ngu nhin( passing source) v nh gi ti l mt hm
qu trnh ph bin trong OpenCV.Bn s thng xuyn phi to mt nh gi ti. Trn dng 25,

gi hm CvCreateImage() to nh c cng kch c nh ban u, vi d liu nh ko c gi tr
bn u ( with uninitialized pixel data)

5.6/Truy nhp gi tr im nh
Ta c th to nhiu kiu ca hm s dng OpenCV m khng cn truy nhp n d liu
im nh ban u.V d, cc chng trnh nhn dng mt, theo di s c trnh by sau trong
lot bi ny khng cn phi iu khin d liu im nh ngay. Thay vo , chng lm vic vi
con tr nh v cc cu trc cao cp khc. Tt c cc cp im nh c tnh ton v trnh by
trong cc hm ca OpenCV. Tuy nhin, nu bn t vit thut ton x l nh ca mnh, bn c th
cn truy nhp n gi tr ca im nh ban u. y l hai cch lm iu :

5.6.1/Truy nhp im nh
mt cch n gin
Cch d nht c im nh
n l dng hm cvGet2D().
CvScalar
cvGet2D(const CvArr*,
int row, int col);
Hm ny c 3 thng s l :
-Mt con tr cha d liu (
CvArr*)
-Mt mng c xp theo
hang v theo ct
D liu cha ng c th c
cu trc IplImage.Ci hng cao nht
ca im nh c row =0 v hng thp
nht c row = chiu cao 1.
Hm cvGet2D() tr v cu trc
dng C l CvScalar c xc nh
nh sau:
typedef struct CvScalar
{
double val[4];
}
CvScalar;
Gi tr ca mi im nh cho
mi knh c nm trong val[i]. Vi
nh en trng, val[0] cha sng
ca im nh.Ba gi tr khc c t gi tr 0. Vi nh BGR th blue = val[0], green = val[1]
v red = val[2].
Ta c hm b sung cvSetd() cho php bn chnh sa gi tr im nh. N c khai bo
nh sau:
void cvSet2D(CvArr*, int row, int col,
CvScalar);
5.6.2/Truy nhp nhanh im nh
Figure 4: V d chng trnh chp nh video v lu chng vo mt file

Mc d cvGet2D() v cvSet2D() rt d s dng. Nu bn mun truy nhp nhiu hn vo
mt vi gi tr im nh v xem nhng vn ca n. Bn s mun c gi tr ny mt cch tc
thi t b m d liu ban u IplImage.imageData.

D liu nh
trong b m c lu
tr di dng mng 1D,
trong ch yu mt hng.
Tt c cc gi tr im
nh nm trong hng u
c lit k u tin.
Tip l nhng d liu
im nh nm trong
hng th hai .v.v
Nhng l do
lm vic ny l: D liu
im nh xp thng
hng v chn y nu
cn thit, n mc mi
mt hng bt u u l
bi chn ca bn byte.
Ngoi ra,
IplImage.widthStep biu
th s byte d liu im
nh ca mi dng. l
dng th i bt u
IplImage.imagedata+i*I
plImage.widthStep.
IplImage.imaged
ata c nh ngha kiu
char*, v vy bn cn
phi bn tnh cht ca
kiu d liu ny. V d ,
d liu nh c kiu unsigned ( loi ph bin nht), bn s cn hiu v unsigned char* trc khi
dng n hoc s dng ci khc n.
Nu bn truy nht d liu t nh en trng ( knh n) v chiu su nh l 8 bit ( 1 byte
trn 1 im nh), bn s cn truy nhp pixel[row][col] vi cu trc:
pixel[row][col] = ((uchar*)
(pImg->imageData +
row*pImg->widthStep + col));
Trong nh a knh, gi tr knh c kt hp cht ch vi nhau. y l mt trich on
m ngun truy nhp ti gi tr im nh blue, green v red:
step = pImg->widthStep;
nChan = pImg->nChannels;
// = 3 for a BGR image
buf = pImg->imageData;
Figure 5: V d chng trnh chuyn i nh mu qua nh en trng

blue[row][col] =
((uchar*)(buf + row*widthStep +
nChan*col);
green[row][col] =
((uchar*)(buf + row*widthStep +
nChan*col + 1);
red[row][col] =
((uchar*)(buf + row*widthStep +
nChan*col + 2);
Cui cng, nu chiu su nh ln hn 8 bit ( v d IPL_DEPTH_32S), bn s cn chuyn
i byte bi s cho mi gi tr v nhn n vi b m song song c s byte d liu cho
chiu su nh ca bn. N rt phi l, tuy nhin bn s gp tnh hung m bn cn truy nhp n
byte bi s ca n ngay tc th.

You might also like