26/02/14
Email: haithanh04@gmail.com ĐT: 0977599971
i thi u OpenCV
Gi ớ ệ S d ng OpenCV ử ụ Cài đ t OpenCV v i Visual Studio 2008 ớ ặ Ví d minh h a ọ ụ
26/02/14
ự
ạ
t và c c m nh, t c nh ng thao các c ơ
ỗ ợ ầ ả
ề ủ
ữ
Open Source Computer Vision Library. Là s n ph m c a Intel. ủ ả ẩ Là m t b th vi n r t t ộ ộ ư ệ ấ ố h tr h u h t t ế ấ ả ữ b n trong các v n đ c a Computer ấ Vision. Đ c vi t b ng ngôn ng C. ế ằ ượ Đ c s d ng nghi u ề ượ ử ụ
26/02/14
26/02/14
c vi
T t các các t
ấ
ế
ừ
ộ ắ ầ
ừ
ở ấ
khóa, các h ng đ u đ ằ ở ế ạ
ề ượ ữ ầ i (_). cách nhau b i d u g ch d ướ
c vi
ữ
ế
ấ
t hoa toàn b , b t đ u b i ti p đ u ng “CV”, các t ◦ Ví d : ụ CV_RGB2GRAY . Tên c a hàm và c u trúc đ ữ
ủ ỗ
ầ
ượ ử ụ ấ
cvFindContours và c u trúc
CvPoint.
ấ
t hoa ch cái đ u m i ch có nghĩa và s d ng ti p đ u ng ữ ầ ế “cv” cho hàm và “Cv” cho c u trúc. ◦ Ví d : hàm ụ
26/02/14
ộ
ấ
ủ
cv
<đ i t
ư ng> ố ượ
•
ộ
ượ ử ụ
c s d ng. Ví d nh ụ ư
ng mà hành đ ng
Thao tác nào đ –Set–, –Convert–, –Create–. : Ch đ nh đ i t ị
ỉ
ố ượ
ộ
Tên c a m t hàm có c u trúc nh sau: ộ
ng> ố ượ i. ng t ớ
ắ
ộ
ị
◦ Ví d : cvụ GetRow, cvCreateImage,…
ủ
ộ
ể ◦ Ví d : ụ
cvGet1D, cvGet2D cvFindExtrinsicCameraParams_64d
26/02/14
<đ i t h ướ
CxCore bao g m:ồ ấ
t khác
ộ ố
ấ
ế
◦Các c u trúc d li u c b n ữ ệ ơ ả ◦Các thao tác lên array ◦Các hàm v ẽ ◦Các c u trúc đ ng ấ ộ ◦Các hàm tác đ ng lên d li u ữ ệ ộ ◦M t s hàm và c u trúc c n thi ầ
26/02/14
CvPoint: c u trúc t a đ c a 1 đi m
ọ ộ ủ
ể
ấ
ọ ớ
nhả ◦Cùng h v i CvPoint còn có: CvPoint2D32f: ch a t a đ th c, ứ ọ ộ ự CvPoint3D32f: ch a t a đ th c c a đi m trong ứ ọ ộ ự ủ
ể
không gian.
Ngoài ra còn có CvPoint2D64f, CvPoint3D64f
26/02/14
CvSize: Ch a thông tin đ l u l
i kích
ể ư ạ
ứ
th
cướ
ộ ấ
c s ượ ử
d ng khá nhi u.)
ụ
IplImage: Ch a đ ng thông tin c a 1
CvRect: Hình ch nh t ữ ậ CvMat: ma tr n (m t c u trúc đ ậ ề ứ ự
ủ
nh.ả
26/02/14
Nhóm Create: Là nh ng hàm kh i t o các c u ữ
ở ạ
ấ
Nhóm tác đ ng vào nh ng ph n t
c a Array
ầ ử ủ
ữ
trúc ◦ cvCreateImage, cvCreateMat ộ ◦ cvGetRow, cvGetCol, …
Nhóm các hàm Copy và Fill
◦ cvCloneImage, cvCopy
Các hàm thay đ i hình d ng
ổ
ạ
◦ cvReshape, cvRepeat, …
Các thao tác s h c ố ọ
◦ cvAdd, cvSub, cvMax, ...
26/02/14
tiêu bi u là
ể ng, tích vô
ế ữ ướ
Các hàm đ i s tuy n tính. ạ ố nhân ma tr n, tích h u h ậ ng…ướ h ◦cvDotProduct, cvMatMul,… Các bi n đ i r i r c ế ổ ờ ạ
◦cvDFT, cvDCT,...
Các hàm t o s ng u nhiên
ạ ố ẫ
26/02/14
ẳ
cvLine: v đo n th ng ạ ẽ cvRectangle: v hình ch nh t ữ ậ ẽ cvCircle: v hình tròn ẽ cvEllipse: v hình ellipse ẽ …
26/02/14
Nhóm x lý nh
ổ
ử ả ẫ ấ ổ
ế
ế ổ
ế
◦Các hàm l y m u, n i suy và bi n đ i hình ộ h cọ : Các bi n đ i Affine, bi n đ i kích th
c, …ướ
ệ
ầ
ng
◦Các hàm làm vi c trên các thành ph n liên thông: nh tìm các component, tìm các đ ườ ư vi n (FindContour)…
ề
ổ ệ
ể
ộ ọ
◦Các b l cộ ọ : Các hàm chuy n đ i h màu, b ộ l c Median, b l c Gaussian, Threshold… ọ ◦…
26/02/14
ấ
bao
ử ấ
g m x p x Contour, tính di n tích Contour… ồ
ng biên): ệ
Nhóm phân tích c u trúc ◦Các x lý trên Contour(đ ườ ỉ ◦Các tính toán hình h cọ :
Ví d : tìm hình ch nh t có di n tích nh nh t ấ
ữ ậ
ụ
ỏ
ệ c ướ
ữ ậ
ch a 2 hình ch nh t cho tr ứ ộ ố
M t s nhóm khác ộ
ể ả
ủ
ạ ả
◦Phân tích chuy n đ ng c a đi m nh ể ◦Phân đo n nh (segmentation)…
26/02/14
ạ
ủ c c a m t c a s . ộ ử ổ
Nhóm tác đ ng lên giao di n ệ ộ ệ ớ ử ổ: g m các hàm t o ◦ Các hàm làm vi c v i c a s ồ c a s , h y c a s , l y Handle c a m t c a s , ử ổ ủ ử ổ ấ ộ ủ ổ thay đ i kích th ướ ủ ổ ệ ớ
ộ
◦ Làm vi c v i chu t và bàn phím
: Cung c p m t ấ ng ng
ự ệ ươ ứ
ữ
ộ
đây ch có
ộ s hàm c b n x lý nh ng s ki n t ơ ả ử ố v i chu t và bàn phím. ớ ể
ỉ
◦ Các hàm hi n th nh lên c a s
ử ổ: Ở ị ả m t hàm duy nh t: cvvShowImage. ấ
ộ
Nhóm tác đ ng lên file nh ộ
ả
◦ cvLoadImage: đ c m t nh vào c u trúc IplImage ấ ộ ả ọ ◦ cvSaveImage: L u m t nh vào file ộ ả ư
26/02/14
Cài đ t Visual Studio 2008 và OpenCV
ặ
ư ụ
ư ụ
t c các file .lib trong th m c:
ư ụ
ư ụ
t c các file .dll trong th m c:
ư ụ
Cài Visual Studio Cài OpenCV 2.1.0 Liên k t th vi n ư ệ ế - Copy toàn b file .h trong th m c trong: ộ C:\OpenCV2.1\include\opencv vào th m c: C:\Program Files\Microsoft Visual Studio 9.0\VC\include - Copy t ấ ả C:\OpenCV2.1\lib vào th m c: C:\Program Files\Microsoft Visual Studio 9.0\VC\lib - Copy t ấ ả C:\OpenCV2.1\bin
vào th m c:
ư ụ
C:\WINDOWS\system32
26/02/14
Cài đ t Visual Studio 2008 và OpenCV
ặ
Vào Project-> Properties (Alt+F7)->Configuration Properties-
>Linker->Input->Additional Dependencies
và gõ đo n text sau: ạ cv210d.lib cxcore210d.lib highgui210d.lib cv210.lib cxcore210.lib
highgui210.lib
26/02/14
T o file m i đ l p trình
ớ ể ậ
ạ
File/New/Project/C++/Empty Project
26/02/14
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
ế ứ ả
1. T o bi n ch a thông tin nh và video ạ a. Hàm: IplImage* ten_anh = 0; // chua thong tin anh CvCapture* ten_video =0; // ch a thong tin video ư
26/02/14
b. Ví d :ụ
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
* T o m t khung anh m i: ạ ớ ộ
cvNamedWindow("Color", CV_WINDOW_AUTOSIZE);
* Hi n th 1 nh: ị ả ệ
cvShowImage("Color",img);
ử ổ ả
* Đóng c a s nh: cvDestroyWindow("Color"); * Đ c thông tin nh ả ọ
26/02/14
cvGetSize()
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
2. Đ c và hi n th file nh t máy tính. ọ ả ị ừ
ệ a. Hàm:
ườ ng d n”); ẫ
#include "highgui.h"
#include
int main()
{
IplImage* ten=cvLoadImage("c:/1.jpg"); // load anh
cvShowImage("anh",ten); // hien thi anh
cvWaitKey(); // cho den khi an 1 phim
return 0;
}
26/02/14
cvLoadImage() IplImage* ten=cvLoadImage(“đ cvShowImage("anh",ten); b. Ví d :ụ #include "cv.h"
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
3. L u nh ư ả
a. Hàm:
cvSaveImage() b. Ví d :ụ #include "highgui.h"
int main()
{
IplImage* ten=cvLoadImage("c:/1.jpg"); // load anh
cvShowImage("anh",ten); // hien thi anh
ư ả ớ ộ
return 0;
}
26/02/14
cvSaveImage("D:/test.bmp",ten); // L u nh v i m t tên khác cvWaitKey(); // cho den khi an 1 phim
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
H màu: Có 2 h màu hay dùng là: ệ ệ
- G: xanh lá cây B: xanh da tr iờ
RGB - g m 3 màu c b n R: đ ơ ả ồ ỏ
ồ HSV(B) - g m 3 thành ph n H: màu s c ắ ầ
- S: đ bão hòa V(B): đ sáng
ộ
ộ
Trong x lý nh hay dùng h HSV đ x lý, tìm kh i màu ệ ể ử ố
.
26/02/14
ử ả
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
: ệ
4. Chuy n h màu ể a. Hàm: cvCvtColor(anh_nguon,anh_dich, CV_BGR2HSV);// chuyen he mau
#include "highgui.h"
int main() {
IplImage* im_rgb=cvLoadImage("c:/1.jpg"); // load anh
cvShowImage("anh",im_rgb); // hien thi anh
IplImage*im_gray= cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1);
cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY);
cvShowImage("Anh Gray",im_gray);
cvWaitKey();
return 0;
}
26/02/14
cvCvtColor(anh_mau,anh_xam,CV_RGB2GRAY); // chuyen sang mau sam b. Ví d :ụ #include "cv.h"
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
#include "highgui.h"
int main() {
IplImage* im_rgb=cvLoadImage("c:/1.jpg"); // load anh
cvShowImage("anh",im_rgb); // hien thi anh
IplImage* imgRed = cvCreateImage(cvGetSize(im_rgb), IPL_DEPTH_8U, 1);
IplImage* imgGreen = cvCreateImage(cvGetSize(im_rgb), IPL_DEPTH_8U, 1);
IplImage* imgBlue = cvCreateImage(cvGetSize(im_rgb), IPL_DEPTH_8U, 1);
cvSplit(im_rgb, imgBlue, imgGreen, imgRed, 0);
cvShowImage("Blue Channel",imgBlue);
cvShowImage("Green Channel",imgGreen);
cvShowImage("Red Channel",imgRed);
cvWaitKey();
return 0; } 26/02/14
5. Tách các kênh màu: a. Hàm: cvSplit(im_rgb, imgBlue, imgGreen, imgRed, 0); b. Ví d :ụ #include "cv.h"
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
ừ
ể ả 6. Truy c p vào t ng đi m nh ậ a. Hàm: cvGet2D() cvSet2D()
ồ
- s=cvGet2D(img, i, j); s g m 3 thành ph n ầ s.val[2] – R (0-255) s.val[1] – G (0-255) s.val[0] – B (0-255)
26/02/14
- cvSet2D(img, i, j, s);
ể ả ỏ
#include "highgui.h"
int main() {
IplImage* im_rgb=cvLoadImage("c:/1.jpg"); // load anh
cvShowImage("anh",im_rgb); // hien thi anh
IplImage* copy=cvCreateImage(cvGetSize(im_rgb),8,3); //Create a new image
CvScalar s,c; // create two scalar variables
for(int i=0;i<(im_rgb->height);i++)
{ for(int j=0;j<(im_rgb->width);j++)
{ s=cvGet2D(im_rgb,i,j);
if((s.val[2]>100))
{ c.val[2]=255; c.val[1]=0; c.val[0]=0; cvSet2D(copy,i,j,c); }
else { c.val[2]=0; c.val[1]=0;c.val[0]=0; cvSet2D(copy,i,j,c); }
}
}
cvShowImage("Red",copy); // hien thi anh
cvWaitKey(); // cho an 1 phim bat ky
return 0;
}
26/02/14
b. Ví d : ụ - Tìm các đi m nh có màu đ >100 #include "cv.h"
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
ng tròn, ch nh t… ẽ ườ ng th ng, đ ẳ ư ậ ườ
7. Hàm v đ a. Hàm: cvLine(img, cvPoint(x,y), cvPoint(X,Y), cvScalar(0,0,255), 2);
26/02/14
cvCircle(img, cvPoint(X,Y), 3, CV_RGB(255,0,0), 3, 8, 0 ); cvRectangle(img,cvPoint(x,y), cvPoint(X,Y), cvScalar(0,255,255), 3); b. Ví d :ụ
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
ọ
8. Đ c camera a. Hàm:
cvCaptureFromCAM(CV_CAP_ANY) b. Ví d :ụ #include "cv.h"
#include "highgui.h"
#include
int main() { CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);
while ( 1 ){ IplImage* frame = cvQueryFrame( capture ); // chụp ảnh đ ngộ cvShowImage("Camera", frame ); if ( (cvWaitKey(10) & 255) == 27 ) break; // an Esc de thoat
}
26/02/14
}
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
9. Nhân dang khuôn m tặ
Trong OpenCV đã có s n file “ haarcascade_frontalface_alt.xml”, ẵ
ử ụ
ườ ẫ
26/02/14
ta ch vi c l y nó ra và s d ng. ỉ ệ ấ Đ ng d n: “ C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml ”. Ví d : ụ Tìm khuôn m t trong anh. ặ
ặ ả
Ví d :ụ Tìm khuôn m t trong nh. #include "cv.h"
#include "highgui.h"
#include
int main() {
while ( 1 )
{
IplImage* anh = cvLoadImage("c:/2.jpg"); // load anh
ậ ỏ
CvHaarClassifierCascade * con_tro = 0; //con tr nh n di n, CvMemStorage * dem = 0; //kh i t o b nh đ m ệ ớ ệ ở ạ ộ
dem = cvCreateMemStorage(0);
con_tro= (CvHaarClassifierCascade*)cvLoad(("C:/OpenCV2.1/data/
haarcascades/haarcascade_frontalface_alt.xml"),0,0,0);
CvSeq * khuon_mat= cvHaarDetectObjects(anh,con_tro, dem, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(0,0));
26/02/14
ữ ậ ẽ ặ //v hình ch nh t xung quanh khuôn m t
Ví d :ụ Tìm khuôn m t trong nh. ả ặ
//v hình ch nh t xung quanh khuôn m t ữ ậ ẽ ặ
for (int i=0;i<(khuon_mat ? khuon_mat->total:0);i++)
{
CvRect * r = (CvRect*)cvGetSeqElem(khuon_mat,i); CvPoint pt1 = {r->x,r->y};
CvPoint pt2 = {r->x + r->width,r->y + r->height};
cvRectangle(anh,pt1,pt2,CV_RGB(255,255,0),3,4,0);
}
cvShowImage("Nhan dien khuon mat",anh );
cvWaitKey();
}
return 0;
26/02/14
}
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
t ch ế ươ ng trình tìm m t trong camera. ặ
26/02/14
Ví d :ụ - Vi
ố X lý nh trong rôb t
ử ả
S đ kh i: ơ ồ ố
Camera
Máy tinh (xử lý)
(Rs232)
Chíp (AVR)
Đ ng cộ
ơ
26/02/14
ố X lý nh trong rôb t
ử ả
Thu t toán: ậ
Chụp ảnh
Lọc
X lý màu
ử
Tạo ngưỡng
Tìm tọa độ màu
Truyền thông
26/02/14
ố X lý nh trong rôb t
ử ả
Thu t toán tìm t a đ màu và truy n thông ộ Thu t toán tìm t a đ màu và truy n thông ộ
ọ ọ
ề ề
ậ ậ
a
b
c
…
Height Height
. . .
2
1
Width
26/02/14
tìm ra kh i màu đ th a mãn đi u ki n đ ra.
Ch ng trình t o ng ươ ạ ưỡ ỏ ng (tìm kh i màu đ ). ố
Tác d ng:ụ
ỏ ỏ
ề
ệ
ề
ố
IplImage* tao_nguong(IplImage* frame) { IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); cvCvtColor(frame, imgHSV, CV_BGR2HSV); //from RGB to HSV IplImage*img=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1); cvInRangeS(imgHSV, cvScalar(170,160,60), cvScalar(180,255,255), img);
26/02/14
return img; }
ề
ị
ề
ị
Ch ươ ng trình tìm t a đ kh i màu ọ ố ộ
26/02/14
void trackObject( IplImage* img) { CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments)); cvMoments(img, moments, 1); double moment10 = cvGetSpatialMoment(moments, 1, 0); double moment01 = cvGetSpatialMoment(moments, 0, 1); double area = cvGetCentralMoment(moments, 0, 0); if(area>100) { int posX = moment10/area; // truy n thông giá tr này int posY = moment01/area; // truy n thông giá tr này } free(moments); }
M t s hàm c
b n c a OpenCV
ộ ố
ơ ả ủ
t ch ế
26/02/14
Ví d :ụ - Vi ươ ( theo dõi b ng cách v đ ỏ ng theo màu di chuy n ) ng trình tìm và theo dõi màu đ trong camera. ằ ẽ ườ ể
L P TRÌNH GIAO DI N
Ậ
Ệ
ặ ố
ề
this->serialPort1->PortName = "COM1"; // đ t tên là Com1 this->serialPort1->BaudRate = 9600; // t c đ truy n 9600 this->serialPort1->Open(); // m c ng
ộ ở ổ
this->serialPort1->WriteLine("@"); // truy n ký t
@
ề
ự
26/02/14
1. Cài đ t c ng COM ặ ổ
L P TRÌNH GIAO DI N
Ậ
Ệ
textBox1->Text = so.ToString();
26/02/14
2. Hi n th s lên textbox ị ố ệ
L P TRÌNH GIAO DI N
Ậ
Ệ
this->trackBar2->Value = 2; // thi
ế ậ
textBox1->Text = this->trackBar2->Value ; // hi n th lên textbox1
t l p trackBar2 = 2 ị
ể
26/02/14
2. TrackBar
L P TRÌNH GIAO DI N
Ậ
Ệ
timer1->Interval = 1; timer1->Enabled = false; timer2->Interval = 10; timer2->Enabled = true;
26/02/14
3. Timer
L P TRÌNH GIAO DI N
Ậ
Ệ
this->checkBox1->Checked == true this->checkBox1->Checked == false
26/02/14
4. checkBox
L P TRÌNH GIAO DI N
Ậ
Ệ
private: System::Void captureImage(void)
{
}
private: System::Void captureImage( IplImage* img)
{
}
26/02/14
5. Ch ng trình con ươ
Vi
t ch
ng trình
ế
ươ
26/02/14
L P TRÌNH GIAO DI N
Ậ
Ệ
private: System::Void chup_anh(Void) {
CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); srcImage = cvQueryFrame(capture);
}
26/02/14
6. Ch ng trình ch p nh ươ ụ ả
L P TRÌNH GIAO DI N
Ậ
Ệ
ng trình hôm tr
c
ướ
ươ
private: System::Void xu_ly_anh(IplImage* img) { // ch }
26/02/14
7. Ch ng trình x lý nh, tìm ra loan đ … ươ ử ả ộ
L P TRÌNH GIAO DI N
Ậ
Ệ
private: System::Void hien_thi_anh( IplImage* img) {
IplImage* srcImage = img; if((pictureBox1->Image == nullptr)) {
Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height); pictureBox1->Image = bmpPicBox;
}
Graphics^ g = Graphics::FromImage(pictureBox1->Image); Bitmap^ bmp = gcnew Bitmap(srcImage->width, srcImage->height, srcImage->widthStep, System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(srcImage->imageData));
g->DrawImage(bmp, (pictureBox1->Width-srcImage->width)/2, (pictureBox1->Height-srcImage->height)/2);
pictureBox1->Refresh(); delete(g);
}
26/02/14
8. Hi n th nh lên pictureBox ị ả ệ
L P TRÌNH GIAO DI N
Ậ
Ệ
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
9. Hi n th nh lên pictureBox, trong timer ị ả ệ
chup_anh();
xu_ly_anh(srcImage1);
hien_thi_anh(srcImage2);
}
26/02/14
L P TRÌNH GIAO DI N
Ậ
Ệ
10. Bài t pậ
ậ
ế ế t giao di n x lý nh cho robot xoay theo v t màu đ . ỏ t giao di n x lý nh cho robot xoay, d kho ng cách v i v t ớ ậ ử ử ệ ệ ả ả ữ ả
26/02/14
Bài 1: Vi Bài 2: Vi màu đ .ỏ
H ng d n
ướ
ẫ
26/02/14
H ng d n
ướ
ẫ
26/02/14
#include
#include
using namespace std;
26/02/14
private: System::Void load(void) { ifstream red_; red_.open(“D:\abc.txt "); red_>>r_r;red_>>r_g;red_>>r_b; red_.close(); textBox1->Text = r_r.ToString(); textBox2->Text = r_g.ToString(); textBox3->Text = r_b.ToString(); }
#include
#include
using namespace std;
26/02/14
private: System::Void load(void) { ifstream red_; red_.open(“D:\abc.txt "); red_>>r_r;red_>>r_g;red_>>r_b; red_.close(); textBox1->Text = r_r.ToString(); textBox2->Text = r_g.ToString(); textBox3->Text = r_b.ToString(); }
#include
if(save ==NULL)
26/02/14
private: System::Void save(void)
{
ofstream save;
save.open(“ ");
{MessageBox::Show("ERROR: Khong doc duoc file");
return;}
save <