Professional Documents
Culture Documents
Ung Dung Xu Ly Anh Trong Thuc Te Voi Thu Vien OpenCV PDF
Ung Dung Xu Ly Anh Trong Thuc Te Voi Thu Vien OpenCV PDF
Lo
ng
Ng
uy
long.06clc@gmail.com
Page 1
ng
M u
Ng
uy
nV
n
Lo
Page 2
ng
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
nV
n
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
Page 3
ng
Mc Lc
Lo
nV
n
5
5
6
12
13
17
19
23
27
30
37
43
46
uy
1.
2.
3.
4.
5.
51
51
54
59
61
Ng
64
73
90
Page 4
ng
Lo
nV
n
uy
Ng
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
nV
n
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
Page 6
Lo
ng
uy
nV
n
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
Page 7
nV
n
Lo
ng
uy
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
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.
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
Page 9
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.
Page 10
nV
n
Lo
ng
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.
Page 11
ng
#include
#include
#include
#include
"stdafx.h"
<iostream>
<opencv2\highgui\highgui.hpp>
<opencv2\core\core.hpp>
Lo
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
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:
Ng
uy
Page 13
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
nV
n
uy
Ng
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
nV
n
Lo
ng
Ng
uy
Page 15
<1
<2
<3
<4
<5
<6
nV
n
0
1
2
3
4
5
Lo
(0, 0, 0)
( , , 0)
( , , 0)
(0, , )
( 1, 1, 1) =
(0, , )
( , 0, )
, 0, )
ng
uy
#include
#include
#include
#include
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
ng
Ng
Page 17
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
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
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
Ng
Page 19
Lo
ng
nh xm
nh nh phn
uy
nV
n
Ng
T = 50
T = 100
T = 150
Page 20
nV
n
Lo
ng
uy
// Adaptive Threshold
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
Ng
int main()
{
cout<<"Nhi phan anh voi nguong dong"<<endl;
Mat src = imread("Thap_But.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat dst;
adaptiveThreshold(src, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C,
CV_THRESH_BINARY, 35, 5);
imshow("Anh xam goc", src);
imshow("Anh nhi phan voi nguong dong", dst);
waitKey(0);
Tc gi: Nguyn Vn Long long.06clc@gmail.com
Page 21
return 1;
ng
nV
n
Lo
Ng
uy
nh xm
nh nh phn
Page 22
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
#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
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
Page 23
cv::waitKey(0);
return 1;
Lo
ng
Ng
uy
nV
n
Page 24
nV
n
Lo
ng
uy
Ng
Ta c kt qu sau:
Page 25
Lo
ng
nV
n
#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
Page 26
Lo
ng
nV
n
uy
Hay x = x + y, y = x + y .
Xt ma trn =
Ng
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
. cos ()
sin ( )
sin ( )
th php bin i s
. cos ( )
uy
Ng
int main()
{
Mat src = imread("HoaSen.jpg");
Mat dst = src.clone();
double angle = 45.0;
Page 28
ng
Lo
(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
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
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
uy
v ta c kt qu:
Ng
7. Lc s trong nh
Page 30
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:
4
16
26
16
4
nV
n
1
2
1
1
4
7
4
1
+1
+2
+1
1
0
+1
2
0
+2
( , )
1
0
+1
( , )=
7
26
41
26
7
4
16
26
16
4
( , )
1
4
7
4
1
( , )
uy
Ng
nhn chp
pixel (2,2)
Page 31
nhn chp
pixel (2,3)
nV
n
Lo
ng
V kt qu cui cng ta c:
uy
nhn chp
Ng
Page 32
1
1
.
.
1
.
.
.
.
.
. 1
. 1
. .
. .
. 1
ng
1
1
.
.
1
nV
n
Lo
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
Page 33
nV
n
Lo
ng
Lc Laplace:
Lc Laplace l cch tnh xp x o hm bc hai trong nh, n c ngha quan
trng trong vic tm bin nh v phn tch, c lng chuyn ng ca vt th.
Ng
uy
0 1 0
1 4 1
0 1 0
Trong OpenCV, b lc ny c ci t qua hm:
cv::Laplacian(const Mat& src, Mat& dst, int ddepth, int ksize=1, double scale=1,
double delta=0, int borderType)
Cc thng s ny c ngha ging nh cc thng s trong b lc Sobel, ch khc
ch ksize l mt gi tr int mc nh bng 1 v khi ma trn lc laplace trn c
p dng.
nh qua php lc Laplace:
Page 34
Lo
ng
nV
n
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
"stdafx.h"
<opencv2\core\core.hpp>
<opencv2\imgproc\imgproc.hpp>
<opencv2\highgui\highgui.hpp>
Page 35
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
uy
1
7
1
Ng
1
= 1
1
1
1 ,
1
=0
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
uy
=0
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
Page 37
Lo
ng
uy
x
x
x
nV
n
Ng
Page 38
ng
nV
n
Lo
=( )
=( )
uy
Ng
Page 39
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
uy
Ng
Page 40
Lo
#include
#include
#include
#include
ng
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
Ng
Page 41
imshow("Ket qua phat hien sau khi phep gian no", src2);
waitKey(0);
ng
uy
nV
n
Lo
Ng
Page 42
ng
Lo
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
uy
Ng
Page 43
nV
n
Lo
ng
uy
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
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
Ng
Kt qu thu c sau cc ngng t1, t2 khc nhau, ta c nhng bin c chi tit khc
nhau nh hnh sau.
Page 45
uy
nV
n
Lo
ng
Ng
Page 46
ng
( )+
( )
nV
n
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.
uy
+
+
Ng
Page 47
ng
Lo
nV
n
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
Page 48
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 :
nV
n
#include
#include
#include
#include
#include
void main()
{
Mat src = imread("DongHo.jpg", 1);
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
GaussianBlur(gray, gray, Size(9, 9), 2, 2 );
uy
Ng
Page 49
ng
Lo
imshow("Anh sau khi tim thay duong thang - Duong tron", src);
waitKey(0);
Ng
uy
nV
n
Page 50
ng
Lo
nV
n
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
Page 51
nV
n
Lo
ng
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
Page 52
nV
n
Lo
ng
Ng
uy
Page 53
nV
n
Lo
ng
uy
Ng
Page 54
nV
n
Lo
ng
uy
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
Page 55
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
nV
n
uy
Ng
Page 56
ng
Lo
nV
n
uy
void CxyzDlg::OnBnClickedButton1()
{
MessageBoxA(NULL, "Button1 duoc
click", "Thong bao", 0);
}
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
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
Page 58
nV
n
Lo
ng
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
Ng
Page 59
ng
nV
n
Lo
uy
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".
Page 60
ng
Labels
Label
nV
n
Picture
control
Lo
Group Box
Button
uy
void CHienThiThongTinAnhDlg::OnBnClickedButton1()
{
// Load anh va hien thi anh
Ng
Page 61
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
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
uy
nV
n
Lo
void CHienThiThongTinAnhDlg::OnBnClickedButton3()
{
// Thoat khoi chuong trinh
this->OnCancel();
ng
Page 63
ng
uy
nV
n
Lo
Ng
Page 64
ng
#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
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);
Page 65
ng
Lo
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
BOOL ImgPreview::OnInitDialog()
{
CDialogEx::OnInitDialog();
nV
n
Lo
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
Page 67
ng
}
break;
nV
n
Lo
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
Ng
void ImgPreview::OnBnClickedButton1()
{
// Button OK
this->is_ok = true;
ImgPreview::OnCancel();
}
Page 68
ng
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
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
Page 69
ng
Lo
nV
n
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
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
nV
n
Ng
uy
Page 71
Lo
ng
nV
n
if (Load.DoModal() == IDOK)
{
is_load = true;
}
}
void CMyPhotoEditorDlg::ValidateMenu()
{
// Kiem tra tinh hop le cua menu trong tung truong hop
CMenu *m_file = GetMenu();
m_file->GetSubMenu(0);
uy
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)
Page 72
m_image->EnableMenuItem(ID_MODE_HSV, MF_DISABLED|MF_GRAYED);
m_image->EnableMenuItem(ID_MODE_YCrCb, MF_DISABLED|MF_GRAYED);
ng
Lo
uy
nV
n
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
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.
uy
Ng
Page 74
ng
Lo
uy
nV
n
Ng
Page 75
nV
n
Lo
ng
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
nV
n
Lo
ng
Ng
uy
Page 77
Lo
ng
nV
n
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);
}
}
Ng
Page 78
ng
nV
n
Lo
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
Lo
ng
nV
n
Ng
uy
Page 80
nV
n
Lo
ng
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
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;
}
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
Page 82
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
Ng
uy
Page 83
ng
Lo
nV
n
Ng
uy
Page 84
return c;
ng
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
Page 85
nV
n
Lo
ng
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
...
ng
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;
...
}
}
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];
Page 87
...
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
Page 88
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
Page 89
ng
Lo
nV
n
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
Ng
Page 90
ng
Ng
uy
nV
n
Lo
Page 91
Lo
ng
nV
n
uy
#pragma once
#include <opencv2\core\core.hpp>
Ng
class MyCamCore
{
public:
MyCamCore(void);
~MyCamCore(void);
Page 92
#include
#include
#include
#include
"MyCamCore.h"
<opencv2\core\core.hpp>
<opencv2\highgui\highgui.hpp>
<opencv2\imgproc\imgproc.hpp>
ng
V mycamcore.cpp:
Lo
};
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::ToHSV(Mat &src, Mat &dst)
{
Ng
}
Tc gi: Nguyn Vn Long long.06clc@gmail.com
Page 93
ng
nV
n
Lo
uy
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:
Page 94
nV
n
Lo
ng
uy
<opencv2\core\core.hpp>
<opencv2\highgui\highgui.hpp>
"MyCamCore.h"
"afxwin.h"
Ng
#include
#include
#include
#include
Page 95
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};
Page 96
ng
};
nV
n
Lo
uy
Ng
Page 97
nV
n
Lo
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
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;
}
Page 98
Lo
ng
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);
Page 99
15.
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
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);
Page 100
ng
if(writer.isOpened())
writer.release();
Lo
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);
}
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();
Page 101
ng
Ng
uy
nV
n
Lo
Page 102
nV
n
Lo
ng
uy
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
Page 103