2.6.1 Giới Thiệu Về Thư Viện Mã Nguồn Mở OpenCV
OpenCV (Open Source Computer Vision) là một thư viện mã nguồn mở về thị giác máy tính 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 tính. 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), 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 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, đượ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 tính và nhận dạng, tuy nhiên phiê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ác 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ởi 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.
Hình 2.18 tổ chức thư viện OpenCV (nguồn: Intel)
Trước OpenCv không có một công cụ chuẩn nào cho lĩnh vực xử lý ảnh. Các đoạn code đơn lẻ do các nhà nghiên cứu tự viết thường không thống nhất và không ổn định. Các bộ công cụ thương mại như Matlab, Simulink, Halcon, v.v… lại có giá cao chỉ thích hợp cho các công ty phát triển các ứng dụng lớn. Ngoài ra còn có các giải pháp kèm theo thiết bị phần cứng mà phần lớn là mã đóng và được thiết kế riêng cho từng thiết bị, rất khó khăn cho việc mở rộng ứng dụng.
OpenCV là công cụ hữu ích cho những người bước đầu làm quen với xử lý ảnh số vì các ưu điểm sau:
- OpenCV là công cụ chuyên dụng: Được Intel phát triển theo hướng tối ưu hóa cho các ứng dụng xử lý và phân tích ảnh, với cấu trúc dữ liệu hợp lý, thư viện tạo giao diện, truy xuất thiết bị phần cứng được tích hợp sẵn. OpenCV thích hợp để phát triển nhanh ứng dụng.
- OpenCV là công cụ mã nguồn mở: Không chỉ là công cụ miễn phí (với BSD license), việc được xây dựng trên mã nguồn mở giúp OpenCV trở thành công cụ thích hợp cho nghiên cứu và phát triển, với khả năng thay đổi và mở rộng các mô hình, thuật toán.
- OpenCV đã được sử dụng rộng rãi: Từ năm 1999 đến nay, OpenCV đã thu hút được một lượng lớn người dùng, trong đó có các công ty lớn như Microsoft, MIT, CMU, Cambridge…Nhiều forum hỗ trợ và cộng đồng người dùng đã được thành lập, tạo nên kênh thông tin rộng lớn hữu ích cho việc tham khảo tra cứu.
Hình 2.19 Nhận dạng khuôn mặt với Haar classifer trong OpenCV (nguồn: Intel)
Tổ chức thư viện OpenCV khá đơn giản (xem hình 2.18), bao gồm 4 module chính và 2 module mở rộng:
- CXCORE chứa các định nghĩa kiểu dữ liệu cơ sở. Ví dụ, các cấu trúc dữ liệu cho ảnh, điểm và hình chữ nhật được định nghĩa trong cxtypes.h. CXCORE cũng chứa đại số tuyến tính và phương pháp thống kê, chức năng duy trì và điều khiển chuỗi. Một số ít, các chức năng đồ họa để vẽ trên ảnh cũng được đặt ở đây.
- CV chứa các thuật toán về xử lý ảnh và định kích cỡ camera. Các chức năng hình họa máy tính cũng được đặt ở đây.
- CVAUX được mô tả trong tài liệu của OpenCV như chứa các mã cũ và thứ nghiệm. Tuy nhiên, các giao diện đơn cho sự nhận diện ảnh ở trong module này. Code sau này chúng được chuyên dụng cho nhận diện mặt và chúng được ứng dụng rộng rãi cho mục đích đó.
- HIGHGUI và CVCAM được đặt trong cùng thư mục là “otherlibs”.
HIGHGUI chứa các giao diện vào ra cơ bản, nó cũng chứa các khả năng cửa sổ mở rộng và vào ra video.
CVCAM chứa các giao diện cho video truy cập qua DirectX trên nền Windows 32 bits.
Kèm theo thư viện là tài liệu hướng dẫn và các ví dụ mẫu thể hiện một phần các chức năng của công cụ OpenCV.
Các chức năng của OpenCV tập trung vào thu thập ảnh, xử lí ảnh và các thuật toán phân tích dữ liệu ảnh, bao gồm:
- Truy xuất ảnh và phim: đọc ảnh số từ camera, từ file, ghi ảnh và phim.
- Cấu trúc dữ liệu ảnh số và các dữ liệu hỗ trợ cần thiết: ma trận, vector, chuỗi, xâu và cây.
- Xử lí ảnh căn bản: các bộ lọc có sẵn, tìm chi tiết cạnh, góc, chỉnh đổi màu, phóng to thu nhỏ, và hiệu chỉnh histograms.
- Xử lí cấu trúc: tìm viền, nhận chuyển động, thay đổi trong không gian 3D, đối chiếu bản mẫu, xấp xỉ các đơn vị hình học cơ sở - mặt phẳng, đa giác, ellipse, đường thẳng…
- Phân tích dữ liệu ảnh: nhận dạng thực thể, theo dõi các chi tiết và phân tích chuyển động.
- Tạo giao diện đơn giản: hiển thị ảnh, thao tác bàn phím, chuột, thanh trượt để chỉnh thông số (nếu cần thiết các bạn có thể tạo them các phím điều khiển thông qua thao tác chuột, hoặc tích hợp them các thư viện về giao diện như wxWidgets).
2.6.2 Phiên Bản OpenCV 1 và OpenCV 2
Cho tới nay, đã 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). 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ư viện 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, 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ú ý điề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 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à 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.
- 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 giữ 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.
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 đề tài, phiên bản OpenCV được sử dụng là phiên bản OpenCV 2.4.10.
2.6.3 FLANN (Fast Library For Approximate Nearest Neighbors) Hỗ Trợ cho Việc Tìm Kiếm Nhanh Các Điểm Lân Cận Trong Không Gian 3D. cho Việc Tìm Kiếm Nhanh Các Điểm Lân Cận Trong Không Gian 3D.
Để có thể thực hiện được việc tìm kiếm một cách nhanh chóng và chính xác, như đã giới thiệu ở trên tôi sử dụng SURF keypoint và descriptor. Với mỗi bức ảnh, chương trình sẽ phát hiện ra một số lượng keypoint nhất định (để đạt được hiệu quả về thời gian và độ chính xác, chương trình sử dụng từ 100-160 keypoint cho mỗi bức ảnh), và các descriptor được tính toán. Keypoint và descriptor của 2 bức ảnh sẽ được so sánh với nhau sử dụng thuật toán Flann (Fast Library for Approximate Nearest Neighbors). Khi các keypoint đã được match với nhau, chương trình lọc ra các cặp có độ giống nhau cao và tính toán ra một kết quả về độ giống nhau giữa hai bức ảnh. Kết quả này sau đó được dùng để xếp hạng các ảnh trong cơ sở dữ liệu, thông tin các ảnh gần giống ảnh người dùng đang tìm nhất sẽ được trả về.
Việc so sánh một ảnh với toàn bộ cơ sở dữ liệu chỉ thực tế khi mà cơ sở dữ liệu là nhỏ, khi cơ sở dữ liệu lớn lên, chúng ta cần có một thuật toán tốt hơn để loại bỏ sớm các ảnh khác xa so với ảnh cần tìm. Để làm được điều này chúng tôi đề xuất một thuật toán phân cụm dữ liệu dựa trên chính những keypoint và descriptor của các ảnh. Các ảnh gần giống nhau sẽ được tập hợp vào các cụm riêng biệt. Khi cần truy vấn một ảnh, ta so sánh ảnh đó với keypoint và descriptor đặc trưng của mỗi cụm rồi chọn ra một số cụm triển vọng nhất. Sau đó ta sử dụng thuật toán ở trên cho mỗi cụm, kết quả cuối cùng được tập hợp từ các cụm và trả về cho người dùng.
CHƯƠNG 3: ỨNG DỤNG THỰC NGHIỆM – ĐÁNH GIÁ KẾT QUẢ
3.1: NÊU LẠI BÀI TOÁN:
Mục tiêu của đề tài “Hệ Thống quản lý bãi xe ô tô dựa vào video giám sát” nhằm xây dựng một hệ thống (chương trình ứng dụng) có khả năng truy vấn tìm kiếm đối tượng, đối tượng cụ thể được áp dụng là xe ôtô. Hệ thống cung cấp các chức năng tìm kiếm một xe theo hình mẫu cung cấp vào/ra bãi vào thời điểm nào, vị trí xe hiện ở đâu trong bãi, đếm số lượng keyframe chứa xe ôtô cần tìm trong video giám sát.
Để thực hiện mục tiêu trên các đối tượng cần nghiên cứu là:
- Tìm hiểu kỹ thuật xử lý video: tách shot, tách frame chính từ một shot. - Tìm hiểu các công cụ computer vision trong thư viện OpenCV.
- Phân tích thuật toán: giải thuật SIFT (Scale-invariant feature transform), SURF (Speed Up Robust Feature) trích xuất tập đặc trưng (keypoints) từ ảnh.
- Tìm hiểu các thuật toán nhận dạng và so khớp tìm kiếm đối tượng. - Xây dựng cơ sở dữ liệu video đối tượng là xe ôtô.
- Xây dựng chương trình nhận dạng xe trên cơ sở dữ liệu video.
Hiện nay nhu cầu về hệ thống giám sát qua camera được ứng dụng rộng rãi trong quản lý như quản lý tòa nhà, quản lý siêu thị, quản lý bãi xe, quản lý trung tâm thương mại…
Các hệ thông camera hiện tại chỉ đáp ứng được như cầu lưu trữ file video, đòi hỏi dung lượng lưu trữ file lớn, và nếu có nhu cầu tìm kiếm đối tượng thì người xem phải trực tiếp xem lại đoạn video đã giám sát trước đó. Tiêu tồn khá nhiều thời gian công sức và chưa đáp ứng được nhu cầu hiệu quả cao.
Để giải quyết hạn chế đó nội dung nghiên cứu được đặt ra là khả năng truy vấn tìm kiếm một đối tượng bằng một hình ảnh được cung cấp sẵn so với video đã được lưu trữ. Đáp ứng được tính chính xác trong tìm kiếm và mang lại kết quả nhanh chóng.
3.2: PHÂN TÍCH VÀ THIẾT KẾ:3.2.1 Kiến Trúc Hệ Thống 3.2.1 Kiến Trúc Hệ Thống
Kiến trúc hệ thống gồm hai phần : + Chỉ mục video + Tìm kiếm đối tượng
Hình 3.1 Kiến trúc hệ thống
Hệ thống xử lý gồm hai quy trình
+ Quản lý (Admin) : thao tác xử lý video, cung cấp video cần xử lý, Tách keyframe từ video.
+ Người sử dụng: Cung cấp hình ảnh xe ôtô cần tìm kiếm Chương trình tiến hành so khớp hình ảnh với keyframe
Tách Frame Tách Shot Xác định KeyFrame So Trùng Xử Lý Hình ảnh đối CSDL Video Chỉ mục Video
Tìm kiếm đối tượng Vide
+ Tìm Thấy đối tương : Chương trình hiển thị Keyframe chứa đối tượng đang tìm, thông tin (vị trí, thời gian, số lượng) đối tượng.
+ không tìm thấy: thông báo đối tượng không tồn tại trong bãi. Kết thúc chương trình.
3.2.2 Tách KeyFrame Từ Video
Hình 3.2 Sơ đồ tuần tự tách keyframe từ video
Sơ đồ tuần tự mô tả quá trình tách keyframe từ video
Quản lý (Admin): thao tác xử lý video, cung cấp video cần xử lý, Tách keyframe từ video.
Admin cung cấp video, sau đó tiến hành tách shots video. Cuối cùng video được tách ra thành từng keyframe đối tượng.
3.2.3 So Trùng Ảnh Với KeyFrame
Hình 3.3 Sơ đồ tuần tự so trùng ảnh với keyframe
Sơ đồ tuần tự so trùng ảnh với keyframe mô tả quy trình xử lý tuần tự quá trình so trùng ảnh với keyframe
+ Quản lý (Admin): thao tác xử lý video, tách shots video, tách keyframe từ video + Người sử dụng: cung cấp hình ảnh đối tượng
3.2.4 Cơ Sở Dữ Liệu
Hình 3.4 Cơ sở dữ liệu
Cơ sở dữ liệu hệ thống gồm 3 table 1) Tầng : gồm Mã Tầng, Tên Tầng
2) Video: gồm Mã Video, Tên Video, Thời Gian, Link Key Frame 3) KeyFrame: gồm Mã Keyframe, Link Key Frame, Descriptors
Hệ thống bãi xe của trung tâm thương mại có nhiều tầng gồm tầng trệt, tầng hầm B1, tầng hầm B2. Mỗi tầng được lắp nhiều camera giám sát đặt ở nhiều vị trí khác nhau, mỗi camera lưu trữ nhiều video giám sát tại nhiều thơi điểm khác nhau trong ngày.
Database sqlite lưu trữ dữ liệu
Hình 3.5: SQLite lưu trữ các video của camera
3.2.5 Giao Diện Chương Trình
Chương trình Hệ Thống Quản Lý Bãi Xe Ô TÔ Dựa Vào Video Giám Sát được chạy ứng dụng trên máy tính Lenovo 2.00GHz bộ xử lý Core(TM)2 Duo và 4GB bộ nhớ chính, máy chạy hệ điều hành Windows 7 Professional.
Ngôn ngữ lập trình C++ trong bộ Microsoft Visual Studio 2013, hệ quản trị SQLite
Hình 3.7: Giao diện chính của chương trình KeyFrame
chính xác nhất của đối
ầ
Thông tin của đối tượng đang tìm Số KeyFrame chứa đối tượng đang Chọn Video cần Vị trí d Thời gian id Truy vấn hình ảnh đối tượng
Quy Trình Xử Lý Video
Các Video quay bằng camera quản lý xe trong bãi xe sẽ được xử lý tách lấy các keyframe, chương trình ứng dụng cho thao tác chọn video cần tách keyframe, chọn vị trí của camera và thời gian lưu trữ tương ứng.
Choose video scene: Chọn Video cần tách keyframe Position: Vị trị camera tương ứng
Date time: thời gian lưu trữ.
Kết quả keyframe của video đã được tách và lưu trữ vào database chương trình.
Hình 3.8: Kết quả xử lý video tách keyframe
Truy Vấn Tìm Kiếm Đối Tượng Cần tìm Với Đối Tượng Tồn Tại Trong Video
Người xử dụng cung cấp hình ảnh của đối tượng cần tìm, chương trình truy vấn so khớp tìm kiếm đối tượng đó trong video đã lưu trữ. Đồng thời cung cấp thông tin
tương ứng, đối tượng có tồn tại trong video hay không, nằm trong đoạn video nào, thời gian, địa điểm.
Choose image scene: truy vấn tìm kiếm hình ảnh cần tìm. Button Recognize: Thực hiện tìm kiếm.
Hình 3.9: Giá trị keypoints, khoảng cách giới hạn các keypoints
3.3: Đánh Giá:
Nguồn dữ liệu:
Bộ dữ liệu video quản lý bãi xe ôtô từ nguồn giả lập thử nghiệm trên 3 Video: