22
ĐẠI HỌC ĐÀ NẴNG - ĐẠI HC BÁCH KHOA KHOA: CÔNG NGHTHÔNG TIN -----O0O------ BÁO CÁO THC HÀNH XNH SGiáo viên hướng dn : Ts. Hunh Hu Hưng Sinh viên thc hin : Võ Tá Hi Lp : 10T1LT.H2 Huế, tháng 03, năm 2012

Xla 10tlthue Votahai 10t1lth2 9484

Embed Size (px)

Citation preview

Page 1: Xla 10tlthue Votahai 10t1lth2 9484

ĐẠI HỌC ĐÀ NẴNG - ĐẠI HỌC BÁCH KHOA

KHOA: CÔNG NGHỆ THÔNG TIN

-----O0O------

BÁO CÁO

THỰC HÀNH XỬ LÝ ẢNH SỐ

Giáo viên hướng dẫn : Ts. Huỳnh Hữu Hưng

Sinh viên thực hiện : Võ Tá Hải

Lớp : 10T1LT.H2

Huế, tháng 03, năm 2012

Page 2: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 2

Mục Lục I. HƯỚNG DẪN CÀI ĐẶT OPENCV. ........................................................................ 3

1. Giới thiệu chung về thư viện OpenCV. .................................................................... 3

2. Hướng dẫn cài đặt OpenCV 2.1 với Visual Studio 2008.......................................... 3

3. Cấu hình Visual Studio 2008 liên kết với OpenCV. ................................................. 8

4. Tạo một project sử dụng OpenCV. ......................................................................... 10

II. SỬ DỤNG MỘT SỐ HÀM CƠ BẢN CỦA OPENCV. ......................................... 12

1. Tải ảnh, hiển thị lại. ................................................................................................ 12

2. Chuyển ảnh sang ảnh Gray, hiển thị. ...................................................................... 12

3. Chuyển ảnh Gray sang ảnh nhị phân, hiển thị. ...................................................... 13

4. Tách các kênh màu cvSplitPan, hiển thị. ................................................................ 14

5. Phát hiện biên bằng các phương pháp đã học, hiển thị. .......................................... 15

6. Lọc ảnh(blur,gauss,median), hiển thị. ..................................................................... 16

7. Ăn mòn, làm dày, hiển thị. ...................................................................................... 17

8. Cắt ngưỡng, hiển thị. ............................................................................................... 18

9. Tìm hiểu hàm phát hiện khuôn mặt trong OpenCV. .............................................. 19

Page 3: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 3

I. HƯỚNG DẪN CÀI ĐẶT OPENCV.

1. Giới thiệu chung về thư viện OpenCV.

OpenCV (Intel Open Source Computer Vision Library) là một thư viện mã nguồn

mở của Intel viết cho xử lý ảnh. OpenCV gồm các hàm được xây dựng cho việc xử lý thị

giác máy thời gian thực (real time computer vision). Các thuật toán xử lý ảnh thông

thường lẫn cao cấp đều được tối ưu hóa bởi các nhà phát triển thư viện thành các hàm đơn

giản và cho người dùng dễ dàng sử dụng. OpenCV hỗ trợ hai ngôn ngữ chính C/C++ và

python.

2. Hướng dẫn cài đặt OpenCV 2.1 với Visual Studio 2008.

Download miễn phí phần mềm OpenCV trên Internet.

Double click vào biểu tượng setup OpenCV 2.1. Cửa sổ setup sẽ hiển thị lên như

sau:

Hình 1.

Page 4: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 4

Nhấn Next, cửa sổ tiếp theo sẽ hiển thị:

Hình 2.

Đọc các điều khoản, đồng ý click vào I Agree, Cancel nếu không đồng ý và hủy bỏ

cài đặt. Chọn Iagree, cửa sổ tiếp theo sẽ hiển thị.

Hình 3.

Page 5: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 5

Ở đây chọn Add OpenCV to the system PATH for all users và tiếp tục click vào

Next.

Hình 4.

Chọn đường dẫn cài đặt cho chương trình, mặc định sẽ là C:\OpenCV2.1. Nhần

Next để tiếp tục.

Page 6: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 6

Hình 5.

Tiếp tục Next

Hình 6.

Ở đây chọn full để chương trình cài đặt toàn bộ thư viện. Sau đó click vào Install để

tiến hành cài đặt.

Page 7: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 7

Sau một khoản thời gian cài đặt:

Hình 7.

Click vào Finish để hoàn tất quá trình cài đặt.

Page 8: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 8

3. Cấu hình Visual Studio 2008 liên kết với OpenCV.

Mở Visual Studio 2008 lên. Click vào menu Tool, chọn Option, chọn Projects and

Solution.

Hình 8.

Tại Show directories for chọn: Include files. Tạo 2 derectory mới dẫn đến thư mục

đã cài OpenCV

Hình 9.

Tiếp theo cũng tại Show directories for chọn: Library files.

Page 9: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 9

Hình 10.

