ỨNG DỤNG XỬ LÝ ẢNH NHẬN DẠNG BIỂN SỐ XE SỬ DỤNG THUẬT TOÁN SVM

56 3.9K 60
ỨNG DỤNG XỬ LÝ ẢNH NHẬN DẠNG BIỂN SỐ XE SỬ DỤNG THUẬT TOÁN SVM

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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.

Mục lục MỤC LỤC DANH MỤC CÁC TỪ VIẾT TẮT MỞ ĐẦU CHƯƠNG : LÀM QUEN VỚI THƯ VIỆN OPENCV 1.1 Giới thiệu chương 1.2 So sánh phiên OpenCV OpenCV 1.3 Hướng dẫn sử dụng thư viện Open CV Window 1.4 Kết luận chương CHƯƠNG : CÁC PHÉP XỬ LÝ ẢNH ĐƠN GIẢN TRONG OPENCV 2.1 Giới thiệu chương 2.2 Chương trình 2.3 Ảnh nhị phân, nhị phân hóa với ngưỡng động 2.4 Các phép toán hình thái học ảnh 2.4.1 Phép toán giãn nở (dialation) 2.4.2 Phép toán co (erosion) 2.4.3 Phép toán đóng mở (closing & opening) 2.5 Kết luận chương CHƯƠNG : LẬP TRÌNH XỬ LÝ ẢNH VỚI GIAO DIỆN MFC 3.1 Giới thiệu chương 3.2 Khởi tạo project MFC 3.3 Làm việc với điều khiển (Control) MFC 3.3.1 Đặt tên biến cho control 3.3.2 Lấy giá trị nhập vào từ Edit Control 3.3.3 Hiển thị test lên control 3.3.4 Hiển thị ảnh lên control 3.3.5 Enable, disnable control 3.3.6 Lấy giá trị từ trược (Slider control) 3.3.7 Lấy giá trị lựa chọn từ Combo Box 3.3.8 Dialog mở file lưu file 3.3.9 Xử lý kiện click chuột vào button Chương 2: Các phép xử lý ảnh đơn giản Opencv 3.3.10 Xử lý kiện thay đổi lựa chọn Combo box 3.3.11 Thêm menu vào chương trình, xử lý kiện click vào menu 3.4 Chuyển đổi kiểu liệu MFC 3.5 Chương trình tải ảnh hiển thị ảnh giao diện MFC 3.6 Kết luận chương CHƯƠNG 4: NHẬN DẠNG BIỂN SỐ XE BẰNG THUẬT TOÁN SVM 4.1 Giới thiệu chương 4.2 Phát vùng chứa biển số xe cách ly kí tự 4.3 Nhận dạng kí tự 4.3 4.3.2 Tính toán đặt trưng ảnh 4.4 Cài đặt chương trình nhận dạng biển số xe ô tô 4.4.1 Huấn luyện mô hình SVM 4.5 Phát nhận dạng biển số xe 4.6 Giao diện chương trình 4.7 Kết luận chương KẾT LUẬN – HƯỚNG PHÁT TRIỂN TÀI LIỆU THAM KHẢO PHỤ LỤC DANH MỤC CÁC TỪ VIẾT TẮT Chương 2: Các phép xử lý ảnh đơn giản Opencv 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 Chương 2: Các phép xử lý ảnh đơn giản Opencv MỞ ĐẦU Xử lý ảnh thị giác máy lĩnh vực mà ngày phát triển ứng dụng rộng rãi nhiều lĩnh vực khác nhờ vào phát triển ngày mạnh mẽ hệ thống máy tính, thuật toán công trình nghiên cứu khác nhiều nhà khoa học giới Ở Việt Nam, ứng dụng xử ảnh bước đầu triển khai số lĩnh vực lắp đặt hệ thống nhận dạng biển biển số xe bãi đổ xe, hệ thống nhận dạng mặt người…Tuy nhiên nhìn cách khách quan số lượng ứng dụng triển khai thực tế ỏi, lĩnh vực phát triển mạnh mẽ tương lai quan tâm 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 mặt kĩ thuật toán nhận dạng biển số xe, viết chương trình mô ngôn ngữ C++ với giúp đỡ thư viện OpenCV, thư viện mã nguồn mở đánh giá mạnh mẽ tốc độ xử lý đáp ứng ứng dụng 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 : Làm quen với thư viện OpenCV Chương : Các phép xử lý ảnh đơn giản OpenCV Chương : Lập trình xử lý ảnh với giao diện MFC Chương : Nhận dạng biển số xe thuật toán SVM Tuy em cố gắng tìm tòi nỗ lực để thực đồ án hẳn có không sai sót, kính mong thầy cô góp ý bảo thêm, giúp em nắm vững vốn kiến thức Em xin chân thành cảm ơn Chương 2: Các phép xử lý ảnh đơn giản Opencv CHƯƠNG : LÀM QUEN VỚI THƯ VIỆN OPENCV 1.1 Giới thiệu chương Chương giới thiệu OpenCV (Open Source Computer Vision), thư viện mã nguồn mở thị giác máy với 500 hàm 2500 thuật toán tối ưu xử lý ảnh, vấn đề liên quan tới thị giác máy OpenCV thiết kế cách tối ưu, sử dụng tối đa sức mạnh dòng chip đa lõi… để thực phép tính toán thời gian thực, nghĩa tốc độ đáp ứng đủ nhanh cho ứng dụng thông thường OpenCV thư viện thiết kế để chạy nhiều tảng khác (cross-patform), nghĩa chạy hệ điều hành Window, Linux, Mac, iOS …Việc sử dụng thư viện OpenCV tuân theo quy định sử dụng phần mềm mã nguồn mở BSD sử dụng thư viện cách miễn phí cho mục đích phi thương mại lẫn thương mại Dự án OpenCV khởi động từ năm 1999, đến năm 2000 giới thiệu hội nghị IEEE vấn đề thị giác máy nhận dạng, nhiên OpenCV 1.0 tới tận năm 2006 thức công bố năm 2008 1.1 (pre-release) đời Tháng 10 năm 2009, OpenCV hệ thứ hai đời (thường gọi phiên 2.x), phiên có giao diện C++ (khác với phiên trước có giao diện C) có nhiều điểm khác biệt so với phiên thứ Thư viện OpenCV ban đầu hỗ trợ từ Intel, sau hỗ trợ bở Willow Garage, phòng thí nghiệm chuyên nghiên cứu công nghệ robot Cho đến nay, OpenCV thư viện mở, phát triển nguồn quỹ không lợi nhuận (none -profit foundation) hưởng ứng lớn cộng đồng 1.2 So sánh phiên OpenCV OpenCV Cho tới nay, trải qua năm từ lúc phiên OpenCV công bố, có nhiều phiên OpenCV đời, nhiên chia thư viện thành hai dựa đặc điểm khác biệt lớn chúng: Chương 2: Các phép xử lý ảnh đơn giản Opencv phiên OpenCV hệ thứ (hay gọi phiên OpenCV 1.x) phiên OpenCV thứ hai (hay gọi phiên OpenCV 2.x) Sau số điểm khác biệt hai phiên OpenCV 1.x (bao gồm 1.0 pre-release 1.1) dựa giao diện C, cấu trúc ảnh số dựa cấu trúc IplImage, thư OpenCV 2.x dựa giao diện C++, cấu trúc ảnh số, ma trận dựa cấu trúc cv::Mat Trong OpenCV 1.x, người sử dụng phải hoàn toàn quản lý nhớ đối tượng, nghĩa đối tượng tạo ra, phải ý để giải phóng không sử dụng (trong nhiều trường hợp bị tràn nhớ không ý này), thư viện OpenCV 2.x việc quản lý nhớ trở nên dễ dàng nhờ hàm hủy các lớp đối tượng OpenCV 2.x thực điều đối tượng không sử dụng Việc viết dòng lệnh để thực chức OpenCV 2.x dễ dàng nhiều so với OpenCV 1.x, phần là giao diện C++ có phần dễ hiểu so với C, phần hàm OpenCV 2.x tối ưu hóa nhiều bước trung gian không cần thiết mặt giao diện người sử dụng Chẳng hạn xét ví dụ việc phát đường tròn ảnh màu dựa vào thuật toán Hough, bước để thực load ảnh màu, chuyển sang ảnh nhị phân, tìm biên dựa lọc canny phát đường tròn dựa thuật toán Hough OpenCV 1.x thực sau: // Phát đường tròn ả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); Trong đó, OpenCV 2.x thực sau: Chương 2: Các phép xử lý ảnh đơn giản Opencv // Phát đường tròn ả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 OpenCV 2.x không cần phải khởi tạo, đối tượng storage (đối tượng trung gian, ý nghĩa mặt sử dụng) không cần phải khởi tạo (và không cần giải phóng) Thư viện OpenCV 1.x chứa lượng lớn hàm xử lý thuật toán, nhiên dạng sơ khai Thư viện OpenCV 2.x bổ xung nhiều hàm, thuật toán tối ưu nhiều đặc biệt khía cạnh phát đối tượng (detection), nhận dạng đối tượng (partten regconition) theo dõi đối tượng (tracking) Hơn nữa, có giao diện C++ OpenCV 2.x phần giao diện C để tương thích với phiên OpenCV 1.x Từ số đặc điểm thấy thư viện OpenCV phiên 2.x có nhiều điểm trội so với phiên 1.x, nhiên số trường hợp hệ thống nhúng mà trình dịch đơn chấp nhận ngôn ngữ C phiển 1.x giá trị Trong đồ án này, nội dung cài đặt, thuật toán, ứng dụng … dành cho OpenCV phiên 2.x tảng hệ điều hành Window 1.3 Hướng dẫn sử dụng thư viện Open CV Window Trước hết download thư viện OpenCV máy tính, tốt download địa http://sourceforge.net/projects/opencvlibrary/ Chọn build sẵn phù hợp với hệ điều hành dùng, OpenCV sử dụng đề tài 2.4.3 Sau download máy, tiến hành cài đặt bình Chương 2: Các phép xử lý ảnh đơn giản Opencv thường, để mặc định thư mục cài đặt C:\ thư mục cài đặt xong có dạng C:\opencv Tiếp theo tiến hành tùy chỉnh để làm việc với OpenCV qua hai IDE thông dụng Microsoft Visual Studio Eclipse Trên Microsoft Visual Studio Phiên Visual studio sử dụng phiên Visual Studio 2010, phiên trước hoàn toàn cấu hình cách tương tự Tạo project mới: New > Project, cửa sổ New Project chọn Visual C++, Win32 Console Application Đặt tên project opencv Hình 1.1 Chọn OK, sau nhấn Next, hộp thoại xuất hiện, hộp thoại chọn Application type Console application Additional option Empty project, nhấn Finish để kết thúc trình khởi tạo Chương 2: Các phép xử lý ảnh đơn giản Opencv Hình 1.2 Project tạo project hoàn toàn trống, phải thêm vào file nguồn để chương trình chạy được, Solution click chuột Explorer phải vào Source Files, chọn Add -> New Item… Hộp thoại Add New Item ra, ta chọn kiểu cần thêm vào C++ File(.cpp) đồng thời ô Name ta đặt tên file thêm vào, giả sử FirstApp.cpp cho Chương 2: Các phép xử lý ảnh đơn giản Opencv Hình 1.3 Bây file thêm vào #include gọi hàm main() để chạy chương trình Để chương trình chạy với thư viện OpenCV cần tùy chỉnh lại số thuộc tính project 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 ra, mục Configuration Properties chọn VC++ Directories, tương ứng bên phải, tìm mục Include Directories LibraryDirectories Chúng ta đường dẫn hai thư mục đến phần tương ứng 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 sử dụng hệ điều hành 32bit C:\opencv\build\x64\vc10\lib cho hệ điều hành 64bit Tiếp theo, hộp thoại opencv Property Pages -> Configuration Properties -> Linker chọn Input, tương ứng ô bên phải, thêm vào giá trị cho mục AdditionalDependencies làopencv_core243d.lib,opencv_imgproc243d.lib,opencv_highgui243d.lib Hình 1.4 10 Chương 2: Các phép xử lý ảnh đơn giản Opencv Thuật toán máy học SVM để nhận dạng từ Cơ sở liệu mẫu Hậu xử lý liệu Hình 4.3 Cần phải nhận thấy SVM máy phân loại liệu, muốn sử dụng cần phải có liệu, liệu kí tự mà cần nhận dạng đặc trưng ảnh kí tự Giả sử cần phân loại 30 lớp liệu (tương ứng với 30 kí tự biển số xe), với lớp liệu, ta tính toán 10 vector đặc trưng (10 mẫu), vector đặc trưng tưng ứng với đặc trưng ảnh Khi đưa vào huấn luyện SVM toàn liệu này, sau với ảnh bất kì, ta tính toán vector đặc trưng ảnh đó, mô hình SVM xem xét xem liệu (tứcvector đặc trưng này) thuộc vào lớp số lớp mà huấn luyện 4.3.2 Tính toán đặc trưng ảnh Đặc trưng ảnh đặc điểm riêng biệt giúp phân biệt ảnh với ảnh khác.Việc xem xét đặc trưng ảnh việc quy ước trước, phụ thuộc vào cách nghiên cứu, cài đặt trường hợp cụ thể đượcnghiên cứu để đưa phương pháp tốt Giả sử có hai kí tự hình bên, nhìn mắt thường dễ dàng phân biệt hai kí tự 4, nhiên để máy tính phân biệt hai kí tự này? Bây đưa hai kí tự kích thước, chia nhỏ kí tự thành 16 ô nhỏ khác 42 Chương 2: Các phép xử lý ảnh đơn giản Opencv Hình 4.4 Nhận thấy tính tổng pixel đen ô hai ảnh số số phân biệt dựa vào ô (1,1), (1, 4), (2, 2), (3,3) … ô đó, tổng số điểm ảnh đen khác hoàn toàn Tính toán số điểm ảnh đen 16 ô vuông ta thu 16 đặc trưng ảnh, 16 đặc trưng đủ để phân biệt kí tự 4.Tuy nhiên, với 30 kí tự ta cần phải tính toán nhiều đặc trưng, đặc trưng không thiết phải (tức điểm ảnh đen nào) 1(tức toàn số điểm ảnh đen ô) mà tỉ lệ tương đối Từ 16 đặc trưng trên, ta kết hợp chúng lại để tạo đặc trưng khác, chẳng hạn lấy tổng đặc trưng đường chéo (1,1) + (2,2) + (3,3) + (4,4) tổng đặc trưng xung quanh đường biên ảnh … số đặc trưng lớn việc phân loại lớp bị sai, có nghĩa xác suất nhận dạng lớn 4.4 Cài đặt chương trình nhận dạng biển số xe ô tô Chúng ta tạo chương trình dựa Dialog MFC, đặt tên project LPR (License Plate Recognition) Về chia chương trình thành phần sau: phần chứa giao diện chương trình (được định nghĩa file LPRDlg.h LPRDlg.cpp), phần chứa hàm cho việc phát hiện, nhận dạng biển số xe không liên quan tới giao diện (được định nghĩa file LprCore.h LprCore.cpp) phần chứa công cụ giúp cho ta huấn luyện mô hình SVM cách tùy ý (được định nghĩa file TrainSVM.h 43 Chương 2: Các phép xử lý ảnh đơn giản Opencv vàTrainSVM.cpp) Ngoài có số phần nhỏ giúp cho việc lập trình dễ dàng phần chuyển đổi biến liệu MFC chẳng hạn(unity_conversion.h) 4.4.1 Huấn luyện mô hình SVM Để tạo mô hình SVM phục vụ cho việc nhận dạng kí tự sau này, cần huấn luyện lưu mô hình sau huấn luyện Chuẩn bị sở liệu : Chúng ta cần chuẩn bị sở liệu tập hợp kí tự biển số xe Có 30 kí tự thường gặp biển số xe, ta cần phân loại 30 lớp này, trường hợp giả sử với lớp, tức kí tự ta có 10 ảnh, lưu ảnh vào folder, tên folder đặt tên theo kí tự, chẳng hạn folder chứa 10ảnh kí tự 0, folder chứa 10 ảnh kí tự 1, … folder 30 chứa 10 ảnh kí tự Z Ta cần đánh tên folder theo số tứ tự, số thứ tự nhãn tương ứng đưa vào việc nhận dạng Chúng ta tính toán đặc trưng kí tự lưu tất đặc trưng vàomột ma trận để phục vụ cho việc huấn luyện Hàm tính toán đặc trưng ảnh dựa ý tưởng tổng điểm đen khung hình, nhiên chuẩn hóa cách chia cho tổng tất điểm ảnh đen kí tự 4.5 Phát nhận dạng biển số xe Cài đặt lớp nhận phát nhận dạng biển số xe theo bước nói trên, đặt tên cho lớp LprCore Chúng ta cài đặt lớp với giao diện cho việc sử dụng dễ dàng nhất, giao diện (interface) lớp định nghĩa sau: // lprcore.h header #pragma once #include #include using namespace std; using namespace cv; class LprCore { public: 44 Chương 2: Các phép xử lý ảnh đơn giản Opencv LprCore(void); ~LprCore(void); void set_image(Mat); void set_svm_model(string); void do_process(); vector get_text_recognition(); vector get_plate_detection(); vector get_character_isolation(); vector get_character(); vector get_process_time(); void clear(); private: bool done; bool ready; SVM svm; Mat image; vector plates; vector draw_character; vector characters; vector text_recognition; vector process_time; char character_regconition(Mat); bool plate_detection(); bool plate_recognition(); }; 4.6 Giao diện chương trình Giao diện chương trình bao gồm picture control để hiển thị ảnh, button, menu cho việc điểu khiển label để hiển thị kết sau: 45 Chương 2: Các phép xử lý ảnh đơn giản Opencv Hình 4.5 Ngoài ra, chương trình có số menu khác nhằm giúp lưu kết ảnh biển số kết nhận dạng dạng chuỗi text, menu hiển thị dialog cho việc huấn luyện mô hình SVM Hình sau mô tả kết chạy chương trình: Hình 4.6 46 Chương 2: Các phép xử lý ảnh đơn giản Opencv Nhận xét: Tùy vào độ phân giải góc độ camera so với biển số xe kết xác khác Nên dùng loại camera MTC-WDL713EF-R 4.7 Kết luận chương Theo kết mô thử nghiệm 10 mẫu thử tỷ lệ nhận dạng 100% Tuy nhiên thử nghiệm nhiều mẫu thử tỷ lệ nhận dạng không hoàn toàn ý muốn mà thấp có nhiều yếu tố bất lợi KẾT LUẬN – HƯỚNG PHÁT TRIỂN Sự phát triển công nghệ thông tin có tác động đến nhiều mặt đời sông xã hội phải kể đến lĩnh vực giám sát tự động Trong giám sát tự động, việc giám sát phương tiện giao thông vấn đề trội Nhiều phủ, thành phố giới xây dựng hệ thống giám sát tự động phương tiện giao thông Đề tài nhằm mục đích tìm hiểu toán giám sát, quản lý phương tiện giao thông cách tự động thông qua việc “Phát nhận dạng chữ, số biển số xe” Đề tài trình bày cách hệ thống toán nhận dạng biển số xe hướng giải sở toán bản: Phát vùng chứa biển số xe toán nhận dạng chữ số vùng phát Bài toán nhận dạng biển số xe xây dựng mô hình chung tổng quát, để ứng dụng thực tế cần giới hạn bớt lại số điều kiện giúp cho việc tìm kiếm biển số xác hơn, thêm vào mẫu huấn luyện kí tự cần phải sưu tập nhiều hơn, vector đặc trưng phải tính toán tỉ mỉ để giúp cho kết nhận dạng có độ xác cao Ngoài ra, nhiều khía cạnh khác liên quan đến toán ứng dụng thực tế cần phải xây dựng hệ sở liệu để lưu trữ kết quả, so sánh kết quả, xây dựng hệ thống phần cứng, điều 47 Chương 2: Các phép xử lý ảnh đơn giản Opencv khiển phần cứng để điều khiển hệ thống hệ thống thẻ từ RFID, hệ camera, hệ động cho điều khiển học … Một lần em xin chân thành cảm ơn thầy, cô truyền đạt kiến thức để em hoàn thành đồ án có kết mong đợi 48 Chương 2: Các phép xử lý ảnh đơn giản Opencv TÀI LIỆU THAM KHẢO [1] Hoàng Kiếm, Nguyễn Ngọc Kỷ tác giả, “Nhận dạng phương pháp ứng dụng”, NXB thống kê năm 1992 [2] Lương Mạnh Bá, Nguyễn Thanh Thủy, “Nhập môn xử lý ảnh số”, NXB KH&KT năm 2003 [3] Nguyễn Quốc Trung, “Xử lý tín hiệu lọc số, tập 1”, NXB KH&KT, 2006 [4] Đỗ Năng Toàn, “Một thuật toán phát vùng ứng dụng trình vectơ hóa tự động”, Tạp chí Tin học Điều khiển, Tập 16 số năm 2000 [5] Đỗ Năng Toàn, “Biên ảnh số tính chất”, Tạp chí KH&CN, Tập 40 số ĐB năm 2002 PHỤ LỤC 49 Chương 2: Các phép xử lý ảnh đơn giản Opencv Chương trình tải ảnh hiển thị ảnh giao diện MFC void CHienThiThongTinAnhDlg::OnBnClickedButton1() { // Load anh va hien thi anh static CString Filter=_T("image files (*.bmp; *.jpg) |*.bmp;*.jpg|All Files(*.*)|*.*||"); CFileDialog Load(TRUE, _T("*.jpg"), NULL, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,Filter, NULL); Load.m_ofn.lpstrTitle= _T("Load Image"); if (Load.DoModal() == IDOK) { path = Load.GetPathName(); std::string filename(path); src = cv::imread(filename,1); cv::namedWindow("Hien thi anh", 1); HWND hWnd = (HWND) cvGetWindowHandle("Hien thi anh"); HWND hParent = ::GetParent(hWnd); ::SetParent(hWnd, GetDlgItem(IDC_STATIC_PICTURE)->m_hWnd); ::ShowWindow(hParent, SW_HIDE); // resize va hien thi anh cv::Mat dst; cv::resize(src, dst, cv::Size(320, 240), 0, 0, 1); cv::imshow("Hien thi anh", dst); } } Trong hàm hàm cvGetWindowHandle() trả HWND cửa sổ hiển thị ảnh OpenCV, sau hàm SetParent() đặt cửa sổ vào điều khiển Picture Controlcủa MFC, cách ta dùng để hiển thị ảnh lên 50 Chương 2: Các phép xử lý ảnh đơn giản Opencv control MFCthay phải chuyển đổi ảnh sang HBITMAP dùng hàm SetBitmap Hàm cv::resize()giúp chuyển từ ảnh ảnh có kích thước 320x240 giúp hiển thị trọn kíchthước Picture Control Cuối cùng, gọi hàmcv::imshow() OpenCV, ta sẽthấy ảnh hiển thị Picture Control void CHienThiThongTinAnhDlg::OnBnClickedButton2() { // Hien thi thong tin anh if(src.empty()) MessageBoxA("Chua tai anh", "Thong bao", 0); else { int width_ = src.cols; int height_ = src.rows; int channels_ = src.channels(); CString result; result.Format("%d", width_); l_width.SetWindowTextA(result); result.Format("%d", height_); l_height.SetWindowTextA(result); result.Format("%d",channels_); l_channels.SetWindowTextA(result); l_path.SetWindowTextA(path); } } Ở button Thoat, click vào vào chương trình thoát ra, việc thoát khỏi chương trình đạt cách gọi hàm OnCancel() void CHienThiThongTinAnhDlg::OnBnClickedButton3() 51 Chương 2: Các phép xử lý ảnh đơn giản Opencv { // Thoat khoi chuong trinh this->OnCancel(); } Chương trình huấn luyện mô hình SVM vector calculate_feature(Mat src) { Mat img; if(src.channels() == 3) cvtColor(src, img, CV_BGR2GRAY); threshold(img, img, 100, 255, CV_THRESH_BINARY); vector r; resize(img, img, Size(40, 40)); int h = img.rows/4; int w = img.cols/4; int S = count_pixel(img); int T = img.cols * img.rows; for(int i = 0; i < img.rows; i += h) { for(int j = 0; j < img.cols; j += w) { Mat cell = img(Rect(i,j, h , w)); int s = count_pixel(cell); float f = (float)s/S; r.push_back(f); } } for(int i = 0; i < 16; i+= 4) { float f = r[i] + r[i+1] + r[i+2] + r[i+3]; r.push_back(f); } for(int i = 0; i < 4; ++i) { float f = r[i] + r[i+4] + r[i+8] + r[i+ 12]; r.push_back(f); } 52 Chương 2: Các phép xử lý ảnh đơn giản Opencv r.push_back(r[0] + r[5] + r[10] + r[15]); r.push_back(r[3] + r[6] + r[9] + r[12]); r.push_back(r[0] + r[1] + r[4] + r[5]); r.push_back(r[2] + r[3] + r[6] + r[7]); r.push_back(r[8] + r[9] + r[12] + r[13]); r.push_back(r[10] + r[11] + r[14] + r[15]); r.push_back(r[5] + r[6] + r[9] + r[10]); r.push_back(r[0] + r[1] + r[2] + r[3] + r[4] + r[7] + r[8] + r[11] +r[12] + r[13] + r[14] + r[15]); return r; //32 dac trung } Trong hàm count_pixel hàm tính toán số pixel đen ảnh int count_pixel(Mat img, bool black_pixel = true) { int black = 0; int white = 0; for(int i = 0; i < img.rows; ++i) for(int j = 0; j < img.cols; ++j) { if(img.at(i,j) == 0) black++; else white++; } if(black_pixel) return black; else return white; } 53 Chương 2: Các phép xử lý ảnh đơn giản Opencv Đoạn code sau huấn luyện mô hình svm, với đầu vào folder chứa liệu huấn luyện nói (folder chứa 30 folder con, folder chứa 10 kí tự mẫu) const int number_of_class = 30; const int number_of_sample = 10; const int number_of_feature = 32; CvSVMParams params; params.svm_type = CvSVM::C_SVC; params.kernel_type = CvSVM::RBF; params.gamma = 0.5; params.C = 16; params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); SVM svm; Mat data = Mat(number_of_sample * number_of_class, number_of_feature, CV_32FC1); Mat label = Mat(number_of_sample * number_of_class, 1, CV_32FC1); int index = 0; vector folders = list_folder("D:/Data"); for(size_t i = 0; i < folders.size(); ++i) { cout[...]... tiên mang tính quyết định đối với quá trình xử lý ảnh Ảnh đầu vào sẽ được thu nhận qua các thiết bị camera, máy scanner…và sau đó tín hiệu này sẽ được số hóa và qua các công đoạn xử lý như trên với mục đích nâng cao chất lượng ảnh để chuẩn bị cho các bước xử lý phức tạp hơn về sau 25 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 3.1 Giới thiệu chương:... dụng các phép toán hình thái trong ảnh trong việc phát hiện biển số xe ô tô và cách ly các kí tự trong biển số Giả sử ta có một ảnh chứa biển số, vì biển số có nền trắng và kí tự màu đen, nên trước tiên ta nhị phân ảnh đó, sau đó tìm đường bao của các đối tượng (contour) để từ đó xác định được xem những đường bao nào có khả năng là biển số xe nhất dựa trên tỉ lệ các cạnh chiều dài, rộng của hình chữ... 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. .. D(E(I)) + Phép toán đóng : Close(I) = E(D(I)) Phép toán mở được ứng dụng trong việc loại bỏ các phần lồi lõm và làm cho đường bao quanh đối tượng trong ảnh trở nên mượt mà hơn Phép toán đóng được ứng dụng trong việc làm trơn đường bao quanh đối tượng, lấp đầy các khoảng trống trên biên và loại bỏ những hố nhỏ (một số pixel ứng thành cụm độc lập) Trong OpenCV, các phép toán hình thái học trong ảnh được cài... của hai số nguyên lẻ, anchor là điểm neo và thông thường nhận giá trị là((ksize.width – 1)/2, (ksize.height – 1)/2) Thông số tiếp theo anchor cũng có ý nghĩa tương tự iterations là số lần lặp 21 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv lại của phép toán hình thái và hai thông số cuối cùng là về giới hạn biên của những điểm ảnh nằm ngoài kích thước ảnh trong quá trình tính toán Phép toán về... Phép toán co (erosion) Phép toán co được định nghĩa A = {x |} trong đó A là đối tượng trong ảnh, B là cấu trúc phần tử ảnh Ta cũng sẽ xét một ví dụ như trên với phép co trong ảnh Đối tượng trong ảnh được biểu diễn bởi màu xám, cấu trúc phần tử ảnh là khối có viền màu đỏ, x là điểm sau phép thỏa mãn phép co ảnh, 0 là điểm không thỏa mãn Hình 2.8 20 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv Nhận. .. Chương 2: Các phép xử lý ảnh đơn giản trong Opencv 2.4 Các phép toán hình thái học trong ảnh Các phép toán hình thái học là những phép toán liên quan tới cấu trúc hình học (hay topo) của các đối tượng trong ảnh Các phép toán hình thái học tiêu biểu bao gồm phép giãn nở (dialation), phép co (erosion), phép mở (opening) và phép đóng (closing) 2.4.1 Phép toán giãn nở (dialation) Phép toán giãn nở được... trong ảnh, B là một cấu trúc phần tử ảnh Phép toán này có tác dụng làm cho đối tượng ban đầu trong ảnh tăng lên về kích thước (giãn nở ra) Cấu trúc phần tử ảnh (image structuring element) là một hình khối được định nghĩa sẵn nhằm tương tác với ảnh xem nó có thỏa mãn một số tính chất nào đó không, một số cấu trúc phần tử hay gặp là cấu trúc theo khối hình vuông và hình chữ thập Hình 2.6 Xét một ảnh với... đối tượng trong ảnh được biểu diễn bằng màu nền nâu, sau đó dùng cấu trúc phần tử hình vuông (màu đỏ) để làm giãn nở ảnh, kết quả là ảnh được giãn nở ra, chúng ta đánh dấu là dấu x 19 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv Hình 2.7 Ứng dụng của phép giãn nở là làm cho đối tượng trong ảnh được tăng lên về kích thước, các lỗ nhỏ trong ảnh được lấp đầy, nối liền đường biên ảnh đối với những... ta có thể xem xét liệu đường bao mà ta tìm được có phải là một vùng của biển số hay không, nếu phải ta sẽ vẽ hình chữ nhật này thông qua hàm rectangle với một màu khác (Scalar(0, 0, 255) :màu đỏ) và nét đậm hơn Kết quả chạy chương trình như sau: 24 Chương 2: Các phép xử lý ảnh đơn giản trong Opencv Hình 2.9 Nhận thấy rằng, điểm đứt trong ảnh được nối liền nhờ sự giãn nở của biển cạnh biển số (sự co

