Tài liệu ỨNG DỤNG XỬ LÝ ẢNH VỚI THUẬT TOÁN SVM

  • Số trang: 57 |
  • Loại file: PDF |
  • Lượt xem: 4005 |
  • Lượt tải: 1
xomthong

Tham gia: 05/05/2016

Hệ thống đang quá tải...vui lòng truy cập lại sau.

Mô tả:

Mục lục MỤC LỤC DANH MỤC CÁC TỪ VIẾT TẮT ........................................................................3 MỞ ĐẦU ..................................................................................................................4 CHƢƠNG 1 : LÀM QUEN VỚI THƢ VIỆN OPENCV .....................................5 1.1 Giới thiệu chương ............................................................................................5 1.2 So sánh phiên bản OpenCV 1 và OpenCV 2...................................................5 1.3 Hướng dẫn sử dụng thư viện Open CV trên Window .....................................7 1.4 Kết luận chương ............................................................................................11 CHƢƠNG 2 : CÁC PHÉP XỬ LÝ ẢNH ĐƠN GIẢN TRONG OPENCV .....12 2.1 Giới thiệu chương ..........................................................................................12 2.2 Chương trình đầu tiên ....................................................................................12 2.3 Ảnh nhị phân, nhị phân hóa với ngưỡng động ..............................................14 2.4 Các phép toán hình thái học trong ảnh ..........................................................19 2.4.1 Phép toán giãn nở (dialation) .....................................................................19 2.4.2 Phép toán co (erosion) ................................................................................20 2.4.3 Phép toán đóng và mở (closing & opening) ...............................................21 2.5 Kết luận chương ............................................................................................25 CHƢƠNG 3 : LẬP TRÌNH XỬ LÝ ẢNH VỚI GIAO DIỆN MFC .................26 3.1 Giới thiệu chương ..........................................................................................26 3.2 Khởi tạo project MFC ...................................................................................26 3.3 Làm việc với các điều khiển (Control) của MFC ..........................................28 3.3.1 Đặt tên biến cho các control .......................................................................28 3.3.2 Lấy giá trị nhập vào từ một Edit Control ...................................................29 3.3.3 Hiển thị các test lên các control..................................................................30 3.3.4 Hiển thị ảnh lên một control .......................................................................30 3.3.5 Enable, disnable một control ......................................................................30 3.3.6 Lấy giá trị từ thanh trược (Slider control) ..................................................30 3.3.7 Lấy giá trị lựa chọn từ Combo Box ............................................................30 3.3.8 Dialog mở file và lưu file ...........................................................................31 1 Mục lục 3.3.9 Xử lý sự kiện khi click chuột vào button ...................................................32 3.3.10 Xử lý sự kiện khi thay đổi lựa chọn Combo box .....................................32 3.3.11 Thêm menu vào chương trình, xử lý sự kiện khi click vào menu ............33 3.4 Chuyển đổi các kiểu dữ liệu trong MFC .......................................................35 3.5 Chương trình tải ảnh và hiển thị ảnh trên giao diện MFC ............................36 3.6 Kết luận chương ............................................................................................37 CHƢƠNG 4: NHẬN DẠNG BIỂN SỐ XE BẰNG THUẬT TOÁN SVM ......38 4.1 Giới thiệu chương .........................................................................................38 4.2 Phát hiện vùng chứa biển số xe và cách ly kí tự. ..........................................39 4.3 Nhận dạng kí tự .............................................................................................40 4.3. 1 Phương pháp SVM .....................................................................................41 4.3.2 Tính toán đặt trưng trong ảnh .....................................................................43 4.4 Cài đặt chương trình nhận dạng biển số xe ô tô............................................44 4.4.1 Huấn luyện mô hình SVM..........................................................................44 4.5 Phát hiện và nhận dạng biển số xe ................................................................45 4.6 Giao diện chương trình chính .......................................................................46 4.7 Kết luận chương ............................................................................................47 KẾT LUẬN – HƢỚNG PHÁT TRIỂN ...............................................................48 TÀI LIỆU THAM KHẢO ....................................................................................49 PHỤ LỤC ...............................................................................................................50 2 Danh mục các từ viết tắt DANH MỤC CÁC TỪ VIẾT TẮT API Application Programming Interface BSD Berkeley Software Distribution IDE Integrated Development Environment IEEE Institute of Electrical and Electronics Engineers LPR License Plate Recognition MFC Microsoft Foundation Classes OpenCV Open Source Computer Vision RFID Radio Frequency Identification SVM Surport Vector Machine 3 Mở đầu MỞ ĐẦU Xử lý ảnh và thị giác máy là lĩnh vực mà ngày nay được phát triển và ứng dụng rất rộng rãi trong nhiều lĩnh vực khác nhau nhờ vào sự phát triển ngày càng mạnh mẽ của các hệ thống máy tính, các thuật toán và công trình nghiên cứu khác nhau của nhiều nhà khoa học trên thế giới. Ở Việt Nam, các ứng dụng về xử ảnh đã bước đầu được triển khai trên một số lĩnh vực như lắp đặt hệ thống nhận dạng biển biển số xe ở các bãi đổ xe, hệ thống nhận dạng mặt người…Tuy nhiên nhìn một cách khách quan thì số lượng các ứng dụng được triển khai trên thực tế là quá ít ỏi, lĩnh vực này sẽ còn phát triển mạnh mẽ trong tương lai nếu như được quan tâm một cách nghiêm túc. Trong đề tài “ỨNG DỤNG XỬ LÝ ẢNH BẰNG THUẬT TOÁN SVM” với nhiệm vụ nghiên cứu về mặt kĩ thuật của bài toán nhận dạng biển số xe, viết chương trình mô phỏng bằng ngôn ngữ C++ với sự giúp đỡ của thư viện OpenCV, một thư viện mã nguồn mở được đánh giá là mạnh mẽ về tốc độ xử lý đáp ứng được các ứng dụng trong thời gian thực, sau đó sử dụng thuật toán máy học SVM (Surport Vector Machine) để nhận dạng ký tự biển số xe. Nội dung đồ án bao gồm: Chƣơng 1 : Làm quen với thư viện OpenCV Chƣơng 2 : Các phép xử lý ảnh đơn giản trong OpenCV Chƣơng 3 : Lập trình xử lý ảnh với giao diện MFC Chƣơng 4 : Nhận dạng biển số xe bằng thuật toán SVM Tuy em đã cố gắng tìm tòi và nỗ lực hết sức để thực hiện đồ án nhưng hẳn sẽ có không ít sai sót, vì vậy kính mong các thầy cô góp ý và chỉ bảo thêm, giúp em nắm vững hơn vốn kiến thức của mình. Em xin chân thành cảm ơn. 4 Chương 1: Làm quen với thư viện Opencv CHƢƠNG 1 : LÀM QUEN VỚI THƢ VIỆN OPENCV 1.1 Giới thiệu chƣơng Chương này giới thiệu về OpenCV (Open Source Computer Vision), một thư viện mã nguồn mở về thị giác máy với hơn 500 hàm và hơn 2500 các thuật toán đã được tối ưu về xử lý ảnh, và các vấn đề liên quan tới thị giác máy. OpenCV được thiết kế một cách tối ưu, sử dụng tối đa sức mạnh của các dòng chip đa lõi… để thực hiện các phép tính toán trong thời gian thực, nghĩa là tốc độ đáp ứng của nó có thể đủ nhanh cho các ứng dụng thông thường. OpenCV là thư viện được thiết kế để chạy trên nhiều nền tảng khác nhau (cross-patform), nghĩa là nó có thể chạy trên hệ điều hành Window, Linux, Mac, iOS …Việc sử dụng thư viện OpenCV tuân theo các quy định về sử dụng phần mềm mã nguồn mở BSD do đó có thể sử dụng thư viện này một cách miễn phí cho cả mục đích phi thương mại lẫn thương mại. Dự án về OpenCV được khởi động từ những năm 1999, đến năm 2000 nó được giới thiệu trong một hội nghị của IEEE về các vấn đề trong thị giác máy và nhận dạng, tuy nhiên bản OpenCV 1.0 mãi tới tận năm 2006 mới chính thức được công bố và năm 2008 bản 1.1 (pre-release) mới được ra đời. Tháng 10 năm 2009, bản OpenCV thế hệ thứ hai ra đời (thường gọi là phiên bản 2.x), phiên bản này có giao diện của C++ (khác với phiên bản trước có giao diện của C) và có khá nhiều điểm khác biệt so với phiên bản thứ nhất. Thư viện OpenCV ban đầu được sự hỗ trợ từ Intel, sau đó được hỗ trợ bở Willow Garage, một phòng thí nghiệm chuyên nghiên cứu về công nghệ robot. Cho đến nay, OpenCV vẫn là thư viện mở, được phát triển bởi nguồn quỹ không lợi nhuận (none -profit foundation) và được sự hưởng ứng rất lớn của cộng đồng. 1.2 So sánh phiên bản OpenCV 1 và OpenCV 2 Cho tới nay, trải qua hơn 6 năm từ lúc phiên bản OpenCV đầu tiên được công bố, đã có lần lượt nhiều phiên bản OpenCV ra đời, tuy nhiên có thể chia thư viện này thành hai bản chính dựa trên những đặc điểm khác biệt lớn nhất của chúng: 5 Chương 1: Làm quen với thư viện Opencv phiên bản OpenCV thế hệ thứ nhất (hay còn gọi là phiên bản OpenCV 1.x) và phiên bản OpenCV thứ hai (hay còn gọi là phiên bản OpenCV 2.x). Sau đây là một số điểm khác biệt cơ bản giữa hai phiên bản này. OpenCV 1.x (bao gồm bản 1.0 và bản pre-release 1.1) dựa trên giao diện C, cấu trúc của một ảnh số dựa trên cấu trúc của IplImage, trong khi thư OpenCV 2.x dựa trên giao diện C++, cấu trúc của ảnh số, ma trận dựa trên cấu trúc của cv::Mat. Trong OpenCV 1.x, người sử dụng phải hoàn toàn quản lý bộ nhớ của các đối tượng, nghĩa là khi một đối tượng mới được tạo ra, chúng ta phải luôn chú ý để giải phóng nó khi không còn sử dụng nữa (trong nhiều trường hợp có thể sẽ bị tràn bộ nhớ nếu không chú ý đều này), trong khi thư viện OpenCV 2.x việc quản lý bộ nhớ trở nên dễ dàng hơn nhờ các hàm hủy các các lớp đối tượng trong OpenCV 2.x đã thực hiện điều này khi một đối tượng không còn được sử dụng nữa. Việc viết các dòng lệnh để thực hiện cùng một chức năng trong OpenCV 2.x là dễ dàng hơn nhiều so với OpenCV 1.x, một phần là là giao diện C++ có phần dễ hiểu hơn so với C, một phần là các hàm trong OpenCV 2.x đã được tối ưu hóa nhiều bước trung gian không cần thiết về mặt giao diện người sử dụng. Chẳng hạn khi xét ví dụ về việc phát hiện đường tròn trong ảnh màu dựa vào thuật toán Hough, các bước để thực hiện là load một ảnh màu, chuyển sang ảnh nhị phân, tìm biên dựa trên bộ lọc canny và phát hiện đường tròn dựa trên thuật toán Hough. OpenCV 1.x thực hiện như sau: // Phát hiện đường tròn trong ảnh OpenCV 1.x IplImage* src = cvLoadImage(“image.jpg”); IplImage* gray = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); cvCvtColor(src, gray, CV_BGR2GRAY); cvCanny(gray, gray, 10, 30, 3); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq*circles=cvHoughCircles(gray,storage,CV_HOUGH_GRADIENT, 1,50,100,50); 6 Chương 1: Làm quen với thư viện Opencv Trong khi đó, OpenCV 2.x thực hiện như sau: // Phát hiện đường tròn trong ảnh OpenCV 2.x Mat src = imread(“image.jpg”); Mat gray; CvtColor(src, gray, CV_BGR2GRAY); Canny(gray, gray, 10, 30, 3); Vector circles; HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 50, 100, 50); Nhận thấy đối tượng ảnh gray trong OpenCV 2.x không cần phải khởi tạo, đối tượng storage (đối tượng trung gian, không có ý nghĩa về mặt sử dụng) cũng không cần phải khởi tạo (và do đó không cần giải phóng). Thư viện OpenCV 1.x tuy chứa một lượng lớn hàm xử lý và thuật toán, tuy nhiên nó vẫn ở dạng sơ khai. Thư viện OpenCV 2.x đã được bổ xung khá nhiều hàm, thuật toán và được tối ưu khá nhiều đặc biệt trong các khía cạnh về phát hiện đối tượng (detection), nhận dạng đối tượng (partten regconition) và theo dõi đối tượng (tracking). Hơn thế nữa, tuy có giao diện là C++ nhưng OpenCV 2.x vẫn dữ một phần giao diện C để tương thích với các phiên bản của OpenCV 1.x. Từ một số đặc điểm trên có thể thấy rằng thư viện OpenCV phiên bản 2.x là có nhiều điểm nổi trội hơn so với phiên bản 1.x, tuy nhiên trong một số trường hợp như ở các hệ thống nhúng khi mà trình dịch chỉ đơn thuần chấp nhận ngôn ngữ C thì phiển bản 1.x vẫn còn giá trị. Trong đồ án này, các nội dung cài đặt, thuật toán, ứng dụng … chỉ dành cho OpenCV phiên bản 2.x trên nền tảng hệ điều hành Window. 1.3 Hƣớng dẫn sử dụng thƣ viện Open CV trên Window Trước hết chúng ta download thư viện OpenCV về máy tính, tốt hơn là luôn download bản mới nhất tại địa chỉ http://sourceforge.net/projects/opencvlibrary/. Chọn bản đã build sẵn phù hợp với hệ điều hành đang dùng, bản OpenCV được sử dụng trong đề tài này là bản 2.4.3. Sau khi download về máy, tiến hành cài đặt bình 7 Chương 1: Làm quen với thư viện Opencv thường, để mặc định thư mục cài đặt là C:\ thư mục cài đặt xong sẽ có dạng C:\opencv. Tiếp theo tiến hành tùy chỉnh để có thể làm việc với OpenCV qua hai IDE thông dụng là Microsoft Visual Studio và Eclipse . Trên Microsoft Visual Studio Phiên bản Visual studio sử dụng ở đây là phiên bản Visual Studio 2010, các phiên bản trước hoàn toàn có thể cấu hình một cách tương tự. Tạo một project mới: New > Project, trong cửa sổ New Project chọn Visual C++, Win32 Console Application. Đặt tên project là opencv. Hình 1.1 Chọn OK, sau đó nhấn Next, hộp thoại tiếp theo xuất hiện, ở hộp thoại này chọn Application type là Console application và Additional option là Empty project, nhấn Finish để kết thúc quá trình khởi tạo. 8 Chương 1: Làm quen với thư viện Opencv Hình 1.2 Project mới được tạo ra là project hoàn toàn trống, chúng ta phải thêm vào đó ít nhất một file nguồn để chương trình có thể chạy được, trong Solution Explorer click chuột phải vào Source Files, chọn Add -> New Item… Hộp thoại Add New Item hiện ra, ta chọn kiểu cần thêm vào là C++ File(.cpp) đồng thời trong ô Name ta đặt tên cho file thêm vào, giả sử là FirstApp.cpp. Hình 1.3 9 Chương 1: Làm quen với thư viện Opencv Bây giờ trong file này chúng ta có thể thêm vào các #include và gọi hàm main() để chạy chương trình. Để chương trình có thể chạy được với thư viện OpenCV thì cần tùy chỉnh lại một số thuộc tính của project như sau : Vào Project -> Properties (hoặc nhấn tổ hợp phím Alt + F7) để mở hộp thoại Properties. Hộp thoại opencv Property Pages hiện ra, trong mục Configuration Properties chọn VC++ Directories, tương ứng bên phải, tìm mục Include Directories và LibraryDirectories. Chúng ta sẽ chỉ đường dẫn hai thư mục này đến các phần tương ứng của thư việnOpenCV. Mục Include Directories, ta tùy chỉnh ở ô bên phải tới C:\opencv\build\include Mục Library Directories trỏ đến thư mục C:\opencv\build\x86\vc10\lib nếu như sử dụng hệ điều hành 32bit hoặc C:\opencv\build\x64\vc10\lib cho hệ điều hành 64bit. Tiếp theo, trong hộp thoại opencv Property Pages -> Configuration Properties -> Linker chọn Input, tương ứng ở ô bên phải, thêm vào các giá trị cho mục AdditionalDependencies làopencv_core243d.lib,opencv_imgproc243d.lib,opencv_highgui243d.lib. Hình 1.4 Chữ d đứng cuối các file trên thể hiện là đang hoạt động ở chế độ debug, ta có thể thêm các lib không có chữ “d” ở cuối như opencv_core243.lib…trong chế độ 10 Chương 1: Làm quen với thư viện Opencv release. Cuối cùng, khi dịch xong một chương trình, để nó có thể chạy được ta cần chú ý tới cácfile *.dll. Cách đơn giản là chúng ta copy các file *.dll tương ứng (như opencv_core243d.dll, opencv_imgproc243d.dll) vào thư mục chứa file chạy của chươngtrình (file *.exe). Các file *.dll này nằm trong mục C:\opencv\build\x86\bin với win 32 bit hoặc C:\opencv\build\x64\bin với win 64 bit. Với các phiên bản OpenCV cũ hơn, ta cần copy luôn file tbb_debug.dll (trong chế độ debug) hoặc tbb.dll (trong chế độ release) vào thư mục chứa file *.exe. tbb.dll (Thread building block) là file khá quan trọng, thiếu nó chương trình sẽ báo lỗi. Sau khi đã hoàn tất việc chỉ dẫn thư mục chứa header, library và link tới các library tương ứng, ta có thể include các header của opencv vào chương trình và có thể gọi các hàm làmviệc của OpenCV. #include #include #include #include using namespace std; using namespace cv; void main() { ... } 1.4 Kết luận chƣơng Nội dung chương 1 đã nêu rõ về thư viện OpenCV cũng như cách cài đặt chương trình và các phiên bản ra đời của OpenCV. Qua đó giúp hỗ trợ cho việc xử lý ảnh thuận tiện hơn. 11 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv CHƢƠNG 2 : CÁC PHÉP XỬ LÝ ẢNH ĐƠN GIẢN TRONG OPENCV 2.1 Giới thiệu chƣơng Chương 2 sẽ giới thiệu các chương trình đơn giản để xử lý một bức ảnh. Trong chương này em giới thiệu 3 chương trình chính đó là: chương trình để load và hiển thị một ảnh, chương trình nhị phân hóa với ngững động, chương trình về các phép toán hình thái học về việc giản nỡ và nối liền biên ảnh để tìm biển số xe ô tô. 2.2 Chƣơng trình đầu tiên Trong ví dụ này, em sẽ viết một chương trình Hello world để load và hiển thị một ảnh. Chương trình như sau : #include "stdafx.h" #include #include #include using namespace std; using namespace cv; int main() { cout<<"Chuong trinh dau tien"< T Hình sau mô tả một ảnh nhị phân với ngưỡng nhị phân T = 100 14 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv Hình 2.2 Hàm để chuyển nhị phân hóa ảnh trong OpenCV là hàm threshold(). Nguyên mẫu hàm như sau: threshold(cv::InputArray src, cv::OutputArray dst, double thresh, int maxval, int type) Trong đó, src là ảnh đầu vào một kênh màu (ảnh xám …), dst là ảnh sau khi được nhị phân hóa, thresh là ngưỡng nhị phân, maxval là giá trị lớn nhất trong ảnh (maxval = 255 đối với ảnh xám), type là kiểu nhị phân có thể là CV_THRESH_BINARY,CV_THRESH_BINARY_INV, CV_THRESH_OTSU… lần lượt là nhị phân hóa thông thường, nhị phân hóa ngược và nhị phân hóa theo thuật toán Otsu … Kết quả của việc nhị phân hóa một ảnh phụ thuộc vào ngưỡng T, có nghĩa là với mỗi ngưỡng T khác nhau thì ta có những ảnh nhị phân khác nhau. Hình sau mô tả 3 ảnh nhị phân tương ứng với ngưỡng T = 50, T = 100 và T = 150. 15 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv Hình 2.3 Để thu được một ảnh nhị phân tốt mà không cần phải quan tâm tới các điều kiện ánh sáng khác nhau (không cần quan tâm tới ngưỡng T), người ta dùng một kĩ thuật sao cho với mọi ngưỡng xám khác nhau ta luôn thu được một ảnh nhi phân tốt. Kĩ thuật đó gọi là kĩ thuật nhị phân hóa với ngưỡng động (Dymamic threshold) hay nhị phân thích nghi (Adaptive threshold). Có nhiều phương pháp khác khác nhau để thực hiện việc này, tuy nhiên chúng đều dựa trên ý tưởng chính là chia ảnh ra thành những vùng nhỏ, với mỗi vùng áp dụng việc nhị phân cho vùng đó với những ngưỡng nhị phân khác nhau. Các ngưỡng nhị phân ở các vùng được tính toán dựa trên độ lớn mức xám của chính các pixel trên vùng đó. Giả sử ta tính toán ngưỡng cho một vùng nào đó dựa trên độ trung bình của các pixel trong vùng đó (có thể xem một vùng là một cửa sổ). Ta xét quá trình nhị phân với ngưỡng động trong một vùng cửa sổ 5x5: 16 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv Hình 2.4 Vùng ảnh nhị phân thu được ở trên là vùng ảnh được nhị phân với ngưỡng là trung bình cộng của tất cả các ô trong cửa sổ T = (55 + 10 + 100 + …)/25 = 65.6. Chương trình nhị phân hóa với ngưỡng động như sau: // Adaptive Threshold #include #include #include #include using namespace std; using namespace cv; int main() { cout<<"Nhi phan anh voi nguong dong"< - Xem thêm -