4. 1 Kết quả hướng giải quyết “phân ngưỡng và tìm đối tượng”
4.2.2 Hướng phát triển của bài toán
- Nâng cao hiệu quả chương trình, tách ly các kí tự trong biển số trong các trường hợp biển số bị nhiều nhiễu, mất mát thông tin do nhiễu từ điều kiện môi trường, tìm vùng biển số trong ảnh có độ tương phản giữa biển số và nền thấp. Đặc biệt là biển xe có nền màu đỏ chữ trắng.
- Phát triển chương trình thành module phần cứng. Có khả năng tương thích với các thiết bị quan sát như camerạ
Đồ Án Tốt Nghiệp 83 Khoa Công Nghệ Thông Tin
- Kết hợp chương trình với những chương trình nhận dạng khác để hỗ trợ tốt hơn cho việc quản lý phương tiện giao thông. Ví dụ: kết hợp với chương trình nhận dạng chữ viết để đưa biển số về dạng ký tự trên máy tính giúp công việc quản lý bến bãi…
- Nghiên cứu theo hướng một ứng dụng cụ thể như : giám sát phương tiện giao thông, xử lý vi phạm giao thông, quản lý xe tại các bãi giữ xe, các kho vật tư….
Đồ Án Tốt Nghiệp 84 Khoa Công Nghệ Thông Tin
KẾT LUẬN.
Sự phát triển của công nghệ thông tin đã có những tác động tích cực đến nhiều mặt của đời sống xã hội trong đó phải kể tới lĩnh vực giám sát tự động. Trong giám sát tự động, việc giám sát đối với các phương tiện giao thông là một vần đề nổi trộị Nhiều chính phủ, thành phố trên thế giớ đã xây dựng hệ thống giám sát tự động đối với các phương tiện giao thông của mình. Và hệ thống giám sát đều lấy biển số xe là mục tiêu giám sát.
Ở nước ta, các hệ thống giám sát tự động nói cung và hệ thống nhận dạng biển số xe nói riêng cũng đang được chú trọng tuy nhiên nó vẫn còn là lĩnh vực cần nhiều công sức đầu tư để cải thiện phương pháp cũng như tỷ lệ tìm biển thành công.
Đa phần các công tác quản lý, xử lý đối với các phương tiện giao thông đều cần nhân lực con ngườị Báo cáo nhằm mục đích tìm hiểu bài toán nhận dạng “Biển số xe” với mục đích để quản lý, giám sát các phương tiện giao thông.
Với mục đích phát hiện vùng biển số do thời gian có hạn nên em chưa cài đặt nhận dạng ký tự quang học trong ứng dụng của mình. Em chắc rằng trong tương lai không xa, thì hệ thống nhận dạng biển số xe nói riêng và nhận dạng nói chung sẽ được sử dụng rộng rãi với độ chính xác cao phục vụ cho nhiều lĩnh vực cuộc sống để giám sát, quản lý công việc thay cho con ngườị
Đồ Án Tốt Nghiệp 85 Khoa Công Nghệ Thông Tin
TÀI LIỆU THAM KHẢO
Tiếng việt.
[1] Nhận môn xử lý ảnh số. Ths. Lương Mạnh Bá, Pts. Nguyễn Thanh Thủỵ NXB KHKT 2003.
[2] Đồ án tốt nghiệp của chị Phạm Thị Thanh Thủy trường Đại học Dân Lập Hải Phòng năm 2009
Tiếng anh.
[3] learing OpenCV_ computer vission whit the OpenCV Library_ Gary Breadki & Kaebler
[4]http://docs.opencv.org
[5]http://codẹgurusvn.com
Đồ Án Tốt Nghiệp 86 Khoa Công Nghệ Thông Tin
Phụ lục. Hướng dẫn cài đặt và cấu hình OpenCV.
OpenCV (Open Source Computer Vision) là một thư viện chức năng lập trình cho ngành thị giác máy tính. OpenCV được phát hành theo BSD license và nó là miễn phí cho cả hai học thuật và thương mạị OpenCV được dùng với các ngôn ngữ C++, C, Python và JavăAndroid) và hỗ trợ các hệ điều hành Windows, Liniux, Android và Mac OS. Trong thư viện OpenCV có hơn 2500 các thuật toán tối ưụ
Việc cấu hình OpenCV với Microsoft Visual Studio 2010 tương đối khó khăn cho người mới sử dụng.
Sau đây em xin hướng dẫn cài đặt và cấu hình OpenCV phiên bản 2.4 với Microsoft Visual Studio 2010 bản 32 bit.
Ị Hướng dẫn cài đặt OpenCV 1. Tải về và cài đặt.
Tải về OpenCV 2.4 tại trang chủ http://opencv.org
Cài đặt thực chất là giải nén. Bạn nên giải nén ở thu mục đơn giản ví dụ : trong hướng dẫn này tối giải nén thành D:\opencv
2. Tải vẻ và cài đặt Cmake
Tải về Cmake tại trang chủ http://www.cmakẹorg và tiến hành cài đặt bình
thường.
3. Chạy cmake_guị Trong mục “where is the source code” chọn thư mục
(D:\opencv). Trong mục “where to build the binarines” chọn D:\opencv\builds ( tự
Đồ Án Tốt Nghiệp 87 Khoa Công Nghệ Thông Tin
IỊ
4. Mở OpeCV.sln lên bằng Visual Studio 2010 để tiến hành thiết lập.
Chọn “Debug” trong Solution configuration. Và tiến hành biên dịch.
5.
Tương tự cho thiết lập “Release”
Thêm vào đường dẫn vào environment variavles:
D:\opencv\builds\bin\Release D:\opencv\builds\bin\Debug
1.
Control Panel System Advanced System Settings Environment variables và thêm 2 thực mục đó vào biến "path".
Hướng dẫn cấu hình OpCV với Microsoft Visual Studio 2010.
Tạo một dự án “ win 32 console applicationg” bằng Microsoft Visual Studio
2.
2010.
Trong Solution Explprer, chọn chuột phải vào project chọn properties.
ạ
-
Chọn VC++ Directories.
Trong mục Include Diretories thêm hai thư mục:
-
D:\opencv\build\include
D:\opencv\build\include\opencv
Trong mục Library Directories, thêm hai mục sau:
D:\opencv\builds\lib\Debug D:\opencv\builds\lib\Release
b. Chọn Linkerinput.
Trong Ađitional Dependencies bạn chép toàn bộ danh sách file .lib trong thư mục
D:\opencv\builds\lib\Debug D:\opencv\builds\lib\Release
Cách tiến hành cấu hình trên đã được em hướng dẫn bằng videọ
Đồ Án Tốt Nghiệp 88 Khoa Công Nghệ Thông Tin
Một số hàm quan trọng.
1. Biến đổi ảnh xám và lọc ảnh song phương: Code: void gray_filter() { Mat src_gray; cvtColor(src,src_gray,CV_BGR2GRAY); bilateralFilter(src_gray,src_gray_filter,10,20,5); }
2. Hàm phân ngưỡng hoặc tìm biên cannỵ Code: void threshold_canny() { Canny(src_gray_filter,dst_canny,120,360,3); threshold(src_gray_filter,dst_threshold,100,200,THRESH_BINARY); } 3. Tìm vùng biển số. Code : void vungBienSo() {
vector<int> int_vung;
vector<vector<Point> > contours; vector<Vec4i> hierarchy;
/// Find contours
findContours( dst_threshold, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
vector<vector<Point> > contours_poly( contours.size() ); vector<Rect> boundRect;
for( size_t i = 0; i < contours.size(); i++ ) {
approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true ); boundRect.push_back(boundingRect( Mat(contours_poly[i]) )); }
for ( size_t i = 0; i < boundRect.size(); i++) {
double x = boundRect[i].width*1.0; double y = boundRect[i].height*1.0; double a = x/y;
if( a>=3.5 && a<=4.5)
Đồ Án Tốt Nghiệp 89 Khoa Công Nghệ Thông Tin
else if(a>=0.8 && a<=1.4)
int_vung.push_back(i); }
// ---lay vung bien--- IplImage* src1 = new IplImage(src);
IplImage* cropped_img = cvCreateImage( cvGetSize(src1),src1->depth,src1- >nChannels);
for( size_t i = 0; i < int_vung.size();i++) {
int area = boundRect[int_vung[i]].width*boundRect[int_vung[i]].height; if (area >= 1500 && area <= 30000){
cvSetImageROI(src1,cvRect(boundRect[int_vung[i]].x,boundRect[int_vung[i]].y,bou ndRect[int_vung[i]].width,boundRect[int_vung[i]].height));
IplImage *tam = cvCreateImage(cvGetSize(src1),src1->depth,src1- >nChannels); } } cvCopy(src1,tam,NULL); vung_bien.push_back(tam); cvResetImageROI(src1);
drawImageInside(tam, cropped_img ,i+1 ,0);
Mat drawing = Mat::zeros( dst_threshold.size(), CV_8UC3 ); for( size_t i = 0; i< int_vung.size(); i++ )
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours( drawing, contours_poly, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point() );
rectangle( drawing, boundRect[int_vung[i]].tl(), boundRect[int_vung[i]].br(), color, 2, 8, 0 ); } } 4. Cách ly vùng ký tự. Code: void crop_so() {
for(size_t i = 0; i< vung_bien.size(); i++) {
>nChannels);
IplImage* src1 = new IplImage(vung_bien[i]); IplImage* a = new IplImage(src);
Mat src_gray; cvtColor(vung_bien[i],src_gray,CV_BGR2GRAY); bilateralFilter(src_gray,src_gray_filter,10,20,5);
threshold(src_gray_filter,dst_threshold,153,200,THRESH_BINARY); IplImage* cropped_img = cvCreateImage( cvGetSize(a),a->depth,a- vector<int> int_vung;
vector<vector<Point> > contours; vector<Vec4i> hierarchy;
Đồ Án Tốt Nghiệp 90 Khoa Công Nghệ Thông Tin
CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
vector<vector<Point> > contours_poly( contours.size() ); vector<Rect> boundRect;
for( size_t i = 0; i < contours.size(); i++ ) {
); ));
approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true boundRect.push_back(boundingRect( Mat(contours_poly[i]) }
for (size_t i =0 ; i< boundRect.size();i++) {
if(boundRect[i].areă) >=100 && boundRect[i].areă) <1000 ) { cvSetImageROI(src1,cvRect(boundRect[i].x,boundRect[i].y,boundRect[i].width,boun dRect[i].height)); IplImage *tam = cvCreateImage(cvGetSize(src1),src1->depth,src1->nChannels); cvCopy(src1,tam,NULL); ky_tụpush_back(tam); cvNamedWindow("aaa"); cvShowImage("aaa",tam); cvWaitKey(0);
cvResetImageROI(src1);
drawImageInside(tam, cropped_img ,i*15 ,0); }
}
cvShowImage("cac ky tu",cropped_img ); cvWaitKey(0);
if(ky_tụsize() >=6 && ky_tụsize() <=9) i=vung_bien.size(); else } ky_tụempty(); 5. Hàm drawImageIndide Code:
void drawImageInside(IplImage* source, IplImage* target, int x, int y) { for (int ix=0; ix<source->width; ix++) {
for (int iy=0; iy<source->height; iy++) { int r = cvGet2D(source, iy, ix).val[2]; int g = cvGet2D(source, iy, ix).val[1]; int b = cvGet2D(source, iy, ix).val[0]; CvScalar bgr = cvScalar(b, g, r); cvSet2D(target, iy+y, ix+x, bgr); }
} }