Giới thiệu về thị giác máy Computer Vision Thị giác máy là một lĩnh vực đã và đang phát triển mạnh mẽ trên thế giới hiện nay. Khái niệm về thị giác máy – Computer Vision có liên quan tới nhiều ngành học và có nhiều hướng nghiên cứu khác nhau. Kể từ những năm 70 của thế kỷ 20 khi mà khả năng tính toán của các máy tính trở nên mạnh mẽ , nó có thể giải quyết được những công việc cần tới tốc độ cao như xử lý các tập ảnh hay các đoạn video thì thị giác máy được nhắc đến , nghiên cứu và phát triển cho đến ngày nay. Thị giác máy là một lĩnh vực rất mới mẻ đối với các nhà nghiên cứu ở Việt nam, nó chỉ mới xuất hiện gần đây ở trong các tổ chức quân đội và một số viện nghiên cứu khác. Việc áp dụng thị giác máy vào các ứng dụng nghiên cứu khoa học được coi là một khởi đầu cho chặng đường phát triển của thị giác máy ở các trường đại học hiện nay. 1.1. Thế nào là thị giác máy Thị giác máy bao gồm lý thuyết và các kỹ huật liên quan nhằm mục đích tạo ra một hệ thống nhân tạo có thể nhận thông tin từ các hình ảnh thu được hoặc các tập dữ liệu đa chiều. Máy móc càng ngày càng thông minh, nó không chỉ thay con người làm những công việc nặng nhọc và nhàm chán mà nó còn có một số khả năng bắt chước động vật và con người. Một trong số những khả năng đó là nhận biết được thế giới qua “mắt” của nó. Bằng việc kết hợp với các mô hình khác nữa như máy học , mạng nơron … giúp cho chúng dần tiến tới một hệ thống nhân tạo có những quyết định linh hoạt và chính xác hơn. Lĩnh vực nghiên cứu của thị giác máy rất rộng, và đặc điểm chung là các bài toán về thị giác máy đều không có một đề bài chung và cách giải quyết duy nhất. Mỗi giải pháp giải quyết vấn đề được một kết quả nhất định cho những trường hợp cụ thể.
Trang 1TỔNG QUAN VỀ THỊ GIÁC MÁY TÍNH
1 Giới thiệu về thị giác máy - Computer Vision
Thị giác máy là một lĩnh vực đã và đang phát triển mạnh mẽ trên thế giới
hiện nay Khái niệm về thị giác máy – Computer Vision có liên quan tới nhiều
ngành học và có nhiều hướng nghiên cứu khác nhau Kể từ những năm 70 của thế
kỷ 20 khi mà khả năng tính toán của các máy tính trở nên mạnh mẽ , nó có thể giải
quyết được những công việc cần tới tốc độ cao như xử lý các tập ảnh hay các đoạn
video thì thị giác máy được nhắc đến , nghiên cứu và phát triển cho đến ngày nay
Thị giác máy là một lĩnh vực rất mới mẻ đối với các nhà nghiên cứu ở Việt
nam, nó chỉ mới xuất hiện gần đây ở trong các tổ chức quân đội và một số viện
nghiên cứu khác Việc áp dụng thị giác máy vào các ứng dụng nghiên cứu khoa
học được coi là một khởi đầu cho chặng đường phát triển của thị giác máy ở các
trường đại học hiện nay
1.1 Thế nào là thị giác máy
Thị giác máy bao gồm lý thuyết và các kỹ huật liên quan nhằm mục đích tạo
ra một hệ thống nhân tạo có thể nhận thông tin từ các hình ảnh thu được hoặc các
tập dữ liệu đa chiều
Máy móc càng ngày càng thông minh, nó không chỉ thay con người làm
những công việc nặng nhọc và nhàm chán mà nó còn có một số khả năng bắt
chước động vật và con người Một trong số những khả năng đó là nhận biết được
thế giới qua “mắt” của nó Bằng việc kết hợp với các mô hình khác nữa như máy
học , mạng nơron … giúp cho chúng dần tiến tới một hệ thống nhân tạo có những
quyết định linh hoạt và chính xác hơn
Lĩnh vực nghiên cứu của thị giác máy rất rộng, và đặc điểm chung là các bài
toán về thị giác máy đều không có một đề bài chung và cách giải quyết duy nhất
Mỗi giải pháp giải quyết vấn đề được một kết quả nhất định cho những trường hợp
cụ thể
Ta có thể thấy sự tương quan giữa thị giác máy với các lĩnh vực khác như
sau:
Trang 2Hình 1 Mối quan hệ giữa thị giác máy với các ngành liên quan
1.2 Các ứng dụng của thị giác máy
Một số ứng dụng của thị giác máy vào các lĩnh vực được kể đến ở đây là:
- Điều khiển tiến trình (ví dụ: trong các robot công nghiệp, hay các thiết bị,
xe tự hành…)
- Phát hiện sự thay đổi (ví dụ: các thiết bị giám sát…)
- Tổ chức thông tin (ví dụ: chỉ số kho dữ liệu các ảnh hoặc chuỗi ảnh liên
tục…)
- Mô hình hoá đối tượng (ví dụ: quá trình kiểm tra trong môi trường công
nghiệp, xử lý ảnh trong y học)
- Tương tác (đóng vai trò làm đầu vào cho thiết bị trong quá trình tương tác
giữa người và máy)
1.3 Các thư viện thị giác máy mã nguồn mở
Chúng ta có thể tận dụng những thành quả của cộng đồng mã nguồn mở để
áp dụng cho ứng dụng thị giác máy của mình Hiện nay trên thế giới có rất nhiều
thư viện mã nguồn mở cho chúng ta sử dụng, cụ thể là:
- Intel OpenCV ( http://sourceforge.net/projects/opencvlibrary )
- CMVision (http://www.cs.cmu.edu/~coral/minnow/platform.html)
- ImLib3D
Trang 3- Imalab
- v.v…
2 Thư viện OpenCV
Có rất nhiều thư viện thị giác máy mã nguồn mở như đã giới thiệu ở trên,
mỗi thư viện có một nét riêng của nó mà chúng ta có thể khai thác Ở đây tôi đặc
biệt nghiên cứa thư viện OpenCV của Intel vì tính phổ biến và những khả năng của
nó có thể phục vụ cho công việc của tôi
2.1 Tổng quan về thư viện OpenCV
OpenCV là một thư viện thị giác máy tính mã nguồn mở của Intel nó có thể
làm đơn giản hóa công việc lập trình thị giác máy tính của ban OpenCV bao gồm
nhiều khả năng tiên tiến – tìm, theo dõi, nhận dạng các bề mặt, lọc Kalman , là sự
đa dạng của một hệ thống trí tuệ nhân tạo Ngoài ra nó còn cung cấp các cơ sở
thuật toán thị giác máy tính thông qua các giao diện lập trình ứng dụng ở mức
thấp Nó được đóng gói và hoàn toàn miễn phí , người dùng có thể sẵn sàng sử
dụng cho những mục đích khác nhau của họ
Intel đưa ra phiên bản OpenCV đầu tiên vào năm 1999 Ban đầu , nó chỉ là
thư viện xử lý ảnh của Intel Về sau , tính lệ thuộc đó đã được loại bỏ và bây giờ
bạn có thể sử dụng OpenCV như một thư viện độc lập OpenCV là một thư viện đa
nền tảng, nó chấp nhận cả Window và Linux, hơn thế nữa gần đây là Mac OSX
2.2 Những khả năng của OpenCV
OpenCV có nhiều chức năng , sau đây là tóm tắt các chức năng của nó:
- Ảnh và vào ra video
Các giao diện này cho phép bạn đọc dữ liệu ảnh từ các tệp hoặc từ các video
sống Bạn cũng có thể tạo file ảnh và video
- Thị giác máy tính nói chung và các giải thuật xử lý ảnh (APIs mức thấp và
trung bình)
Sử dụng các giao diện này, bạn có thể thí nghiệm với nhiều thuật toán thị
giác nhân tạo chuẩn mà bạn không cần viết code về chúng Chúng bao gồm sự dò
tìm viền, đường thẳng và góc, điều chỉnh elip, lấy mẫu và những biến đổi khác
nhau (Furiê rời rạc, cosin rời rạc và các biến đổi khoảng cách), v.v…
- Những module thị giác máy ở mức cao
Trang 4OpenCV bao gồm vài khả năng ở mức cao Ngoài việc dò tìm, nhận dạng và
theo dõi khuôn mặt nó còn bao gồm cả luồng quang hoc (sử dụng sự di chuyển
động của camera để xác định cấu trúc 3D), định cỡ camera và hình khối
- Các giải thuật trí tuệ nhân tạo và dạy học máy
Các ứng dụng thị giác máy tính thường đòi hỏi các phương pháp dạy học
máy hoặc trí tuệ nhân tạo (AI) khác Một vài trong số chúng sẵn có trong gói dạy
học máy của OpenCV
- Lấy mẫu ảnh và các biến đổi khung nhìn
Nó thường có ích để xử lý một tập điểm như một khổi OpenCV bao gồm
giao diện cho những sự phân miền sao chép ảnh, xử lý ngẫu nhiên, hồi phục kích
thước yêu cầu, làm vênh, quay và sử dụng những hiệu ứng phối cảnh
- Các phương pháp tạo và phân tích ảnh nhị phân
Ảnh nhị phân thường xuyên được sử dụng trong các hệ thống quét để kiểm
tra khuyết điểm hình dạng hay đểm các bộ phận của vật
- Thao tác với ảnh 3D
Các chức năng này có ích cho phép ánh xạ và sự xác định vị trí – hay với
thiết bị vật thể hoặc với nhiều dạng phép chiế từ một camera đơn
- Các thuật toán xử lý ảnh, thị giác máy và hiển thị ảnh
OpenCV bao gồm cả toán học cũ, các thuật toán đại số tuyến tính, khoa học
thống kê và hình học tính toán
- Đồ họa
Các giao diện này cho phép bạn viết chữ và vẽ trên ảnh Thêm vào các hàm
khác nhau và khả năng sáng tạo, các hàm này có ích cho sự ghi nhãn và đánh dấu
Ví dụ, nếu bạn viết một chương trình dò tìm đối tượng , nó giúp ích cho các ảnh
nhãn về kích thước và vị trí của chúng
- Các phương pháp GUI
OpenCV bao gồm các giao diện cửa sổ của chính nó Trong khi đây là hạn
chế so sánh tới cái gì có thể được làm trên mỗi nền tảng, họ cung cấp API đơn,
nhiều nền tảng để hiển thị ảnh, chấp nhận người sử dụng nhập vào qua chuột hay
bàn phím và thực hiện điều khiển bằng thanh trượt
- Cấu trúc dữ liệu và thuật toán
Với những giao diện này bạn có thể lưu trữ, tìm kiểm , bảo lưu và thao tác
một cách hiệu nghiệm các danh sách lớn, đống ,đồ thị và cây
- Ổn định dữ liệu
Trang 5Các phương pháp này cung cấp các giao diện tiện lợi cho các kiểu lưu trữ
khác nhau của dữ liệu trên đĩa và khôi phục chúng sau
2.3 Cấu tạo của OpenCV
Chức năng của OpenCV được chứa trong các module khác nhau :
- 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
2.4 Bắt đầu viết ứng dụng sử dụng OpenCV
Để tạo những ứng dụng cho mục đích của chúng ta, tôi sẽ sử dụng ngôn ngữ
lập trình Visual C++ 6.0 để viết code Nhưng để viết code sử dụng thư viện
OpenCV thì ta cần phải làm một số công việc sau:
2.4.1 Cài một số phần mề m hỗ trợ
Để viết được ứng dụng dùng ngôn ngữ lập trình Visual C++ 6.0 nên nhất
thiết chúng ta phải cài đặt nó
Tiếp theo chúng ta cần cài đặt thêm DirectX SDK và Platform SDK vì
OpenCV cần có hỗ trợ hai phần mềm này Mọi sự giúp đỡ về điều này bạn sẽ tìm
thấy ở “[OPENCV_ROOT]\OpenCV\docs\ faq.htm”, trong đó [OPENCV_ROOT]
là thư mục cài đặt OpenCV của bạn
Cuối cùng là cài đặt thư viện OpenCV Đến hiện tại thì đã có năm phiên bản
của OpenCV mà bạn có thể sử dụng (từ bản 1.0 đến beta 5.0), tuy nhiên bản mới
nhất sẽ có những bổ sung và chỉnh sửa mới, vì thế chúng ta sẽ cài đặt bản beta 5.0
Trang 6để dùng Download phiên bản này theo đường dẫn
http://sourceforge.net/projects/opencvlibrary và cài đặt bình thường Chú ý rằng,
trước khi cài đặt OpenCV thì Visaul C++ 6.0 phải được chạy it nhất một lần rồi
2.4.2 Thiết lập Visual C++ 6.0 cho OpenCV
a) Thiết lập đường dẫn hệ thống cho biến môi trường
Mặc dù chúng ta đã có một số lựa chọn trong khi cài đặt OpenCV nhưng có
vẽ những lựa chọn này không hoạt động đúng trong các phiên bản hiện thời của
OpenCV Vì thế chúng ta cần phải thiết đặt lại đường dẫn hệ thống cho các biến
môi trường Để thực hiện công việc này ta làm thư sau:
Kích vào nút “Start” sau đó chọn “Control Panel” rồi kích đúp vảo mục
“System”, hộp thoại “System Properties” xuất hiện, ta chọn Advanced thì được
như hình 2:
Hình 2 “System Properties” Dialog Box
Trang 7Chọn “Environment Variables” thì hộp thoại “Environment Variables” sẽ
xuất hiện như hình 3:
Hình 3 “Environment Variables” Dialog Box
Trong mục “System variables” chọn “Path” sau đó kích vào nút “Edit” và sẽ
xuất hiện hộp thoại “Edit System Variable”, đánh đường đẫn tới thư mục “bin” của
OpenCV vào cuối “Variable value” (chú ý phải ngăn cách bằng dấu chấm phẩy)
như hình 4 sau đó nhấn “OK”
Hình 4 “Edit System Variable” Dialog Box
Chú ý, phải khởi động lại máy để hệ thống cập nhật biến môi trường Sau
đó, OpenCV sẽ tìm thấy những DLL trong thư mục “bin” mỗi khi chúng ta chạy
một ứng dụng nào đó
Trang 8b) Chỉ rõ những thư mục trong Visual C++ 6.0
Chúng ta sẽ khởi động Visual C++ 6.0 Từ menu chọn Tools\Options… như
hình 5
Hình 5 Tools\Options…
Hộp thoại “Options” xuất hiện, chọn Tab “Directories”, hộp thoại xuất hiện
như hình6
Trang 9Hình 6 Options\Directories=>Includey files
Trong hộp thoại “Options” ta chọn “Include files” trong “Show directories
for:”, trong “Directories” tạo các đường dẫn tới các thư mục “Include” của
DirectXSDK, Microsoft Platform SDK và OpenCV, chú ý đường dẫn tới
DirectXSDK phải được đặt ở trên cùng như hình 6
Tiếp theo ta làm tương tự với “Library files”, các đường dẫn sẽ là tới
“…lib\x86” của DirecXSDK và “lib” của OpenCV Cũng cần chú ý là đường dẫn
tới DirectXSDK phải được đặt trên cùng như hình 7
Hình 7 Option\Directories s=>Library files
Ta cũng thực hiện tương tự với “Executable files” ,đường dẫn tới hai thư
mục “bin” của DirectXSDK và OpenCV, như hình 8
Trang 10Hình 8 Option\Directories s=>Executacle files
c) Tạo dự án sử dụng OpenCV
Ta sẽ tạo một dự án theo tuần tự File\New… \Projects\Win32 Console
Aplication, đặt tên cho dự án trong mục “Project name”, lưu dự án vào nơi cần
thiết trong “Location”, kích “OK” và mặc định các bước tiếp theo
Hình 9 New Project
Trang 11Trước khi tạo một ứng dụng thực tế chúng ta cần sửa đổi sự thiết lập đự án
tới các đường link Từ menu chọn “Project\Settings…” (hình 10)
Hình 10 Project\Settings…
Trong “Projects Settíng” chọn dự án của chúng ta, trong “Settings For:”
chọn “All Configurations” (hình 11)
Hình 11 All Configurations
Trang 12Chọn Tab “Link”, chọn “General” cho “Categry” (hình 12)
Hình 12 Link General
Trong thẻ “Object/library modules” đánh các thư viện (cv.lib, cxcore.lib,
highgui.lib, strmbase.lib) vào (hình 13)
Trang 13Hình 13 Object/library modules
Ta đã thực hiện xong việc thay đổi các đường link, sau đây ta sẽ tạo một ứng
dụng đầu tiên Từ Menu chọn File\New…\FilesC++ Source File, đánh tên vào
“File name” là ImageViewer, chọn “OK” là xong (hình14)
Hình 14 File\New…\Files C++ Source File
Tiếp theo viết code cho chương trình đầu tiên như sau:
image = cvLoadImage(filename, 0); /*Tai mot anh co ten la filename voi cac chi
so : 0 cho anh grayscale , 1 cho anh mau color*/
Trang 14if(image != 0) {
cvNamedWindow("Display", CV_WINDOW_AUTOSIZE); // Tao mot cua so
cvShowImage("Display", image); // Hien thi anh len cua so cvWaitKey(0); // Cho cho toi khi mot ky tu d uoc an
cvDestroyWindow("Display");//Huy cua so }
}
Sau khi viết xong code thì thực hiện biên dịch chương trình (Ctrl+F7 hoặc
F7) Để chạy chương trình chúng ta làm như sau:
Trên thanh Toolbar của Windows kích vào “Start”, chọn “Run”, đánh “cmd”
vào “Open” rồi chọn “OK”, hộp thoại “C:\WINDOWS\system32\cmd.exe” hiện ra
như hình 15
Hình 15 C:\WINDOWS\system32\cmd.exe
Dùng các thao tác “cd” để chuyển tới các thư mục kế tiếp chứa dự án của
chúng ta và “cd ” để quay về thư mục trước đó Bằng cách này chúng ta sẽ chỉ tới
Trang 15đường dẫn chứa file chạy của dự án của ta như sau: D:\NGHIEN
Hình 16 ImageViewer.exe
Trên đây là từng bước để tạo một ứng dụng bằng Visual C++ 6.0 sử dụng
thư viện thị giác máy tính mã nguồn mở - OpenCV Từ đây, để tạo một dự án mới
ta sẽ làm tuần tự theo các bước trong mục c)
2.5 Các chương trình sử dụng thư viện OpenCV
Trang 16IplConvKernel* element = 0;//Cau truc phan tu
const int element_shape = CV_SHAPE_CROSS;//Kieu phan tu hinh thanh
//Dia chi cau bien ma nhan duoc vi tri cua bien cap nhat
int global_pos = 0;
//Goi ham thuc hien thanh truot , thuc hien mo
void Opening(int pos)
{
element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0
);//Tao cau truc phan tu
cvErode(src,image,element,1);//An mon anh bang viec su dung cau truc phan tu bat ky
cvDilate(image,dest,element,1);//Mo rong anh bang viec su dung cau truc phan tu bat ky
cvReleaseStructuringElement(&element);//Giai phong cau truc phan tu
cvShowImage("Opening and Closing window",dest);
}
//Goi ham thuc hien thanh truot , thuc hien dong
void Closing(int pos)
//Goi ham thuc hien thanh truot , thuc hien su lam mon
void Erosion(int pos)
{
element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0 );