Cũng tương tự đối với Source files.

Hình 11.

Page 10: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 10

4. Tạo một project sử dụng OpenCV.

Chọn New Project, ở đây ta chọn Visual C++, Win32, Win32 Console Application.

Hình 12.

Nhấn chuột phải vào project chọn Properties/Configuration Properties/Linker/ Input.

Chọn Configuration là Debug. Tại Additional Dependencies đánh vào: cv210d.lib

cvaux210d.lib cxcore210d.lib cxts210d.lib cvhaartraining.lib highgui210d.lib ml210d.lib

opencv_ffmpeg210d.lib.

Page 11: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 11

Hình 13.

Page 12: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 12

II. SỬ DỤNG MỘT SỐ HÀM CƠ BẢN CỦA OPENCV.

1. Tải ảnh, hiển thị lại.

//Tai anh len

IplImage *im_rgb=cvLoadImage("../Images/tahai.jpg");

/*Hien thi anh goc*/

cvShowImage("Anh Goc ", im_rgb);

Kết quả khi chạy chương trình:

Hình 14.

2. Chuyển ảnh sang ảnh Gray, hiển thị.

//Doi sang anh Gray

IplImage *im_gray=cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1);

cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY);

//Hien thi anh Gray

cvShowImage("Anh Gray",im_gray);

Kết quả khi chạy chương trình:

Page 13: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 13

Hình 15.

3. Chuyển ảnh Gray sang ảnh nhị phân, hiển thị.

//Doi anh Gray sang anh Nhi Phan

IplImage*im_binary=cvCreateImage(cvGetSize(im_gray),IPL_DEPTH_8U,1);

cvThreshold(im_gray,im_binary,100,250,CV_THRESH_BINARY);

//Hien thi anh Nhi Phan

cvShowImage("Binary 8 bit",im_binary);

Kết quả khi chạy chương trình:

Hình 16.

Page 14: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 14

4. Tách các kênh màu cvSplitPan, hiển thị.

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);

// Tách Các kênh màu

cvSplit(im_rgb, imgBlue, imgGreen, imgRed, 0);

// Hien thi

cvShowImage("Blue Channel",imgBlue);

cvShowImage("Green Channel",imgGreen);

cvShowImage("Red Channel",imgRed);

Kết quả khi chạy chương trình:

Hình 17.

Page 15: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 15

Hình 18.

Hình 19.

5. Phát hiện biên bằng các phương pháp đã học, hiển thị.

IplImage* out = cvCreateImage( cvSize(im_gray->width/2,im_gray->height/2),

im_gray->depth, im_gray->nChannels);

// Reduce the image by 2

cvPyrDown( im_gray, out );

// Perform canny edge detection

cvCanny( out, out, 10, 100, 3 );

// Hien thi anh

cvShowImage("Lay Bien", out);

Kết quả khi chạy chương trình:

Page 16: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 16

Hình 20.

6. Lọc ảnh(blur,gauss,median), hiển thị.

IplImage* Filter_BLUR = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U, 3

);

IplImage* Filter_GAUSSIAN = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U,

3 );

IplImage* Filter_MEDIAN = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U, 3

);

cvSmooth( im_rgb, Filter_BLUR, CV_BLUR, 7, 7 );

cvSmooth( im_rgb, Filter_GAUSSIAN, CV_GAUSSIAN, 7, 7 );

cvSmooth( im_rgb, Filter_MEDIAN, CV_MEDIAN, 7, 7 );

//Hien thi anh

cvShowImage("Filter BLUR",Filter_BLUR);

cvShowImage("Filter GAUSSIAN",Filter_GAUSSIAN);

cvShowImage("Filter MEDIAN",Filter_MEDIAN);

Kết quả khi chạy chương trình:

Hình 21.

Page 17: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 17

Hình 22.

Hình 23.

7. Ăn mòn, làm dày, hiển thị.

IplImage* AnMon=cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,3);

IplImage* LamDay=cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,3);

//An mon

cvDilate( im_rgb, AnMon, NULL, 10);

//Lam day

cvErode( im_rgb, LamDay, NULL, 11);

//Hien thi

cvShowImage("An Mon",AnMon);

cvShowImage("Lam Day",LamDay);

Kết quả khi chạy chương trình:

Page 18: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 18

Hình 24.

Hình 25.

8. Cắt ngưỡng, hiển thị.

IplImage* CatNguong = cvCreateImage( cvGetSize(im_rgb), im_rgb->depth, 1 );

// Allocate image planes

IplImage* r = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U, 1 );

IplImage* g = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U, 1 );

IplImage* b = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U, 1 );

// Split image onto the color planes

cvSplit( im_rgb, r, g, b, NULL );

IplImage* s = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U, 1 );

Page 19: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 19

// Add equally weighted rgb values

cvAddWeighted( r, 1./3., g, 1./3., 0.0, s );

cvAddWeighted( s, 2./3., b, 1./3., 0.0, s );

// Truncate values over 100

