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.