1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Xử lý ảnh với OpenCV

103 3,1K 13
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Định dạng
Số trang 103
Dung lượng 5,58 MB

Nội dung

ung dung xu ly anh trong thuc te voi thu vien OpenCV

Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 1 Ứng dụng xử ảnh trong thực thế với thư viện OpenCV C/C++ Nguyễn Văn Long long.06clc@gmail.com Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 2 Mở đầu Xử ả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 vân tay chấm công ở các công sở … môn học xử ảnh ở các trường đại học được xem là môn học bắt buộc ở một số ngành như công nghệ thông tin, điện tử viễn thông …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. Xuất phát từ thực tế rằng môn học xử ảnh ở các trường đại học là một môn học mang nặng tính học thuật, khô khan, các vấn đề được mô tả dưới dạng toán học, sinh viên nắm bắt môn học một cách chung chung mà không đi vào bản chất vấn đề, ứng dụng thực tiễn của môn học, thêm vào đó số lượng tài liệu về chuyên ngành này bằng tiếng Việt là không nhiều, bằng quá trình nghiên cứu nghiêm túc, kinh nghiệm thực tế tác giả đ ã c ố gắng cho ra đời cuốn sách Ứng dụng xử ảnh trong thưc tế với thư viện OpenCV. Cuốn đề cập tới một số phần của l ĩnh v ực xử ảnh và thị giác máy, thông qua sự diễn giải trực quan, không xa vào những công thức toán học trừu tượng, phức tạp nhưng vẫn làm nổi bật nên được vấn đề, giúp người đọc có được cái nhìn tổng quát, hiểu được khái niệm và hơn nữa biết được những vấn đề đó ứng dụng vào thực tế như thế nào. Các chủ đề trong cuôn sách này đều đi kèm với một chương tr ình mô ph ỏng được viết bằng ngôn ngữ C++ với sự giúp đỡ của thư viện OpenCV, một thư viện mã nguông mở được đánh giá là mạnh mẽ về tốc độ xử đáp ứng được các ứng dụng trong thời gian thực. Cuốn sách được chia thành bốn phần, phần đầu giới thiệu về thư viện OpenCV, phần thứ hai nói về một số vấn đề chọn lọc thường gặp trong xử ảnh như không gian màu, các bộ lọc, cách phát hiện đường thẳng đường tròn trong ảnh …, phần thứ ba nói về một số thủ thuật để lập trình với thư viện MFC và phần cuối cùng nói về một số ứng dụng thực tế như bài toán nhận dạng biển số xe … Cuốn sách không chỉ là tài liệu tham khảo bổ ích trong quá trình học tập của các bạn sinh viên, quá trình làm luận văn, đồ án … mà còn là công cụ tốt hỗ trợ cho việc triển khai các ứng dụng thương mại của các k ĩ sư, doanh nghi ệp và những người quan tâm tới l ĩnh v ực. Cuối cùng dù đã dành nhiều tâm huyết để hoàn thành cuốn sách nhưng chắc chắn cuốn sách vẫn còn nhiều sai xót, tác giả mong được sự góp ý của bạn đọc. Xin gửi lời chúc tốt tốt đẹp và lời cảm ơn sâu sắc tới độc giả Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 3 Hướng dẫn sử dụng sách Cuốn sách được viết dựa trên những nghiên cứu và quá trình làm việc thực tế của tác giả, với mỗi vấn đề nêu trong sách bạn đọc có thể đọc qua để nắm bắt được ý t ư ởng chính, sau đó có thể tìm thêm tài liệu để nâng cao hơn vấn đề và có thể thực hành dựa vào mẫu chương tr ình, source code đi kèm. Thư viện OpenCV được viết trong sách là bản OpenCV 2.4.3, đối với các bản OpenCV khác thì bạn đọc có thể tùy chỉnh lại một chút tuy nhiên về bản chất của vấn đề là tương đối giống nhau. Ngôn ngữ lập trình cho các ví dụ là C/C++, IDE sử dụng là Visual Studio 2010. Tuy nhiên đa số chương trình trong cuốn sách này đều được tách biệt phần xử chính ra vào một file *.cpp nào đó nên ta có thể lấy nó để áp dụng vào các trình dịch khác. Có 10 chủ đề chính bao quát một số khía cạnh của l ĩnh vực xử ảnh được viết khá chi tiết và giải thích đầy đủ, 3 project được tác giả mô tả chung chung hơn. Do đó bạn đọc nếu chưa thực sự quen với thư viện OpenCV nên đọc theo thứ tự từ đầu tới cuối Trong cuốn sách có nhiều vấn đề liên quan tới k ĩ thu ật lập trình nh ưng do ph ạm vi giới hạn, tác giả chỉ có thể nói qua được một số khía cạnh, trên thực tế có nhiều cách khác nhau để giải quyết cùng một công việc, với những vấn đề lập trình bạn đọc chưa r õ có th ể tham khảo thêm tài ở các nguồn khác nhau hoặc giải quyết theo hướng mà bạn đọc cảm thấy là thỏa đáng nhất Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 4 Mục Lục Chương I. Làm quen với thư viện OpenCV 1. Giới thiệu về thư viện OpenCV 5 2. Phiên bản OpenCV 1 hay OpenCV 2 5 3. Hướng dẫn sử dụng OpenCV trên Window 6 Chương II. Các phép xử đ ơn gi ản trong OpenCV 1. Chương tr ình đ ầu tiên 12 2. Không gian màu, chuyển đổi không gian màu 13 3. Điều chỉnh độ sang, độ tương phản 17 4. Ảnh nhị phân, nhị phân hóa với ngưỡng động 19 5. Histogram, cân bằng histogram 23 6. Phóng to, thu nhỏ, xoay ảnh 27 7. Lọc số trong ảnh 30 8. Các phép toán hình thái học trong ảnh 37 9. Tìm biên ảnh với bộ lọc Canny 43 10.Chuyển đổi Hough, Phát hiện đường thẳng, đường tròn trong ảnh 46 Chương III. Lập trình xử ảnh với giao diện MFC 1. Giới thiệu về MFC 51 2. Khởi tạo project MFC 51 3. Làm việc với các điều khiển (Control) 54 4. Chuyển đổi các kiểu dữ liệu trong MFC 59 5. Chương tr ình t ải ảnh và hiển thị ảnh lên giao diện MFC 61 Chương IV. Một số ứng dụng trong thực tế 1. My Photo Editor, phần mềm chỉnh sửa ảnh đơn giản 64 2. Nhận dạng biển số xe 73 3. MyCam, một số hiệu ứng ảnh trong video 90 Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 5 Chương I. Làm quen với thư viện OpenCV 1. Giới thiệu về thư viện OpenCV OpenCV (Open Source Computer Vision) là 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ử ả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 đó bạn 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 Open CV 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. 2. Phiên bản OpenCV 1 hay 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: 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 ta sẽ chỉ ra 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 bộ nhớ của các đối tượng, ngh ĩa là khi m ột đối tượng mới được tạo ra, 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 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. Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 6 - 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 ta hãy 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); Trong khi đó, OpenCV 2.x thực hiện như sau: // Phát hiện đường tròn trong ảnh OpenCV 1.x Mat src = imread(“image.jpg”); Mat gray; CvtColor(src, gray, CV_BGR2GRAY); Canny(gray, gray, 10, 30, 3); Vector<Vec3f> circles; HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 50, 100, 50); Ta thấy rằng đố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ử 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 ta 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 cuốn sách 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. 3. Hướng dẫn sử dụng thư viện OpenCV trên Window Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 7 Trước hết ta cần 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 cuốn sách này là bản 2.4.3 với lần update cuối cùng là vào ngày 25 tháng 12 năm 2012. Sau khi download về máy, tiến hành cài đặt bình th ư ờng, ta để 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 ta sẽ 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 CDT 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 ta 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 Chọn OK, sau đó nhấn Next, hộp thoại tiếp theo xuất hiện, ở hộp thoại này ta 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 Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 8 Project mới được tạo ra là project hoàn toàn trố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 ta 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. Bây giở trong file này 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 ta 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, ta tìm mục Include Directories và Library Directories. Ta sẽ chỉ đường dẫn hai thư mục này đến các phần tương ứng của thư viện OpenCV. 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ư ta sử dụng hệ điều hành 32bit hoặc C:\opencv\build\x64\vc10\lib cho hệ điều hành 64bit. Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 9 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 Additional Dependencies là opencv_core243d.lib, opencv_imgproc243d.lib, opencv_highgui243d.lib. Chú ý là các lib thêm vào sẽ tương ứng với các header ta khai báo trong chương tr ình, và tùy thuộc vào mục đích sử dụng mà ta có thể thêm vào các lib các nhau, giả sử ta cần sử dụng tới các hàm về video, khi đó ta thêm header #include <opencv2/video/video.hpp> thì trong phần Additional Dependencies ta phải khai báo thêm opencv_video243d.lib. Chữ d đứng cuối các file trên thể hiện ta đ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ế độ release. Tuy nhiên khi đang c òn h ọc tập và cần nhiều chỉnh sửa ta nên để ở chế độ debug. 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ác file *.dll. Cách đơn giản nhất là 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ương trì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, t a 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àm việc của OpenCV. #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace std; using namespace cv; void main() { . } Nguyễn Văn Long Ứng dụng xử ảnh trong thực tế với thư viện OpenCV Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 10 Với Eclipse CDT Khởi động Eclipse, Từ cửa sổ Eclipse chọn New -> C++ Project , hộp thoại C++ Project xuất hiện, trong hộp thoại ta chọn Project name là opencv, Project type là Hello World C++ Project (Có thể chọn là Empty Project), Toolchains là MinGW GCC, Chọn Finish và ta có một Project mới. Bây giờ tùy chỉnh cho project này hoạt động được với OpenCV. Trong cửa sổ của Eclipse chọn Project - >Properties, cửa sổ Properties hiện ra. Tron cửa sổ Properties chọn C/C++ Build->Settings. Trong tab Tool Settings. Ở phần GCC C++ Compiller chọn Include rồi dẫn đường dẫn tới mục Include của OpenCV là C:\opencv\build\include. Trong phần MinGW C++ Linker chọn Library và chọn các mục như sau: click vào dấu cộng ở Library search path (-L) và dẫn tới thư mục lib: C:\opencv\build\x86\mingw\lib đối với Windows 32 bit hoặc C:\opencv\build\x64\mingw\lib đối với Windows 64 bit. Tiếp đó click vào dấu "cộng" để thêm Library(-I) vào, các library cần thêm lần lượt là: opencv_core243, opencv_highgui243, opencv_imgproc243 . nói chung là tùy vào nhu cầu sử dụng có thể thêm một hoặc nhiều lib vào. . về thư viện OpenCV 5 2. Phiên bản OpenCV 1 hay OpenCV 2 5 3. Hướng dẫn sử dụng OpenCV trên Window 6 Chương II. Các phép xử lý đ ơn gi ản trong OpenCV 1.. 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

Ngày đăng: 18/09/2013, 22:04

TỪ KHÓA LIÊN QUAN

w