cvThreshold( s, CatNguong, 100, 100, CV_THRESH_TRUNC );

//Hien thi

cvShowImage("Cat nguong",CatNguong);

Kết quả khi chạy chương trình:

Hình 26.

9. Tìm hiểu hàm phát hiện khuôn mặt trong OpenCV.

A. Phát hiện khuôn mặt trong hình ảnh.

Trong OpenCV đã có sẵn file “haarcascade_frontalface_alt.xml”, chúng ta chỉ

việc lấy nó ra và sử dụng. Khi lấy file này ra thì chúng ta phải chỉ đường dẫn cho thật

chính xác.

Ví dụ: tôi cài OpenCV 2.1 trên ổ C nên đường dẫn file

“haarcascade_frontalface_alt.xml” sẽ là:

"C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml”.

Page 20: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 20

Sau đây là code chương trình:

int main()

{

CvHaarClassifierCascade * pCascade = 0; //con trỏ nhận diện, nắm giữ data

trong file XML

CvMemStorage * pStorage = 0; //khởi tạo bộ nhớ đệm

CvSeq * pFaceRectSeq;

int i;

//khởi tạo

IplImage * pInpImg = cvLoadImage("../nd.jpg",CV_LOAD_IMAGE_COLOR);

pStorage = cvCreateMemStorage(0);

pCascade = (CvHaarClassifierCascade

*)cvLoad(("C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml"),0,0

,0);

if (!pInpImg || !pStorage || !pCascade )

{

printf("Khoi tao that bai: %s \n",

(!pInpImg)? "khong the load file hinh anh" :

(!pCascade)? "khong the load file xml -- "

"kiem tra dung duong dan":"sai duong dan");

exit(-1);

}

//nhận dạng mặt trong ảnh

pFaceRectSeq = cvHaarDetectObjects(

pInpImg,

pCascade,

pStorage,

1.1,

3,

CV_HAAR_DO_CANNY_PRUNING,

cvSize(0,0));

//tạo sửa sổ để hiển thị hình ảnh

cvNamedWindow("Nhan dien khuon mat trong hinh anh",CV_WINDOW_AUTOSIZE);

//vẽ hình chữ nhật xung quanh khuôn mặt

for (i=0;i<(pFaceRectSeq ? pFaceRectSeq->total:0);i++)

{

CvRect * r = (CvRect*)cvGetSeqElem(pFaceRectSeq,i);

CvPoint pt1 = {r->x,r->y};

CvPoint pt2 = {r->x + r->width,r->y + r->height};

cvRectangle(pInpImg,pt1,pt2,CV_RGB(255,0,0),3,4,0);

}

//hiển thị nhận diện

cvShowImage("Nhan dien khuon mat trong hinh anh",pInpImg);

cvWaitKey(0);

cvDestroyAllWindows();

//giải phòng bộ nhớ

cvReleaseImage(&pInpImg);

if (pCascade) cvReleaseHaarClassifierCascade(&pCascade);

if (pStorage) cvReleaseMemStorage(&pStorage);

}

Page 21: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 21

Kết quả sau khi chạy chương trình:

Hình 27.

B. Phát hiện khuôn mặt trong Webcam.

Sau đây là code chương trình:

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include <iostream>

#include <cstdio>

using namespace std;

using namespace cv;

int main(int argc, char *argv[])

{

int c;

IplImage* image;

//Mo WebCam

CvCapture* capture = cvCaptureFromCAM(0);

cvNamedWindow("NHAN DIEN KHUON MAT",0);

for(;;)

{

image = cvQueryFrame(capture);

CvHaarClassifierCascade* cascade;

CvMemStorage* storage;

CvSeq* faces;

storage=cvCreateMemStorage(0);

//Load du lieu tu file XML

cascade =

(CvHaarClassifierCascade*)cvLoad("C:/OpenCV2.1/data/haarcascades/haarcascade_fr

ontalface_alt.xml",NULL, NULL, NULL);

Page 22: Xla 10tlthue Votahai 10t1lth2 9484

Báo cáo: Thực hành Xử Lý Ảnh Số GVHD: Ts. Huỳnh Hữu Hưng

SVTH: Võ Tá Hải. Lớp: 10T1LT.H2 Trang: 22

faces = cvHaarDetectObjects( image, cascade, storage, 1.2,

2,0,cvSize(0,0));

for(int i=0;i<(faces ? faces->total:0); i++ )

{

CvRect* r = (CvRect*)cvGetSeqElem(faces, i );

CvPoint pt1 = { r->x, r->y };

CvPoint pt2 = { r->x + r->width, r->y + r->height };

cvRectangle( image, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );

}

//Hien thi cua so nhan dang khuon mat

if(image != 0)

cvShowImage("NHAN DIEN KHUON MAT", image);

c = cvWaitKey(10);

if(c == 27)

break;

}

cvWaitKey(0);

cvDestroyAllWindows();

return 0;

}

Kết quả sau khi chạy chương trình:

Hình 28.