ĐẠ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
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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
Trang: 2
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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:
Trang: 3
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 1.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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ị.
Trang: 4
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 3.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Ở đâ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
Trang: 5
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Next để tiếp tục.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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 để
Trang: 6
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
tiến hành cài đặt.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Sau một khoản thời gian cài đặt:
Hình 7.
Trang: 7
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Click vào Finish để hoàn tất quá trình cài đặt.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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.
Trang: 8
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Tiếp theo cũng tại Show directories for chọn: Library files.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Hình 10.
Cũng tương tự đối với Source files.
Trang: 9
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 11.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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
Trang: 10
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
cvaux210d.lib cxcore210d.lib cxts210d.lib cvhaartraining.lib highgui210d.lib ml210d.lib opencv_ffmpeg210d.lib.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Trang: 11
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 13.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
II. SỬ DỤNG MỘT SỐ HÀM CƠ BẢN CỦA OPENCV.
//Tai anh len IplImage *im_rgb=cvLoadImage("../Images/tahai.jpg"); /*Hien thi anh goc*/ cvShowImage("Anh Goc ", im_rgb);
1. Tải ảnh, hiển thị lại.
Kết quả khi chạy chương trình:
Hình 14.
//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);
2. Chuyển ảnh sang ảnh Gray, hiển thị.
Trang: 12
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Kết quả khi chạy chương trình:
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Hình 15.
//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);
3. Chuyển ảnh Gray sang ảnh nhị phân, hiển thị.
Kết quả khi chạy chương trình:
Trang: 13
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 16.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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:
4. Tách các kênh màu cvSplitPan, hiển thị.
Trang: 14
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 17.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Hình 18.
Hình 19.
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:
Trang: 15
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
5. Phát hiện biên bằng các phương pháp đã học, hiển thị.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Hình 20.
//Hien thi anh
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 ); cvShowImage("Filter BLUR",Filter_BLUR); cvShowImage("Filter GAUSSIAN",Filter_GAUSSIAN); cvShowImage("Filter MEDIAN",Filter_MEDIAN);
6. Lọc ảnh(blur,gauss,median), hiển thị.
Kết quả khi chạy chương trình:
Trang: 16
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 21.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Hình 22.
Hình 23.
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);
7. Ăn mòn, làm dày, hiển thị.
Trang: 17
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Kết quả khi chạy chương trình:
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
Hình 24.
Hình 25.
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* CatNguong = cvCreateImage( cvGetSize(im_rgb), im_rgb->depth, 1 ); // Allocate image planes
IplImage* s = cvCreateImage( cvGetSize(im_rgb), IPL_DEPTH_8U, 1 );
Trang: 18
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
8. Cắt ngưỡng, hiển thị.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
// 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
Trang: 19
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
“haarcascade_frontalface_alt.xml” sẽ là: "C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml”.
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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); }
Trang: 20
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Sau đây là code chương trình:
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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.
int c;
//Mo WebCam
CvMemStorage* storage;
storage=cvCreateMemStorage(0); //Load du lieu tu file XML
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include
Trang: 21
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Sau đây là code chương trình:
Báo cáo: Thực hành Xử Lý Ảnh Số
GVHD: Ts. Huỳnh Hữu Hưng
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 );
for(int i=0;i<(faces ? faces->total:0); i++ ) { }
faces = cvHaarDetectObjects( image, cascade, storage, 1.2, 2,0,cvSize(0,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:
Trang: 22
SVTH: Võ Tá Hải. Lớp: 10T1LT.H2
Hình 28.