MÔ PHỎNG NHẬN DẠNG BIỂN số XE bằng OPEN CV7 (có code) ........ MÔ PHỎNG NHẬN DẠNG BIỂN số XE bằng OPEN CV7 (có code) ........ MÔ PHỎNG NHẬN DẠNG BIỂN số XE bằng OPEN CV7 (có code) ........ MÔ PHỎNG NHẬN DẠNG BIỂN số XE bằng OPEN CV7 (có code) ........
MÔ PHỎNG NHẬN DẠNG BIỂN SỐ XE MỤC LỤC DANH MỤC CÁC HÌNH VẼ VII DANH MỤC CÁC TỪ VIẾT TẮT IX CHƯƠNG TỔNG QUAN VỀ HỆ THỐNG NHẬN DẠNG BIỂN SỐ XE 1.1 GIỚI THIỆU 1.1.1 Tính chất nhận dạng 1.1.2 Một số ứng dụng việc nhận dạng CHƯƠNG BÀI TOÁN NHẬN DẠNG 2.1 TÌM HIỂU VỀ ẢNH SỐ 2.1.1 Các khái niệm ảnh 2.1.2 Cách phân loại ảnh 2.2 MƠ HÌNH VÀ BẢN CHẤT CỦA VIỆC NHẬN DẠNG 2.2.1 Không gian biểu diễn đối tượng 2.2.2 Không gian diễn dịch .4 2.2.3 Mơ hình nhận dạng 2.2.4 Bản chất việc nhận dạng CHƯƠNG QUÁ TRÌNH XỬ LÝ ẢNH BẰNG OPEN CV7 3.1 HƯỚNG GIẢI QUYẾT 3.1.1 Các tiêu chuẩn kích thước .7 3.1.2 Số lượng ký tự biển số xe 3.2 SƠ ĐỒ GIẢI THUẬT 3.3 TIỀN XỬ LÝ ẢNH 3.3.1 Biến đổi ảnh xám 3.3.2 Xử lý nhị phân 3.3.3 Tìm đối tượng findContours .10 3.4 3.4.1 THUẬT TOÁN SVM TRONG NHẬN DẠNG BIỂN SỐ XE 11 Giới thiệu .11 CHƯƠNG NHẬN XÉT 12 4.1 NHẬN XÉT 12 CHƯƠNG KẾT LUẬN 13 5.1 ƯU ĐIỂM 13 5.2 KHUYẾT ĐIỂM 13 5.3 HƯỚNG PHÁT TRIỂN 13 TÀI LIỆU THAM KHẢO 14 PHỤ LỤC A 15 DANH MỤC CÁC HÌNH VẼ HÌNH 1-1:NHẬN DẠNG VÂN TAY TRÊN MÁY ATM HÌNH 1-2: SƠ ĐỒ BÀI TỐN NHẬN DẠNG10 HINH 1-3: BIẾN ĐỔI XÁM .11 HÌNH 1-4:BIẾN ĐỔI NHỊ PHÂN 12 HÌNH 1-5: DỊ BIÊN 13 DANH MỤC CÁC TỪ VIẾT TẮT SVM support vectors machine Trang 1/25 CHƯƠNG TỔNG QUAN VỀ HỆ THỐNG NHẬN DẠNG BIỂN SỐ XE 1.1 Giới thiệu Hiện với lượng phương tiện giao thông ngày tăng mạnh, việc quản lý phương tiện giao thông toán cần lưu tâm Và với phát triển mạnh mẽ công nghệ thông tin, việc nhận dạng biể số xe ngày tối ưu hóa hiệu việc sử dụng cơng cụ tốn học tin học, cụ thể mô open cv với phương pháp SVM Phần mềm mơ open cv với phương pháp SVM có tính xác ứng dụng cao, tiền đề để phát việc nhận dạng ngày tốt 1.1.1 Tính chất nhận dạng Nhận dạng trình phân loại đối tượng biểu diễn theo mô hình gán cho chúng vào lớp, dựa theo quy luật mẫu chuẩn trình nhận dạng dựa vào mẫu biết trước gọi nhận dạng có thầy, trường hợp lại gọi học khơng có thầy 1.1.2 Một số ứng dụng việc nhận dạng Ứng dụng việc nhận dạng việc chấm công dựa dấu vân tay, hay nhận dạng vân tay máy ATM mà khơng cần quẹt thẻ nhiều ứng dụng thực tế khác nhận dạng giọng nói ứng dụng Jibbigo điện thoại di động Hình 1-1: Nhận dạng vân tay máy ATM Mô Phỏng Nhận Dạng Biển số xe Trang 2/25 CHƯƠNG BÀI TOÁN NHẬN DẠNG 2.1 Tìm hiểu ảnh số 2.1.1 Các khái niệm ảnh 2.1.2 Cách phân loại ảnh - Ảnh nhị phân Ảnh nhị phân ảnh mà giá trị điểm ảnh biểu diễn hai giá trị 255 tương ứng với hai màu đen trắng Nhị phân hóa ảnh trình biến ảnh xám thành ảnh nhị phân Gọi f(x,y) giá trị cường độ sáng điểm ảnh vị trí (x,y), T ngưỡng nhị nhị phân Khi đó, ảnh xám f chuyển thành ảnh nhị phân dựa vào công thức f(x,y) = f(x,y) ≤ T f(x,y) = 255 f(x,y) > T - Ảnh màu Hệ màu RGB: Hệ màu CMY Là phần bù hệ màu RGBCMYK không gian màu sử dụng phổ biến trongngành công nghiệp in ấn.Ý tưởng hệ khônggian dùng màu sắc để phục vụ cho việc pha trộn mực in Trên thực tế, người ta dùng màu C=Cyan: xanh lơ, M=Magenta: hồng xẫm, Y=Yellow: vàng để biểu diễn màu sắc khác 2.2 Mơ hình chất việc nhận dạng 2.2.1 Không gian biểu diễn đối tượng Các đối tượng quan sát hay thu nhập thường biểu diễn tập đặc trưng hay đặc tính Như trường hợp xử lý ảnh, ảnh sau tăng cường để nâng cao chất lượng, phân vùng trich lọc đặc tính, biểu diễn đặc trưng biên, miền đồng … người ta thường phân đặc trưng theo đặc trưng như: đặc trưng tô pô, đặc trưng hình học đặc trưng chức Việc biểu diễn ảnh theo đặc trưng phụ thuộc vào ứng dụng Mô Phỏng Nhận Dạng Biển số xe Trang 3/25 Ví dụ : giả sử đối tường X (ảnh, chữ viết, dấu vân tay,…) biểu diễn n thành phần đặc trưng: X={x1,x2….,xn}; xi biểu diễn đặc tính Khơng gian biểu diễn đối tượng thường gọi tắt không gian đối tượng A định nghĩa: A={X1,X2……,Xm} Trong Xi biểu diễn đối tượng Khơng gian vơ hạn để tiện xem xét ta xét tập hữu hạn 2.2.2 Không gian diễn dịch Không gian diễn dịch tập tên gọi đối tượng Kết thúc trình nhận dạng ta xác định tên gọi cho đối tượng tập không gian đối tượng hay nói nhận dạng đối tượng Một hình thức gọi Ω tập tên đối tượng: Ω ={ w1 ,w2,….wk} với wi, i= 1,2,….k tên đối tượng 2.2.3 Mơ hình nhận dạng Việc chọn lựa q trình nhận dạng có liên quan mật thiết đến kiểu mô tả mà người ta sử dụng để đặc tả đối tượng Trong nhận dạng, người ta phân chia theo hai họ lớp: - Học mô tả theo tham số - Học mô tả theo cấu trúc Cách mô tả lựa chọn xác định mơ hình đối tượng Như vậy, chúng có loại mơ hình: mơ hình theo tham số mơ hình cấu trúc Mơ hình tham số Mơ hình tham số sử dụng vector để đặc đối tương Mỗi phần tử củavector tọa độ điểm Như vậy, moment trung tâm bậc p,q đường bao : Mô Phỏng Nhận Dạng Biển số xe Trang 4/25 Mơ hình cấu trúc Cách tiếp cận mơ hình dựa vào việc mơ tả đối tượng nhờ số khái niệm biểu thị đối tượng sở ngôn ngữ tự nhiên Để mô tả đối tượng, người ta dùng số dạng nguyên thủy đoạn thẳng, cung … Chẳng hạn hình chữ nhật định nghĩa gồm đoạng thẳng vng góc với đơi Trong mơ hình người ta sử dụng kí hiệu kết thúc Vt, kí hiệu khơng kết thúc gọi Vn Ngồi dùng tập luật sản xuất để mô tả cách xây dựng đối tượng phù hợp dựa đối tượng đơn giản đối tượng nguyên thủy Trong cách tiếp cận này, ta chấp nhận khẳng định là: cấu trúc kết việc áp dụng luật sản xuất theo nguyên tắc xác định dạng gốc bắt đầu Một cách hình thức, ta coi mơ hình tương đương văn phạm G=(Vt,Vn,P,S) với Vt kí hiệu kết thúc, Vn ký hiệu không kết thúc, P luật sản xuất, S dạng ( ký hiệu bắt đầu) 2.2.4 Bản chất việc nhận dạng Quá trình nhận dạng gồm giai đoạn chính: - Lựa chọn mơ hình biểu diễn đối tượng - Lựa chọn luật định (phương pháp nhận dạng) suy diễn trình học - Học nhận dạng Khi mơ hình biểu diễn đối tượng xác định, định lượng ( mơ hình tham số) hay định tính ( mơ hình cấu trúc), q trình nhận dạng chuyển sang giai đoạn học Học giai đoạn quan trọng Thao tác học nhằm cải thiện, điểu chỉnh việc phân hoạch tập đối tượng thành lớp Việc nhận dạng tìm quy luật thuật tốn để gán đối tượng vào lớp hay nói cách khác gán cho đối tượng tên Học có thầy Mơ Phỏng Nhận Dạng Biển số xe Trang 10/25 đường biền xây dựng lại hệ thống phân cấp đầy đủ đường nét lồng Method: phương pháp lấy đường viền xấp xỉ ví dụ: CV_CHAIN_APPROX_SIMPLE nén phân đoạn ngang , dọc chéo vị trí Offset Tùy trọn bù đắp Hình 1-5: Dò biên 3.4 Thuật tốn SVM nhận dạng biển số xe 3.4.1 Giới thiệu Support vector machine (SVM) xây dựng (learn) siêu phẳng (hyperplane) để phân lớp (classify) tập liệu thành lớp riêng biệt.SVM khái niệm thống kê khoa học máy tính cho tập hợp phương pháp học có giám sát liên quan đến để phân loại phân tích hồi quy.SVM thuật tốn phân loại nhị phân, SVM nhận liệu vào phân loại chúng vào hai lớp khác Với ví dụ luyện tập thuộc hai thể loại cho trước, thuật tốn luyện tập SVM xây dựng mơ hình SVM để phân loại ví dụ khác vào hai thể loại Mơ Phỏng Nhận Dạng Biển số xe Trang 11/25 CHƯƠNG NHẬN XÉT 4.1 Nhận xét Bài tốn nhận dạng biển số xe nhiểu khuyết điểm nhận dạng số biển có độ sáng mờ biển số có góc nghiêng Mơ Phỏng Nhận Dạng Biển số xe Trang 12/25 CHƯƠNG KẾT LUẬN 5.1 Ưu điểm Đối với biển số có góc chụp diện việc nhận dạng biển số xác hồn tồn Và với việc sử dụng thuật tốn SVM liệu nhận dạng tối ưu hóa đa dạng 5.2 Khuyết điểm Chưa nhận dạng biển số chụp góc nghiêng biển số nhòe khơng rõ ràng 5.3 Hướng phát triển Có thể kết hợp với phần cứng khác để nâng cao hiệu suất Bài tốn nhận dạng tiếp cận nhiều hướng khác để nâng cao tính xác Mơ Phỏng Nhận Dạng Biển số xe Trang 13/25 TÀI LIỆU THAM KHẢO Tiếng Việt: [1] Stdio.vn [2] Tailieu.vn Mô Phỏng Nhận Dạng Biển số xe Trang 14/25 PHỤ LỤC A #pragma once #include #include #include #include #include "dirent.h" #include "feature.h" #include "jackylib.h" #include namespace licPlaterec { using using using using using using using using using using namespace namespace namespace namespace namespace namespace namespace namespace namespace namespace System; System::ComponentModel; System::Collections; System::Windows::Forms; System::Data; System::Drawing; cv; std; cv::ml; jacky_lib; Mat srcImg; str2char stringTochar; mat2picture mat2bmp; public ref class MainForm : public System::Windows::Forms::Form { public: MainForm(void) { InitializeComponent(); } protected: ~MainForm() { if (components) { delete components; } } private: System::Windows::Forms::GroupBox^ groupBox1; protected: private: System::Windows::Forms::PictureBox^ ptbSrc; private: System::Windows::Forms::GroupBox^ groupBox2; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Label^ label3; private: System::Windows::Forms::Label^ label2; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::PictureBox^ ptbCha; Mô Phỏng Nhận Dạng Biển số xe Trang 15/25 private: System::Windows::Forms::PictureBox^ ptbPlate; private: System::Windows::Forms::GroupBox^ groupBox3; private: System::Windows::Forms::Button^ btnProcess; private: System::Windows::Forms::Button^ btnLoad; private: System::Windows::Forms::Label^ label4; private: System::Windows::Forms::Label^ imgSize; private: System::ComponentModel::IContainer^ components; private: #pragma region Windows Form Designer generated code void InitializeComponent(void) { this->groupBox1 = (gcnew System::Windows::Forms::GroupBox()); this->ptbSrc = (gcnew System::Windows::Forms::PictureBox()); this->groupBox2 = (gcnew System::Windows::Forms::GroupBox()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->label3 = (gcnew System::Windows::Forms::Label()); this->label2 = (gcnew System::Windows::Forms::Label()); this->label1 = (gcnew System::Windows::Forms::Label()); this->ptbCha = (gcnew System::Windows::Forms::PictureBox()); this->ptbPlate = (gcnew System::Windows::Forms::PictureBox()); this->groupBox3 = (gcnew System::Windows::Forms::GroupBox()); this->btnProcess = (gcnew System::Windows::Forms::Button()); this->btnLoad = (gcnew System::Windows::Forms::Button()); this->label4 = (gcnew System::Windows::Forms::Label()); this->imgSize = (gcnew System::Windows::Forms::Label()); this->groupBox1->SuspendLayout(); (cli::safe_cast(this->ptbSrc))>BeginInit(); this->groupBox2->SuspendLayout(); (cli::safe_cast(this->ptbCha))>BeginInit(); (cli::safe_cast(this->ptbPlate))>BeginInit(); this->groupBox3->SuspendLayout(); this->SuspendLayout(); this->groupBox1->Controls->Add(this->ptbSrc); this->groupBox1->Location = System::Drawing::Point(12, 12); this->groupBox1->Name = L"groupBox1"; this->groupBox1->Size = System::Drawing::Size(622, 474); this->groupBox1->TabIndex = 0; this->groupBox1->TabStop = false; this->groupBox1->Text = L"Anh goc"; this->groupBox1->Enter += gcnew System::EventHandler(this, &MainForm::groupBox1_Enter); this->ptbSrc->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle; this->ptbSrc->Location = System::Drawing::Point(6, 19); Mô Phỏng Nhận Dạng Biển số xe Trang 16/25 this->ptbSrc->Name = L"ptbSrc"; this->ptbSrc->Size = System::Drawing::Size(610, 449); this->ptbSrc->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom; this->ptbSrc->TabIndex = 0; this->ptbSrc->TabStop = false; this->ptbSrc->Click += gcnew System::EventHandler(this, &MainForm::ptbSrc_Click); this->groupBox2->Controls->Add(this->textBox1); this->groupBox2->Controls->Add(this->label3); this->groupBox2->Controls->Add(this->label2); this->groupBox2->Controls->Add(this->label1); this->groupBox2->Controls->Add(this->ptbCha); this->groupBox2->Controls->Add(this->ptbPlate); this->groupBox2->Location = System::Drawing::Point(640, 12); this->groupBox2->Name = L"groupBox2"; this->groupBox2->Size = System::Drawing::Size(158, 224); this->groupBox2->TabIndex = 0; this->groupBox2->TabStop = false; this->groupBox2->Text = L"ket qua"; this->groupBox2->Enter += gcnew System::EventHandler(this, &MainForm::groupBox2_Enter); this->textBox1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 15.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast(0))); this->textBox1->Location = System::Drawing::Point(6, 172); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(146, 31); this->textBox1->TabIndex = 2; this->label3->AutoSize = true; this->label3->Location = System::Drawing::Point(7, 156); this->label3->Name = L"label3"; this->label3->Size = System::Drawing::Size(76, 13); this->label3->TabIndex = 1; this->label3->Text = L"KQ nhan dang"; this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(7, 86); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(30, 13); this->label2->TabIndex = 1; this->label2->Text = L"ky tu"; this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(7, 20); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(41, 13); Mô Phỏng Nhận Dạng Biển số xe Trang 17/25 this->label1->TabIndex = 1; this->label1->Text = L"bien so"; // ptbCha this->ptbCha->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle; this->ptbCha->Location = System::Drawing::Point(6, 102); this->ptbCha->Name = L"ptbCha"; this->ptbCha->Size = System::Drawing::Size(146, 46); this->ptbCha->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom; this->ptbCha->TabIndex = 0; this->ptbCha->TabStop = false; this->ptbCha->Click += gcnew System::EventHandler(this, &MainForm::ptbCha_Click); this->ptbPlate->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle; this->ptbPlate->Location = System::Drawing::Point(6, 36); this->ptbPlate->Name = L"ptbPlate"; this->ptbPlate->Size = System::Drawing::Size(146, 46); this->ptbPlate->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom; this->ptbPlate->TabIndex = 0; this->ptbPlate->TabStop = false; this->ptbPlate->Click += gcnew System::EventHandler(this, &MainForm::ptbPlate_Click); this->groupBox3->Controls->Add(this->btnProcess); this->groupBox3->Controls->Add(this->btnLoad); this->groupBox3->Location = System::Drawing::Point(640, 376); this->groupBox3->Name = L"groupBox3"; this->groupBox3->Size = System::Drawing::Size(158, 110); this->groupBox3->TabIndex = 1; this->groupBox3->TabStop = false; this->groupBox3->Text = L"dieu khien"; this->btnProcess->Location = System::Drawing::Point(10, 48); this->btnProcess->Name = L"btnProcess"; this->btnProcess->Size = System::Drawing::Size(142, 23); this->btnProcess->TabIndex = 0; this->btnProcess->Text = L"nhan dang"; this->btnProcess->UseVisualStyleBackColor = true; this->btnProcess->Click += gcnew System::EventHandler(this, &MainForm::btnProcess_Click); this->btnLoad->Location = System::Drawing::Point(10, 19); this->btnLoad->Name = L"btnLoad"; this->btnLoad->Size = System::Drawing::Size(142, 23); this->btnLoad->TabIndex = 0; this->btnLoad->Text = L"Load anh"; this->btnLoad->UseVisualStyleBackColor = true; Mô Phỏng Nhận Dạng Biển số xe Trang 18/25 this->btnLoad->Click += gcnew System::EventHandler(this, &MainForm::btnLoad_Click); this->label4->AutoSize = true; this->label4->Location = System::Drawing::Point(643, 253); this->label4->Name = L"label4"; this->label4->Size = System::Drawing::Size(78, 13); this->label4->TabIndex = 2; this->label4->Text = L"kich thuoc anh"; this->imgSize->AutoSize = true; this->imgSize->Location = System::Drawing::Point(727, 253); this->imgSize->Name = L"imgSize"; this->imgSize->Size = System::Drawing::Size(0, 13); this->imgSize->TabIndex = 2; >EndInit(); >EndInit(); >EndInit(); this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(810, 498); this->Controls->Add(this->imgSize); this->Controls->Add(this->label4); this->Controls->Add(this->groupBox3); this->Controls->Add(this->groupBox2); this->Controls->Add(this->groupBox1); this->Name = L"MainForm"; this->Text = L"MainForm"; this->groupBox1->ResumeLayout(false); (cli::safe_cast(this->ptbSrc))this->groupBox2->ResumeLayout(false); this->groupBox2->PerformLayout(); (cli::safe_cast(this->ptbCha))(cli::safe_cast(this->ptbPlate))this->groupBox3->ResumeLayout(false); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion { private: System::Void btnLoad_Click(System::Object^ sender, System::EventArgs^ e) OpenFileDialog^ dgOpen = gcnew OpenFileDialog(); dgOpen->Filter = "Image(*.bmp; *.jpg)|*.bmp;*.jpg|All files (*.*)|*.*||"; if (dgOpen->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) { return; } Bitmap^ bmpSrc = gcnew Bitmap(dgOpen->FileName); ptbSrc->Image = bmpSrc; Mô Phỏng Nhận Dạng Biển số xe Trang 19/25 ptbSrc->Refresh(); srcImg = imread(stringTochar.ConvertString2Char(dgOpen->FileName)); int dbSize_H = srcImg.rows; int dbSize_W = srcImg.cols; System::String^ h = gcnew System::String(to_string(dbSize_H).c_str()); System::String^ w = gcnew System::String(to_string(dbSize_W).c_str()); imgSize->Text = w + "x" + h; } private: System::Void btnLearn_Click(System::Object^ sender, System::EventArgs^ e) { FolderBrowserDialog^ folderOpen = gcnew FolderBrowserDialog(); if (folderOpen->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) { return; } System::String^ sysImgpath; sysImgpath = folderOpen->SelectedPath; char cStr[50] = { }; if (sysImgpath->Length < sizeof(cStr)) sprintf(cStr, "%s", sysImgpath); std::string imgpath(cStr); SaveFileDialog^ saveFile= gcnew SaveFileDialog(); if (saveFile->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) { return; } System::String^ sysSaveimg = saveFile->FileName; char cStr_[50] = { }; if (sysSaveimg->Length < sizeof(cStr)) sprintf(cStr_, "%s", sysSaveimg); std::string savesvm(cStr_); if (TrainSVM(savesvm,imgpath)) { MessageBox::Show("Training completed."); } else MessageBox::Show("ERROR"); } private: System::Void btnProcess_Click(System::Object^ sender, System::EventArgs^ e) { textBox1->Text = ""; if (SVMPredict()) { } else MessageBox::Show("ERROR"); } private: vector list_folder(string path) Mô Phỏng Nhận Dạng Biển số xe Trang 20/25 { vector folders; DIR *dir = opendir(path.c_str()); struct dirent *entry; while ((entry = readdir(dir)) != NULL) { if ((strcmp(entry->d_name, ".") != 0) && (strcmp(entry->d_name, " ") != 0)) { string folder_path = path + "/" + string(entry->d_name); folders.push_back(folder_path); } } closedir(dir); return folders; } private: vector list_file(string folder_path) { vector files; DIR *dir = opendir(folder_path.c_str()); struct dirent *entry; while ((entry = readdir(dir)) != NULL) { if ((strcmp(entry->d_name, ".") != 0) && (strcmp(entry->d_name, " ") != 0)) { string file_path = folder_path + "/" + string(entry->d_name); files.push_back(file_path); } } closedir(dir); return files; } private: char character_recognition(Mat img_character) { Ptr svmNew = SVM::create(); svmNew = SVM::load("svm.txt"); char c = '*'; vector feature = calculate_feature(img_character); Mat m = Mat(1, number_of_feature, CV_32FC1); for (size_t i = 0; i < feature.size(); ++i) { float temp = feature[i]; m.at(0, i) = temp; } int ri = int(svmNew->predict(m)); if (ri >= && ri = 10 && ri < 18) c = (char)(ri + 55); if (ri >= 18 && ri < 22) c = (char)(ri + 55 + 2); if (ri == 22) c = 'P'; if (ri == 23) c = 'S'; Mô Phỏng Nhận Dạng Biển số xe Trang 21/25 if (ri >= 24 && ri < 27) c = (char)(ri + 60); if (ri >= 27 && ri < 30) c = (char)(ri + 61); return c; } private: bool TrainSVM(string savepath, string trainImgpath) { const int number_of_class = 30; const int number_of_sample = 10; const int number_of_feature = 32; Ptr svm = SVM::create(); svm->setType(SVM::C_SVC); svm->setKernel(SVM::RBF); svm->setGamma(0.5); svm->setC(16); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); vector folders = list_folder(trainImgpath); if (folders.size() 4.5 || (double)r.width / r.height < 3.5) continue; Mat sub_binary = or_binary(r); Mat _plate = sub_binary.clone(); vector sub_contours; vector sub_hierarchy; findContours(sub_binary, sub_contours, sub_hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0)); if (sub_contours.size() < 8) continue; int count = 0; vector c; Mat sub_image = image(r); vector r_characters; for (size_t j = 0; j < sub_contours.size(); ++j) { Rect sub_r = boundingRect(sub_contours.at(j)); if (sub_r.height > r.height / && sub_r.width < r.width / && sub_r.width > && r.width > 15 && sub_r.x > 5) { Mat cj = _plate(sub_r); double ratio = (double)count_pixel(cj) / (cj.cols*cj.rows); if (ratio > 0.2 && ratio < 0.7) { Mô Phỏng Nhận Dạng Biển số xe Trang 23/25 r_characters.push_back(sub_r); rectangle(sub_image, sub_r, Scalar(0, 0, 255), 2, 8, 0); } } } if (r_characters.size() >= 7) { for (int i = 0; i < r_characters.size() - 1; ++i) { for (int j = i + 1; j < r_characters.size(); ++j) { Rect temp; if (r_characters.at(j).x < r_characters.at(i).x) { temp = r_characters.at(j); r_characters.at(j) = r_characters.at(i); r_characters.at(i) = temp; } } } for (int i = 0; i < r_characters.size(); ++i) { Mat cj = _plate(r_characters.at(i)); c.push_back(cj); } characters.push_back(c); sub_binary = or_binary(r); plates.push_back(_plate); draw_character.push_back(sub_image); } rectangle(image, r, Scalar(0, 255, 0), 2, 8, 0); } Mat plateImg, chaImg; convertScaleAbs(plates[0], plateImg); convertScaleAbs(draw_character[0], chaImg); resize(plateImg, plateImg, cv::Size(200, 50)); resize(chaImg, chaImg, cv::Size(200, 50)); ptbPlate->Image = mat2bmp.Mat2Bimap(plateImg); ptbCha->Image = mat2bmp.Mat2Bimap(chaImg); ptbPlate->Refresh(); ptbCha->Refresh(); for (size_t i = 0; i < characters.size(); i++) { string result; for (size_t j = 0; j < characters.at(i).size(); ++j) { char cs = character_recognition(characters.at(i).at(j)); result.push_back(cs); } } text_recognition.push_back(result); System::String^ str = gcnew System::String(result.c_str()); textBox1->Text += str; Mô Phỏng Nhận Dạng Biển số xe Trang 24/25 return true; } private: System::Void } private: System::Void } private: System::Void } private: System::Void } private: System::Void } }; } ptbSrc_Click(System::Object^ sender, System::EventArgs^ e) { ptbPlate_Click(System::Object^ sender, System::EventArgs^ e) { groupBox1_Enter(System::Object^ sender, System::EventArgs^ e) { groupBox2_Enter(System::Object^ sender, System::EventArgs^ e) { ptbCha_Click(System::Object^ sender, System::EventArgs^ e) { Mô Phỏng Nhận Dạng Biển số xe ... Phỏng Nhận Dạng Biển số xe Trang 11/25 CHƯƠNG NHẬN XÉT 4.1 Nhận xét Bài toán nhận dạng biển số xe nhiểu khuyết điểm khơng thể nhận dạng số biển có độ sáng mờ biển số có góc nghiêng Mơ Phỏng Nhận Dạng. .. ký tự biển số xe từ đến 10 ký tự nước ta có số ký tự biền số xe nằm khoảng đến ký tự Vậy ta dùng ngưỡng [6.9] để nhận dạng vùng biển số xe 3.2 Sơ đồ giải thuật Mô Phỏng Nhận Dạng Biển số xe Trang... tế khác nhận dạng giọng nói ứng dụng Jibbigo điện thoại di động Hình 1-1: Nhận dạng vân tay máy ATM Mô Phỏng Nhận Dạng Biển số xe Trang 2/25 CHƯƠNG BÀI TỐN NHẬN DẠNG 2.1 Tìm hiểu ảnh số 2.1.1