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,… ể : là m t tham s không b t bu c, xác đ nh ố ộ ki u tác đ ng c a hàm.

ể ◦ 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 #include using namespace std;

if(save ==NULL)

26/02/14

private: System::Void save(void) { ofstream save; save.open(“ "); {MessageBox::Show("ERROR: Khong doc duoc file"); return;} save <