Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 108 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
108
Dung lượng
3,63 MB
Nội dung
ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA LÊ THANH TÙNG ĐIỀU KHIỂN MOBILE ROBOT DÙNG THỊ GIÁC MÁY TÍNH Chuyên ngành : TỰ ĐỘNG HĨA LUẬN VĂN THẠC SĨ TP HỒ CHÍ MINH, tháng 12 năm 2009 CƠNG TRÌNH ĐƯỢC HỒN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH Cán hướng dẫn khoa học : GVC.TS NGUYỄN ĐỨC THÀNH ………………………………………………………………………………… ………………………………………………………………………………… ………………………………………………………………………………… ………………………………………………………………………………… Cán chấm nhận xét : PGS.TS DƯƠNG HOÀI NGHĨA ………………………………………………………………………………… ………………………………………………………………………………… ………………………………………………………………………………… ………………………………………………………………………………… Cán chấm nhận xét : TS HUỲNH THÁI HOÀNG ………………………………………………………………………………… ………………………………………………………………………………… ………………………………………………………………………………… ………………………………………………………………………………… Luận văn thạc sĩ bảo vệ HỘI ĐỒNG CHẤM BẢO VỆ LUẬN VĂN THẠC SĨ TRƯỜNG ĐẠI HỌC BÁCH KHOA, ngày 08 tháng 01 năm 2010 TRƯỜNG ĐẠI HỌC BÁCH KHOA CỘNG HOÀ XÃ HỘI CHỦ NGHIÃ VIỆT NAM KHOA ĐIỆN – ĐIỆN TỬ Độc Lập - Tự Do - Hạnh Phúc -oOo Tp HCM, ngày 20 tháng 12 năm 2009 NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: LÊ THANH TÙNG Phái: Nam Ngày, tháng, năm sinh: 07/10/1983 Nơi sinh: HẢI DƯƠNG Chuyên ngành: TỰ ĐỘNG HÓA MSHV: 01507325 1- TÊN ĐỀ TÀI: ĐIỀU KHIỂN MOBILE ROBOT DÙNG THỊ GIÁC MÁY TÍNH 2- NHIỆM VỤ LUẬN VĂN: - Xây dựng chương trình nhận dạng hướng nhìn khn mặt sở dùng thị giác máy tính - Thiết kế chế tạo mơ hình mobile robot - Điều khiển mobile robot dựa vào hướng nhìn khn mặt 3- NGÀY GIAO NHIỆM VỤ : 12/02/2009 4- NGÀY HOÀN THÀNH NHIỆM VỤ : 20/12/2009 5- HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN : GVC.TS NGUYỄN ĐỨC THÀNH Nội dung đề cương Luận văn thạc sĩ Hội Đồng Chuyên Ngành thông qua CÁN BỘ HƯỚNG DẪN CHỦ NHIỆM BỘ MÔN QUẢN LÝ CHUYÊN NGÀNH KHOA QL CHUYÊN NGÀNH Để hồn thành tốt luận văn này, tơi xin chân thành cảm ơn q thầy gia đình dạy dỗ, động viên giúp đỡ suốt trình học tập Tơi xin chân thành cảm ơn Thầy TS.Nguyễn Đức Thành hướng dẫn, giúp đỡ tận tình tạo điều kiện thuận lợi cho thực luận văn Tôi xin chân thành cảm ơn thầy cô trường Đại học Bách Khoa, đặc biệt thầy cô môn Điều khiển tự động truyền đạt nhiều kiến thức tạo điều kiện để tơi hồn thành tốt luận văn Cuối cùng, xin cảm ơn anh chị bạn lớp Tự Động Hóa khóa 2007, giúp đỡ thời gian học tập Do thời gian có hạn nên luận văn khơng thể tránh khỏi thiếu sót, sai lầm mong nhận dẫn đóng góp quý thầy cô bạn Tp.HCM, ngày 30 tháng 11 năm 2009 Học viên thực Lê Thanh Tùng TÓM TẮT NỘI DUNG Luận văn trình bày kết nghiên cứu nhằm điều khiển mobile robot theo hướng thân thiện với người, phương pháp điều khiển dùng thị giác máy tính Người sử dụng điều khiển robot cử quay mặt sang trái, phải, lên, xuống nhờ vào hệ thống tự động nhận dạng hướng khn mặt Hệ thống có khả nhận dạng xác định vị trí khn mặt người ảnh video theo thời gian thực giải thuật Camshift, sau tính tốn hướng nhìn khn mặt cách tính tốn vị trí mũi khn mặt so sánh với vị trí điểm khn mặt vừa nhận dạng Q trình nhận dạng vị trí mũi thực phương pháp “không gian riêng” (eigenspace method) kết hợp với giải thuật PCA (Principle Component Analysis) Luận văn gồm có sáu chương với nội dung sau : Chương : Giới thiệu Giới thiệu cơng trình nghiên cứu có liên quan nước nước Chương : Cơ sở lý thuyết Trình bày sở lý thuyết cần thiết để thực đề tài Chương : Thuật tốn nhận dạng Trình bày thuật tốn giải thuật nhận dạng hướng khuôn mặt Chương : Chương trình kết Giới thiệu chương trình “Nhận dạng hướng nhìn khn mặt”, đánh giá kết nhận dạng điều khiển mobile robot dựa kết nhận dạng Chương : Kết luận hướng phát triển Đánh giá kết đạt đưa hướng phát triển cho luận văn MỤC LỤC Chương 1: TỔNG QUAN 1.1 Đặt vấn đề 1.1.1 Giới thiệu 1.1.2 Các định nghĩa có liên quan 1.2 Các cơng trình nghiên cứu có liên quan 1.2.1 Các cơng trình nghiên cứu nước 1.2.2 Các cơng trình nghiên cứu nước 1.3 Mục tiêu luận văn 1.3.1 Mục tiêu nhiệm vụ luận văn 1.3.2 Nội dung thực Chương 2: CƠ SỞ LÝ THUYẾT 2.1 Thị giác máy tính (Computer Vision) 2.1.1 Các lĩnh vực có liên quan 2.1.2 Chức hệ thống thị giác máy tính 2.1.3 Các hệ thống thị giác máy tính 10 2.1.4 Ứng dụng thị giác máy tính 11 2.2 Lí thuyết ảnh số xử lí ảnh 12 2.2.1 Khái niệm 12 2.2.2 Khái niệm phần tử ảnh 14 2.2.3 Cấu trúc file ảnh 15 2.2.4 Ảnh màu 15 2.2.5 Không gian màu (Color Space) 15 2.2.6 Chuyển đổi không gian màu 22 2.3 Các khái niệm xử lí ảnh số 24 2.3.1 Mục đích việc xử lí ảnh số 24 2.3.2 Lấy ngưỡng ảnh (Image Thresholding) 24 2.3.3 Kỹ thuật nâng cao chất lượng ảnh 25 2.3.4 Biến đổi lược đồ mức xám (Histogram) 26 2.3.3 Kỹ thuật lọc số - làm trơn nhiễu 27 2.3.4 Kỹ thuật tăng độ sắc nét ảnh 29 Chương 3: THUẬT TOÁN NHẬN DẠNG VÀ TÍNH TỐN HƯỚNG KHN MẶT 32 3.1 Thu nhận xử lí tín hiệu Webcam 32 3.1.1 Mục đích 32 3.1.2 Giới thiệu DirectShow 32 3.1.3 Lập trình Webcam sử dụng DirectShow 33 3.2 Thuật tốn nhận dạng khn mặt người 33 3.2.1 Nhận dạng mặt người 33 3.2.2 Giải thuật AdaBoost 34 3.2.3 Giải thuật Camshift 41 3.3 Thuật toán nhận dạng hướng nhìn khn mặt 44 3.3.1 Thuật toán nhận dạng xác định vị trí mũi 46 3.3.2 Nhận dạng mũi dùng Eigennose 48 3.3.3 Giải thuật PCA (Principle Component Analysis) 50 Chương 4: CHƯƠNG TRÌNH VÀ KẾT QUẢ 55 4.1 Lưu đồ giải thuật chương trình nhận dạng 55 4.1.1 Cấu trúc chương trình 55 4.1.2 Lưu đồ giải thuật nhận dạng 57 4.2 Kết nhận dạng 68 4.2.1 Tốc độ nhận dạng 68 4.2.2 Kết nhận dạng 70 4.3 Điều khiển mobile robot 71 4.3.1 Xuất tín hiệu điều khiển 72 4.3.2 Giao tiếp với mobile robot 73 Chương 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 76 5.1 Kết luận 76 5.2 Hướng phát triển 76 TÀI LIỆU THAM KHẢO 78 PHỤ LỤC 80 Kết nhận dạng 80 Mã code chương trình 84 DANH SÁCH HÌNH Hình 1.1 : Robot bám đối tượng di động SRV1 Hình 1.2 : Xe lăn thơng minh điều khiển hướng khuôn mặt ĐH Saitama Hình 1.3 : Mobile robot trường ĐH Copenhagen Hình 1.4 : Điều khiển mobile robot dùng chuyển động đầu Hình 1.5 : Nhận dạng cảm xúc mặt người Hình 1.6 : Điều khiển robot di động dùng ánh mắt Hình 2.1 : Các lĩnh vực có liên quan đến thị giác máy tính Hình 2.2 : Robot Rover NASA 12 Hình 2.3 : Phần tử ảnh 14 Hình 2.4 : Mảng hai chiều file ảnh 15 Hình 2.5 : Các kiểu khơng gian màu 16 Hình 2.6 : Khơng gian màu RGB 17 Hình 2.7 : Không gian màu HSV 18 Hình 2.8 : Không gian màu XYZ 20 Hình 2.9 : Khơng gian màu Lab 21 Hình 2.10 : Khơng gian màu YCbCr 22 Hình 2.11 : (a) Ảnh màu, (b) Ảnh xám 23 Hình 2.12 : Ảnh ban đầu ảnh biến đổi với giá trị ngưỡng 180 25 Hình 2.13 : Ảnh gốc ảnh sau lấy ngưỡng với ma trận 7x7 C = 25 Hình 2.14 : Các Histogram tương ứng với bốn loại ảnh 27 Hình 2.15 : Ảnh gốc ảnh sau lọc trung vị 3x3 28 Hình 2.16 : Tách biên phương pháp Canny 30 Hình 3.1 : Sơ đồ mạch lọc 33 Hình 3.2 : đặc trưng Haar-like 34 Hình 3.3 : Cách tính Integral Image ảnh 35 Hình 3.4 : Ví dụ cách tính giá trị mức xám vùng D ảnh 35 Hình 3.5 : Biểu đồ tính tốn giá trị fk 36 Hình 3.6 : Mơ hình phân tầng kết hợp phân loại yếu để xác định khn mặt 37 Hình 3.7 : Hệ thống xác định vị trí khn mặt người (Face detection system) 40 Hình 3.8 : Kết tìm kiếm với giải thuật CAMSHIFT 43 Hình 3.9 : Tách vùng khn mặt khỏi ảnh video 44 Hình 3.10 : Xác định hướng nhìn khn mặt 45 Hình 4.1 : Chương trình nhận dạng hướng khn mặt 55 Hình 4.2 : Giao diện chương trình 56 Hình 4.3 : Giao diện khối chọn thông số 57 Hình 4.4 : Giao diện khối tạo tập liệu 57 Hình 4.5 : Lưu đồ chương trình 58 Hình 4.6 : Lưu đồ khối nhận dạng 59 Hình 4.7 : Hình ảnh thu từ Webcam 60 Hình 4.8 : Ảnh ban đầu (a) Ảnh chưa lọc (b) Ảnh lọc trung vị 3x3 (c) 60 Hình 4.9 : Lấy mẫu cho giải thuật CAMSHIFT 61 Hình 4.10 : Ảnh mẫu Histogram ảnh 61 Hình 4.11 : Ảnh đầu vào – Ảnh sau trích lọc Hue – Ảnh sau chiếu (project) 61 Hình 4.12 : Kết nhận dạng dùng giải thuật Haar-like 62 Hình 4.13 : Kết nhận dạng dùng giải thuật CAMSHIFT 63 Hình 4.14 : Tập ảnh huấn luyện 64 Hình 4.15 : Kích thước tương đối vùng mũi mặt 65 Hình 4.16 : Giới hạn vùng tìm kiếm 66 Hình 4.17 : Lưu đồ giải thuật nhận dạng mũi dùng PCA 67 Hình 4.18 : Mơ hình xe lăn 71 Hình 4.19 : Xuất tín hiệu điều khiển 72 Hình 4.20 : Mơ hình mobile robot 73 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành Bám theo khuôn mặt di động : HVTH : Lê Thanh Tùng Trang 82 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành Nhận dạng xác định vị trí mũi : Nhận dạng với thơng số tập mẫu số vecto 5,5 : HVTH : Lê Thanh Tùng Trang 83 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành Nhận dạng với thông số tập mẫu số vecto 10,7 : HVTH : Lê Thanh Tùng Trang 84 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành MÃ CODE VC++ CỦA CHƯƠNG TRÌNH : Giới thiệu hàm OpenCV chức chúng có sử dụng chương trình : Các hàm liên quan đến cửa sổ : tạo, hủy, định kích thước cửa số : - cvNamedWindow( const char* name, unsigned long flags ); - cvDestroyWindow( const char* name ); - cvResizeWindow( const char* name, int width, int height ); Các hàm liên quan đến hình ảnh : load, lưu, hiển thị hình ảnh : - cvLoadImage( const char* filename, int iscolor CV_DEFAULT(1)); - cvSaveImage( const char* filename, const CvArr* image ); - cvShowImage( const char* name, const CvArr* image ); Các hàm liên quan đến camera : thu, giải phóng, chụp frame : - cvCaptureFromCAM( int index ); - cvReleaseCapture( CvCapture** capture ); - cvQueryFrame( CvCapture* capture ); Các hàm liên quan đến histogram : tạo, xố, tính tốn histogram ảnh - cvCreateHist( int cDims, int* dims, int type, float** ranges=0, int uniform=1 ); - cvClearHist( CvHistogram* hist ); - cvCalcHist( IplImage** img, CvHistogram* hist,int doNotClear=0, const CvArr* mask=0 ); Hàm tính tốn back project : - cvCalcBackProject( IplImage** img, CvArr* backProject, const CvHistogram* hist ); Hàm lọc nhiễu chuyển đổi không gian màu : - cvSmooth(const param2); CvArr*src,CvArr*dst,int smoothtype=CV_GAUSSIAN,int param1,int - cvCvtColor( const CvArr* src, CvArr* dst, int code ); Các hàm xây dựng cho giải thuật PCA : CalcEigenObjects(), CalcDecompCoeff(), EigenDecomposite(), EigenProjection() : HVTH : Lê Thanh Tùng Trang 85 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành - cvCalcEigenObjects( int nObjects, void* input, void* output, int ioFlags,int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals ); - cvCalcDecompCoeff( IplImage* obj, IplImage* eigObj, IplImage* avg ); - cvEigenDecomposite( IplImage* obj, int nEigObjs, void* eigInput, int ioFlags, void* userData, IplImage* avg, float* coeffs ); - cvEigenProjection( int nEigObjs, void* eigInput, int ioFlags, void* userData, float* coeffs, IplImage* avg, IplImage* proj ); Mã code số hàm nhận dạng quan trọng chương trình : // -void Khuon_mat :: CamShift( const void* project, CvRect vung_tk,CvTermCriteria gioi_han, CvConnectedComp* _comp,CvBox2D* box ) { const int TOLERANCE = 10; CvMoments moments; double m00 = 0, m10, m01, mu20, mu11, mu02, inv_m00; double a, b, c, xc, yc; double rotate_a, rotate_c; double theta = 0, square; double cs, sn; double length = 0, width = 0; CvConnectedComp comp; CvMat cur_win, stub, *mat = (CvMat*)project; CV_FUNCNAME( "CamShift" ); comp.rect = vung_tk; BEGIN ; CV_CALL( mat = cvGetMat( mat, &stub )); // -Dinh nghia vung tim kiem -vung_tk = comp.rect; vung_tk.x -= TOLERANCE; if( vung_tk.x < ) vung_tk.x = 0; vung_tk.y -= TOLERANCE; if( vung_tk.y < ) vung_tk.y = 0; vung_tk.width += * TOLERANCE; if( vung_tk.x + vung_tk.width > mat->width ) vung_tk.width = mat->width - vung_tk.x; HVTH : Lê Thanh Tùng Trang 86 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành vung_tk.height += * TOLERANCE; if( vung_tk.y + vung_tk.height > mat->height ) vung_tk.height = mat->height - vung_tk.y; CV_CALL( cvGetSubRect( mat, &cur_win, vung_tk )); // Tinh toan cac moment CV_CALL( cvMoments( &cur_win, &moments )); m00 = moments.m00; m10 = moments.m10; m01 = moments.m01; mu11 = moments.mu11; mu20 = moments.mu20; mu02 = moments.mu02; if( m00 == ) EXIT; inv_m00 = / m00; xc = cvRound( m10 * inv_m00 + vung_tk.x ); yc = cvRound( m01 * inv_m00 + vung_tk.y ); a = mu20 * inv_m00; b = mu11 * inv_m00; c = mu02 * inv_m00; // Tinh toan chieu rong va chieu cao square = sqrt( * b * b + (a - c) * (a - c) ); // Tinh toan huong theta = atan2( * b, a - c + square ); // Tinh toan chieu rong va chieu cao hinh -cs = cos( theta ); sn = sin( theta ); rotate_a = cs * cs * mu20 + * cs * sn * mu11 + sn * sn * mu02; rotate_c = sn * sn * mu20 - * cs * sn * mu11 + cs * cs * mu02; length = sqrt( rotate_a * inv_m00 ) * 4; width = sqrt( rotate_c * inv_m00 ) * 4; // - Neu dai < rong : dao khung lai if( length < width ) { double t; CV_SWAP( length, width, t ); CV_SWAP( cs, sn, t ); theta = CV_PI*0.5 - theta; } HVTH : Lê Thanh Tùng Trang 87 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành // Luu ket qua -if( _comp || box ) { int t0, t1; int _xc = cvRound( xc ); int _yc = cvRound( yc ); t0 = cvRound( fabs( length * cs )); t1 = cvRound( fabs( width * sn )); t0 = MAX( t0, t1 ) + 2; comp.rect.width = MIN( t0, (mat->width - _xc) * ); t0 = cvRound( fabs( length * sn )); t1 = cvRound( fabs( width * cs )); t0 = MAX( t0, t1 ) + 2; comp.rect.height = MIN( t0, (mat->height - _yc) * ); comp.rect.x = MAX( 0, _xc - comp.rect.width / ); comp.rect.y = MAX( 0, _yc - comp.rect.height / ); comp.rect.width = MIN( mat->width - comp.rect.x, comp.rect.width ); comp.rect.height = MIN( mat->height - comp.rect.y, comp.rect.height ); comp.area = (float) m00; } END ; if( _comp ) *_comp = comp; if( box ) { box->size.height = (float)length; box->size.width = (float)width; box->angle = (float) theta; box->center = cvPoint2D32f( comp.rect.x + comp.rect.width*0.5f, comp.rect.y + comp.rect.height*0.5f); } } // Nhận dạng mặt dùng CAMSHIFT xác định vị trí mũi: // CvBox2D faceBox; CvHistogram* hist; CvRect searchWin; CvConnectedComp comp; Khuon_mat Khuon_mat(thongso); // Nhan dang mat nguoi - HVTH : Lê Thanh Tùng Trang 88 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành if (thongso->m_faceAlgorithm != 2) // - Lua chon khong tim kiem Khuon_mat.loadDatabase(thongso); if (thongso->m_faceAlgorithm == 0) // - Giai thuat Haar { // -Load bo phan loai xep tang da duoc huan luyen CvHaarClassifierCascade* cascade = cvLoadHaarClassifierCascade ("",cvSize( ORIG_WIN_SIZE, ORIG_WIN_SIZE )); // -Tao bo phan loai manh, mac dinh khung hinh nhan dang la 24x24 hid_cascade = cvCreateHidHaarClassifierCascade( cascade, 0, 0, 0, ); cvReleaseHaarClassifierCascade( &cascade ); storage = cvCreateMemStorage(0); } else if (thongso->m_faceAlgorithm == 1) // Giai thuat CamShift { // - Load anh mau cho giai thuat camshift -IplImage* SampleForHUE = cvLoadImage("C:\\SampleHUE.jpg", -1); if (SampleForHUE == NULL) { MessageBox("Khong tim thay file SampleHUE\nHay dinh nghia HUE", "Error", MB_OK|MB_ICONSTOP); exit(1); } else { // - Trich loc thong tin cua anh mau -IplImage* HUE = cvCreateImage(cvGetSize(SampleForHUE), IPL_DEPTH_8U, extractHUE(SampleForHUE, HUE); // - Tinh toan Histogram cua anh -int hist_size = 20; float ranges[] = { 0, 180 }; float* pranges[] = {ranges}; hist = cvCreateHist( 1, &hist_size, CV_HIST_ARRAY, pranges, ); cvCalcHist(&HUE, hist); hueFrame = cvCreateImage(cvGetSize(CameraFrame), IPL_DEPTH_8U, 1); backProject = cvCreateImage(cvGetSize(CameraFrame), IPL_DEPTH_8U, 1); extractHUE(CameraFrame, hueFrame); // - Xac dinh vung tim kiem -searchWin.x = 0; searchWin.y = 0; searchWin.width = hueFrame->width; searchWin.height = hueFrame->height; } } // - Tim kiem vi tri mui -trackControl = 1; HVTH : Lê Thanh Tùng Trang 89 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành while (trackControl != 0) { if (thongso->m_faceAlgorithm == 0) // - Giai thuat Haar HaarFaceDetect( CameraFrame, &faceBox); else if (thongso->m_faceAlgorithm == 1) // - Giai thuat CamShift { extractHUE( CameraFrame, hueFrame ); cvCalcBackProject( &hueFrame, backProject, hist ); Khuon_mat.CamShift( backProject, searchWin, cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 15, 0.1 ), &comp, &faceBox ); searchWin = comp.rect; } // Hàm xác định vị trí mũi // void Khuon_mat::Tim_mui(IplImage* faceImage, Thong_so* settings) { IplImage** images = (IplImage**)malloc(sizeof(IplImage*)*numOfImages); IplImage** eigens = (IplImage**)malloc(sizeof(IplImage*)*numOfImages); IplImage* averageImage; IplImage* projection; CvSize faceSize; faceSize = cvGetSize(faceImage); eigenSize newEigenSize; newEigenSize.width = faceSize.width * settings->params->ratio; newEigenSize.conversion = ((float)newEigenSize.width) / ((float)database[0]->width); newEigenSize.height = ((float)database[0]->height) * newEigenSize.conversion; CvSize newSize; newSize.width = (int)newEigenSize.width; newSize.height = (int)newEigenSize.height; IplImage* tempImg = cvCreateImage( newSize, IPL_DEPTH_8U, 1); // ********** Thiet lap ban dau ********* for (int i=0; iparams->nImages; i++) { /*cvResize(database[i], tempImg, CV_INTER_LINEAR); // was NN images[i] = cvCreateImage( cvGetSize(tempImg), IPL_DEPTH_8U, 1); //changeColorSpace(settings, tempImg, images[i]); images[i] = database[i];*/ images[i] = cvCreateImage(newSize, IPL_DEPTH_8U, 1); cvResize(database[i], images[i], CV_INTER_LINEAR); // was NN } cvShowImage("Eigen", images[0]); HVTH : Lê Thanh Tùng Trang 90 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành cvReleaseImage(&tempImg); // ************ Tao khong gian rieng ******* //for (i=0; inImages; i++) eigens[i] = cvCreateImage(cvGetSize(images[0]), IPL_DEPTH_32F, 1); averageImage = cvCreateImage(cvGetSize(images[0]), IPL_DEPTH_32F, 1); projection = cvCreateImage(cvGetSize(images[0]), IPL_DEPTH_8U, 1); // ************ Tinh toan tri rieng va vecto rieng ******* CvTermCriteria criteria; criteria.type = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS; criteria.maxIter = 13; criteria.epsilon = 0.1; cvCalcEigenObjects( settings->params->nImages, images, eigens, 0, 0, 0, &criteria, averageImage, vals ); // // // ************************************************************* **************** Tim kiem vi tri mui ************************ ************************************************************* IplImage* GRAYfaceImage = cvCreateImage(faceSize, IPL_DEPTH_8U, 1); changeColorSpace(settings,faceImage, GRAYfaceImage); cvCvtColor( faceImage, GRAYfaceImage, CV_RGB2GRAY); GRAYfaceImage->origin = 1; // ** Vi tri goc la goc trai ben duoi int MARGIN = settings->params->MaxError; double minimum = MARGIN; double distance = MARGIN; // ** Gioi han vung tim kiem - if (faceSize.width < 160) { settings->params->mui.xlimitLeft = 0; settings->params->mui.xlimitRight = faceSize.width - images[0]->width - 1; settings->params->mui.ylimitUp = (int)( ((float)faceSize.height)*0.5 - images[0]>height - 1); settings->params->mui.ylimitDown = faceSize.height*0.1; } else { settings->params->mui.xlimitLeft = (faceSize.width)*0.3; settings->params->mui.xlimitRight = (faceSize.width - images[0]->width)*0.5 ; settings->params->mui.ylimitUp = (int)( ((float)faceSize.height)*0.55 images[0]->height - 1); settings->params->mui.ylimitDown = faceSize.height*0.4; HVTH : Lê Thanh Tùng Trang 91 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành } settings->params->mui.initializeNoseParameters(); settings->params->mui.RectSize.width = images[0]->width; settings->params->mui.RectSize.height = images[0]->height; IplImage* Image2Comp = cvCreateImage(cvGetSize(images[0]), IPL_DEPTH_8U, 1); int x,y; // ** Bat dau tim kiem - for (y=settings->params->mui.ylimitDown; yparams->mui.ylimitUp; y+=2) { for (x=settings->params->mui.xlimitLeft; xparams->mui.xlimitRight; x+=2) { cvSetImageROI(GRAYfaceImage, cvRect(x, y, images[0]->width, images[0]->height)); if (settings->params->varianceCheck == ) { if (calculateSTD(GRAYfaceImage) params>variance)) { cvResetImageROI(GRAYfaceImage); continue; } } cvFlip( GRAYfaceImage, Image2Comp, 0); cvResetImageROI(GRAYfaceImage); // ** Kiem tra va xac nhan vung tim kiem - //cvShowImage("ROI", Image2Comp); cvWaitKey(60); cvEigenDecomposite( Image2Comp, settings->params->nEigens, eigens, 0, 0, averageImage, weights ); cvEigenProjection( eigens, settings->params->nEigens, CV_EIGOBJ_NO_CALLBACK, 0, weights, averageImage, projection ); cvShowImage("ROI", projection); cvShowImage("ROI1", Image2Comp); distance = cvNorm(Image2Comp, projection, CV_L2, 0); settings->params->mui.delta_D = distance; settings->params->mui.minimum = minimum; if (distance < minimum && distance > 0) { settings->params->mui.nosefound = true; minimum = distance; settings->params->mui.distance = distance; settings->params->mui.coords.x = x; settings->params->mui.coords.y = y; HVTH : Lê Thanh Tùng Trang 92 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành } } } minimum = MARGIN; distance = MARGIN; cvReleaseImage(&Image2Comp); cvReleaseImage(&GRAYfaceImage); for (i=0; iparams->nImages; i++) cvReleaseImage(&images[i]); for (i=0; iparams->nImages; i++) cvReleaseImage(&eigens[i]); cvReleaseImage(&averageImage); cvReleaseImage(&projection); free(images); free(eigens); } // - Hàm tính tốn hướng nhìn khn mặt void CLUAN_VANDlg::hien_thi(Thong_so* settings) { UpdateData(); m_set = set; // ** - Hien thi toa cua mui va cac thong so -int tempNX = settings->params->mui.RectSize.width / 2; int tempNY = settings->params->mui.RectSize.height / 2; m_NX = settings->params->mui.coords.x + tempNX; m_NY = settings->params->mui.coords.y + tempNY; m_FX = settings->params->khuon_mat.coords.x; m_FY = settings->params->khuon_mat.coords.y; m_DIFS2 = settings->params->mui.minimum; int khoang_cach_X = m_NX - m_FX + tempNX ; int khoang_cach_Y = m_NX - m_FX + tempNX ; int width = settings->params->size.coords.x; int height = settings->params->size.coords.y; float tolerance = (100*(m_NX - m_FX ))/width ; float tolerance1 = (100*(m_NY - m_FY ))/width ; m_test1 = tolerance ; m_test2 = width; //** Tinh toan huong nhin cua khuon mat if ( m_NY == || tolerance > 40 || tolerance < -40) { GetDlgItem(IDC_RIGHT)->EnableWindow(false); HVTH : Lê Thanh Tùng Trang 93 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành GetDlgItem(IDC_LEFT)->EnableWindow(false); GetDlgItem(IDC_UP)->EnableWindow(false); GetDlgItem(IDC_DOWN)->EnableWindow(false); m_HUONG = _T("FAIL"); } else if (tolerance > 10 ) { GetDlgItem(IDC_RIGHT)->EnableWindow(true); GetDlgItem(IDC_LEFT)->EnableWindow(false); GetDlgItem(IDC_UP)->EnableWindow(false); GetDlgItem(IDC_DOWN)->EnableWindow(false); if (set == 1) { m_strTransfer = "B"; m_mscomm.SetOutput((COleVariant)m_strTransfer); } m_HUONG = _T("RIGHT"); } else if (tolerance > 20 ) { GetDlgItem(IDC_RIGHT)->EnableWindow(true); GetDlgItem(IDC_LEFT)->EnableWindow(false); GetDlgItem(IDC_UP)->EnableWindow(false); GetDlgItem(IDC_DOWN)->EnableWindow(false); if (set == 1) { m_strTransfer = "C"; m_mscomm.SetOutput((COleVariant)m_strTransfer); } m_HUONG = _T("M-RIGHT"); } else if (tolerance < -10 ) { GetDlgItem(IDC_RIGHT)->EnableWindow(false); GetDlgItem(IDC_LEFT)->EnableWindow(true); GetDlgItem(IDC_UP)->EnableWindow(false); GetDlgItem(IDC_DOWN)->EnableWindow(false); if (set == 1) { m_strTransfer = "D"; m_mscomm.SetOutput((COleVariant)m_strTransfer); } m_HUONG = _T("LEFT"); } else if (tolerance < -20 ) { GetDlgItem(IDC_RIGHT)->EnableWindow(false); GetDlgItem(IDC_LEFT)->EnableWindow(true); GetDlgItem(IDC_UP)->EnableWindow(false); HVTH : Lê Thanh Tùng Trang 94 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành GetDlgItem(IDC_DOWN)->EnableWindow(false); if (set == 1) { m_strTransfer = "E"; m_mscomm.SetOutput((COleVariant)m_strTransfer); } m_HUONG = _T("M-LEFT"); } else if ( tolerance1 < -20) { GetDlgItem(IDC_RIGHT)->EnableWindow(false); GetDlgItem(IDC_LEFT)->EnableWindow(false); GetDlgItem(IDC_UP)->EnableWindow(true); GetDlgItem(IDC_DOWN)->EnableWindow(false); if (set == 1) { m_strTransfer = "F"; m_mscomm.SetOutput((COleVariant)m_strTransfer); } m_HUONG = _T("STOP"); } else { GetDlgItem(IDC_RIGHT)->EnableWindow(false); GetDlgItem(IDC_LEFT)->EnableWindow(false); GetDlgItem(IDC_UP)->EnableWindow(true); GetDlgItem(IDC_DOWN)->EnableWindow(false); if (set == 1) { m_strTransfer = "A"; m_mscomm.SetOutput((COleVariant)m_strTransfer); } m_HUONG = _T("FRONT"); } UpdateData(false); } HVTH : Lê Thanh Tùng Trang 95 LÝ LỊCH TRÍCH NGANG Họ tên: LÊ THANH TÙNG Phái: Nam Ngày tháng năm sinh: 07/10/1983 Nơi sinh: HẢI DƯƠNG Chuyên ngành: TỰ ĐỘNG HOÁ Địa liên lạc: 46 – Nguyễn Thái Bình – Phường – Tân Bình – TP.Hồ Chí Minh Q TRÌNH ĐÀO TẠO : 2001 - 2006: Học Đại học Bách khoa Tp.HCM - Chuyên ngành Cơ-Điện tử 2007 - 2009: Học Sau Đại học Đại học Bách Khoa Tp.HCM - Chun ngành Tự động hóa Q TRÌNH CÔNG TÁC : 2007 - 2008: Kỹ sư thiết kế Cơ khí – Cơng ty TNHH Hồng Việt Dũng 2009 – : Cán giảng dạy – Trường Đại học Sư phạm Kỹ thuật Tp.HCM - Khoa Cơ khí Chế tạo máy ... để điều khiển cánh tay robot gắp gá đặt chi tiết) HVTH : Lê Thanh Tùng Trang 11 Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành Ứng dụng thị giác máy tính điều khiển. .. máy HVTH : Lê Thanh Tùng Trang Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành Thị giác máy tính miêu tả thành phần thị giác sinh vật học (biological vision) Trong thị. .. liên quan đến thị giác máy tính HVTH : Lê Thanh Tùng Trang Điều khiển Mobile robot dùng thị giác máy tính GVHD : TS Nguyễn Đức Thành Những lĩnh vực có liên hệ chặt chẽ với thị giác máy tính xử lí