Ngày đăng: 24/06/2016, 22:49

Từ khóa liên quan

Mục lục

  • DANH MỤC CÁC TỪ VIẾT TẮT

  • API Application Programming Interface

  • BSD Berkeley Software Distribution 

  • IDE  Integrated Development Environment

  • MỞ ĐẦU

  • CHƯƠNG 1 : LÀM QUEN VỚI THƯ VIỆN OPENCV

    • 1.1 Giới thiệu chương

    • 1.2 So sánh phiên bản OpenCV 1 và OpenCV 2

    • 1.3 Hướng dẫn sử dụng thư viện Open CV trên Window

    • CHƯƠNG 2 : CÁC PHÉP XỬ LÝ ẢNH ĐƠN GIẢN TRONG OPENCV

      • 2.1 Giới thiệu chương

      • 2.3 Ảnh nhị phân, nhị phân hóa với ngưỡng động

      • Hình 2.5

      • 2.4 Các phép toán hình thái học trong ảnh

      • CHƯƠNG 3 : LẬP TRÌNH XỬ LÝ ẢNH VỚI GIAO DIỆN MFC

        • 3.1 Giới thiệu chương:

        • 3.4 Chuyển đổi các kiểu dữ liệu trong MFC

        • 3.5 Tải ảnh và hiển thị ảnh trên giao diện MFC

        • CHƯƠNG 4 : NHẬN DẠNG BIỂN SỐ XE BẰNG THUẬT TOÁN

        • SVM DÙNG THƯ VIỆN OPENCV

          • 4.1 Giới thiệu chương

          • 4.3 Nhận dạng kí tự

          • 4.4 Cài đặt chương trình nhận dạng biển số xe ô tô

Tài liệu cùng người dùng

Tài liệu liên quan