31
Thgiác máy Computer Vision [email protected] Trần Quóc Dăng - Cơ Điện T2 K48 - ĐHBKHN Trang 1 TNG QUAN VTHGIÁC MÁY TÍNH 1. Gi i thi u vthgiác máy - Computer Vision Thgiác máy là một lĩnh vực đã và đang phát triển mnh mtrên thế gi i hi n nay. Khái nim vthgiác máy Computer Vision có liên quan ti nhiu ngành hc và có nhi ều hướ ng nghiên c u khác nhau. Ktnhững năm 70 của thế k20 khi mà khnăng tính toán của các máy tính trnên mnh m, nó có thgi i quyết được nhng công vi c c n ti tốc độ cao như xử lý các tp ảnh hay các đoạn video thì thgiác máy được nhắc đến , nghiên c u và phát triển cho đến ngày nay. Thgiác máy là một lĩnh vực rt mi mđối vi các nhà nghiên c u Vi t nam, nó ch mi xut hin gần đây ở trong các tchức quân đội và mt s vi n nghiên c u khác. Vi c áp dng thgiác máy vào các ng dng nghiên c u khoa hc được coi là mt khởi đầu cho chặng đường phát trin c a thgiác máy các trường đại hc hi n nay. 1.1. Thế nào là thgiác máy Thgiác máy bao gm lý thuyết và các khut liên quan nh m mục đích tạo ra mt hthng nhân to có thnhn thông tin tcác hình ảnh thu được hoc các tp dli ệ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 nhng công vi c nng nhc và nhàm chán mà nó còn có mt skhnăng bt chước động vật và con ngườ i. Mt trong s nhng khnăng đó là nhận biết được thế gi i qua “mắt” của nó. Bng vi c kết hp vi các mô hình khác nữa như máy hc , mạng nơron … giúp cho chúng dn ti ến ti mt hthng nhân to có nhng quyết đị nh linh hot và chính xác hơn. Lĩnh vực nghiên c u ca thgiác máy r t rộng, và đặc điểm chung là các bài toán vthgiác máy đều không có một đề bài chung và cách gi i quyết duy nht. Mi gii pháp gi i quyết vấn đề được mt kết qunhất đị nh cho những trường hp cth. Ta có ththy s tương quan giữ a thgiác máy với các lĩnh vực khác như sau:

Thi Giac May_7-10

Embed Size (px)

Citation preview

Page 1: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 1

TỔ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:

Page 2: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 2

Hì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.

Page 3: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN 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

Page 4: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 4

OpenCV 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

Page 5: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 5

Cá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

Page 6: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN 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

Page 7: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 7

Chọ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 đó.

Page 8: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 8

b) 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 .

Page 9: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 9

Hì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.

Page 10: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 10

Hì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

Page 11: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 11

Trướ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

Page 12: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 12

Chọ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).

Page 13: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 13

Hì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…\FilesC++ Source File

Tiếp theo viết code cho chương trình đầu tiên như sau:

#include <cv.h>

#include <highgui.h>

void main(int argc, char *argv[])

{

IplImage* image=0; // Dinh nghia mot con tro kieu IplImage

char*filename = argc == 2 ? argv[1] : (char*)"lena.jpg";

image = cvLoadImage(filename, 0); /*Tai mot anh co ten la filename voi cac chi

so : 0 cho anh grayscale , 1 cho anh mau color*/

Page 14: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 14

if(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 duoc 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

Page 15: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 15

đường dẫn chứa file chạy của dự án của ta như sau: D:\NGHIEN

CUU\OpenCV\Hoc OpenCV\ImageViewer\Debug\ ImageViewer.exe như hình 16

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

2.5.1. Các chương trình xử lý ảnh

a) Những thao tác hình thái học

#ifdef _CH_

#pragma package <opencv>

#endif

#ifndef _EiC

#include <cv.h>

Page 16: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 16

#include <highgui.h>

#include <stdlib.h>

#include <stdio.h>

#endif

IplImage* src = 0;

IplImage* image = 0;

IplImage* dest = 0;

IplConvKernel* 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)

{

element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0 );

cvDilate(src,image,element,1);

cvErode(image,dest,element,1);

cvReleaseStructuringElement(&element);

cvShowImage("Opening and Closing window",dest);

}

//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 );

Page 17: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 17

cvErode(src,dest,element,1);

cvReleaseStructuringElement(&element);

cvShowImage("Erosion and Dilation window",dest);

}

//Goi ham thuc hien thanh truot , thuc hien su gian no

void Dilation(int pos)

{

element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0 );

cvDilate(src,dest,element,1);

cvReleaseStructuringElement(&element);

cvShowImage("Erosion and Dilation window",dest);

}

int main( int argc, char** argv )

{

char* filename = argc == 2 ? argv[1] : (char*)"baboon.jpg";

if( (src = cvLoadImage(filename,1)) == 0 )

return -1;

image = cvCloneImage(src);

dest = cvCloneImage(src);

//Tao cac cua so cho cac anh dau ra

cvNamedWindow("Opening and Closing window",1);

cvNamedWindow("Erosion and Dilation window",1);

cvShowImage("Opening and Closing window",src);

cvShowImage("Erosion and Dilation window",src);

cvCreateTrackbar("Open","Opening and Closing window",&global_pos,20,Opening);

cvCreateTrackbar("Close","Opening and Closing window",&global_pos,20,Closing);

cvCreateTrackbar("Dilate","Erosion and Dilation window",&global_pos,20,Dilation);

cvCreateTrackbar("Erode","Erosion and Dilation window",&global_pos,20,Erosion);

cvWaitKey(0);

//Giai phong cac con tro anh

cvReleaseImage(&src);

cvReleaseImage(&image);

Page 18: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 18

cvReleaseImage(&dest);

//Huy cac cua so

cvDestroyWindow("Opening va Closing window");

cvDestroyWindow("Erosion va Dilation window");

return 0;

}

#ifdef _EiC

main(1,"morphology.c");

#endif

Kết quả chạy chương trình:

Hình 17. Những thao tác hình thái học

b) Biến đổi Log – Polar

#include <cv.h>

#include <highgui.h>

int main(int argc, char** argv)

{

Page 19: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 19

IplImage* src=0;

char* filename = argc == 2 ? argv[1] : (char*)"fruits.jpg";

if(( src=cvLoadImage(filename,1))!= 0 )

{

//Khoi tao 3 anh dst,src1 va rsc2

IplImage* dst = cvCreateImage( cvSize(256,256),8/*IPL_DEPTH_8U*/, 3 );

IplImage* src1 = cvCreateImage( cvGetSize(src), 8, 3 );

IplImage* src2 = cvCreateImage( cvSize(256,256), 8, 3 );

//Thuc hien ham cvLogPolar voi anh src la anh nguon con anh dst la anh

dich

cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 50,

CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );

//Thuc hien ham cvLogPolar voi anh dst la anh nguon con anh src1 la anh

dich

cvLogPolar( dst, src1, cvPoint2D32f(src->width/2,src->height/2), 50,

CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP );

//Thuc hien ham cvLogPolar voi anh src1 la anh nguon con anh src2 la anh

dich

cvLogPolar( src1,src2, cvPoint2D32f(src->width/2,src->height/2), 50,

CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS/*+CV_WARP_INVERSE_MAP*/ );

cvNamedWindow( "log-polar", 1 );

cvShowImage( "log-polar", dst );

cvNamedWindow( "inverse log-polar", 1 );

cvShowImage( "inverse log-polar", src1 );

cvNamedWindow( "inverse-inverse log-polar", 1 );

cvShowImage( "inverse-inverse log-polar", src2 );

cvWaitKey();

}

return 0;

}

Kết quả chương trình như sau:

Page 20: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 20

Hình 18. Log – Polar

c) Những sự biến đổi ảnh đặc biệt (Biến đổi Hough)

#include <cv.h>

#include <highgui.h>

#include <math.h>

int main(int argc, char** argv)

{

IplImage* src=0;

char*filename = argc == 2 ? argv[1] : (char*)"pic1.png";

if((src=cvLoadImage(filename,0))!= 0)

Page 21: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 21

{

IplImage* dst = cvCreateImage( cvGetSize(src), 8, 1 );

IplImage* color_dst = cvCreateImage( cvGetSize(src), 8, 3 );

CvMemStorage* storage = cvCreateMemStorage(0);//Tao kho bo nho

CvSeq* lines = 0;

int i;

cvCanny( src, dst, 0, 200, 5 );//Thuc hien giai thuat Canny cho su nhan dang goc

cvCvtColor( dst, color_dst, CV_GRAY2BGR );//Chuyen sang anh den trang(Grayscale)

#if 1

lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0

);//Tim cac duong trong anh nhi phan su dung bien doi Hough

for( i = 0; i < MIN(lines->total,100); i++ )

{

float* line = (float*)cvGetSeqElem(lines,i);//Tra lai con tro cho phan tu chuoi boi chi so

cua no

float rho = line[0];

float theta = line[1];

CvPoint pt1, pt2;//Khai bao hai diem

double a = cos(theta), b = sin(theta);

double x0 = a*rho, y0 = b*rho;

pt1.x = cvRound(x0 + 400*(-b));//Ep thanh kieu so nguyen

pt1.y = cvRound(y0 + 400*(a));

pt2.x = cvRound(x0 - 400*(-b));

pt2.y = cvRound(y0 - 400*(a));

cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, 8 );//Thuc hien ve duong thang

}

#else

lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80,

30, 10 );

for( i = 0; i < lines->total; i++ )

{

CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);

cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );

}

#endif

cvNamedWindow( "Source", 1 );

cvShowImage( "Source", src );

Page 22: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 22

cvNamedWindow( "Destination", 1 );

cvShowImage( "Destination", dst );

cvNamedWindow( "Hough", 1 );

cvShowImage( "Hough", color_dst );

cvWaitKey();

}

return 0;

}

Kết quả chương trình như sau:

Hình 19. Biến đổi Hough

2.5.2. Các chương trình tìm mặt người trong ảnh

Dò tìm mặt sử dụng sự phân loại HAARCASCADE #include <stdio.h>

#include "cxcore.h"

#include "cv.h"

#include "highgui.h"

//8 bit, color or gray - deprecated, use CV_LOAD_IMAGE_ANYCOLOR

#define CV_LOAD_IMAGE_UNCHANGED -1

// 8 bit, gray

#define CV_LOAD_IMAGE_GRAYSCALE 0

//8 bit unless combined with CV_LOAD_IMAGE_ANYDEPTH, color

#define CV_LOAD_IMAGE_COLOR 1

//any depth, if specified on its own gray

Page 23: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 23

#define CV_LOAD_IMAGE_ANYDEPTH 2

//by itself equivalent to CV_LOAD_IMAGE_UNCHANGED

//but can be modified with CV_LOAD_IMAGE_ANYDEPTH

#define CV_LOAD_IMAGE_ANYCOLOR 4

void main(int argc,char**argv)

{

CvHaarClassifierCascade*pCascade=0;//Do tim mat

CvMemStorage*pStorage=0;//Bo dem bo nho mo rong

CvSeq*pFaceRectSeq;//Danh sach cac mat phat hien

int i;

//Khoi tao

IplImage*pInpImg=(argc>1)?cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR):0;

pStorage=cvCreateMemStorage(0);

pCascade=(CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml",0,

0,0);

//Lam cho co hieu luc moi thu khoi tao dung muc

if(!pInpImg||!pStorage||!pCascade)

{

printf("Khoi tao loi:%s\n",

(!pInpImg)?"khong tai duoc file anh":

(!pCascade)?"khong tai duoc HaarCascade--""hay chac chan la duong dan dung":

"loi cap phat bo nho cho kho du lieu");

exit(-1);

}

//Phat hien mat trong anh

pFaceRectSeq=cvHaarDetectObjects(pInpImg,pCascade,pStorage,

1.1,//quy mo tim kiem tang 10% tung anh di qua

3,//cac nhom giam sut it hon 3 su tim kiem

CV_HAAR_DO_CANNY_PRUNING,//bo qua nhung vung khong chac de chua

dung mot mat

cvSize(0,0));//su dung xml mac dinh cho quy mo tim kiem nho

//tao mot cua so de chua dung nhung mat tim kiem duoc

cvNamedWindow("Haar Window",0);

//Ve mot bien dang hinh chu nhat quanh moi khuon mat tim duoc

for(i=0;i<(pFaceRectSeq?pFaceRectSeq->total:0);i++)

{

CvRect*r=(CvRect*)cvGetSeqElem(pFaceRectSeq,i);

CvPoint pt1={r->x,r->y};

CvPoint pt2={r->x+r->width,r->y+r->height};

Page 24: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 24

cvRectangle(pInpImg,pt1,pt2,CV_RGB(0,255,0),3,4,0);

}

//Hien thi nhung mat tim duoc

cvShowImage("Haar Window",pInpImg);

cvWaitKey(0);

cvDestroyWindow("Haar Window");

//Giai phong tai nguyen

cvReleaseImage(&pInpImg);

if(pCascade)

cvReleaseHaarClassifierCascade(&pCascade);

if(pStorage)

cvReleaseMemStorage(&pStorage);

}

Kết quả chương trình như sau:

Hình 20. Tìm khuôn mặt trong ảnh

Page 25: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 25

2.5.3. Các chương trình theo dõi

CamShiftDemo

#ifdef _CH_

#pragma package <opencv>

#endif

#ifndef _EiC

#include "cv.h"

#include "highgui.h"

#include <stdio.h>

#include <ctype.h>

#endif

IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;

CvHistogram *hist = 0;//Bieu do

int backproject_mode = 0;

int select_object = 0;

int track_object = 0;

int show_hist = 1;

CvPoint origin;

CvRect selection;

CvRect track_window;

CvBox2D track_box;

CvConnectedComp track_comp;

int hdims = 16;

float hranges_arr[] = {0,180};

float* hranges = hranges_arr;

int vmin = 10, vmax = 256, smin = 30;

void on_mouse( int event, int x, int y, int flags, void* param )

{

if( !image )

return;

if( image->origin )

y = image->height - y;

if( select_object )

Page 26: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 26

{

selection.x = MIN(x,origin.x);

selection.y = MIN(y,origin.y);

selection.width = selection.x + CV_IABS(x - origin.x);

selection.height = selection.y + CV_IABS(y - origin.y);

selection.x = MAX( selection.x, 0 );

selection.y = MAX( selection.y, 0 );

selection.width = MIN( selection.width, image->width );

selection.height = MIN( selection.height, image->height );

selection.width -= selection.x;

selection.height -= selection.y;

}

switch( event )

{

case CV_EVENT_LBUTTONDOWN:

origin = cvPoint(x,y);

selection = cvRect(x,y,0,0);

select_object = 1;

break;

case CV_EVENT_LBUTTONUP:

select_object = 0;

if( selection.width > 0 && selection.height > 0 )

track_object = -1;

break;

}

}

CvScalar hsv2rgb( float hue )

{

int rgb[3], p, sector;

static const int sector_data[][3]=

{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};

hue *= 0.033333333333333333333333333333333f;

sector = cvFloor(hue);//Chuyen doi kieu floating-point sang integer

p = cvRound(255*(hue - sector));//Chuyen doi kieu double sang integer

p ^= sector & 1 ? 255 : 0;

Page 27: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 27

rgb[sector_data[sector][0]] = 255;

rgb[sector_data[sector][1]] = 0;

rgb[sector_data[sector][2]] = p;

return cvScalar(rgb[2], rgb[1], rgb[0],0);

}

int main( int argc, char** argv )

{

CvCapture* capture = 0;

if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))

capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );//Bat video tu webcam

else if( argc == 2 )

capture = cvCaptureFromAVI( argv[1] ); //Bat video tu file avi

if( !capture )

{

fprintf(stderr,"Could not initialize capturing... \n");

return -1;

}

printf( "Hot keys: \n"

"\tESC - quit the program\n"

"\tc - stop the tracking\n"

"\tb - switch to/from backprojection view\n"

"\th - show/hide object histogram\n"

"To initialize tracking, select the object with mouse\n" );

cvNamedWindow( "Histogram", 1 );

cvNamedWindow( "CamShiftDemo", 1 );

cvSetMouseCallback( "CamShiftDemo", on_mouse, 0 );

cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );//Tao thanh Trackbar

cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 );

cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 );

for(;;)

{

IplImage* frame = 0;

int i, bin_w, c;

Page 28: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 28

frame = cvQueryFrame( capture );//Tao dong video bat duoc tu webcam

if( !frame )

break;

if( !image )

{

/* Cap phat tat ca cac bo dem */

image = cvCreateImage( cvGetSize(frame), 8, 3 );

image->origin = frame->origin;

hsv = cvCreateImage( cvGetSize(frame), 8, 3 );

hue = cvCreateImage( cvGetSize(frame), 8, 1 );

mask = cvCreateImage( cvGetSize(frame), 8, 1 );

backproject = cvCreateImage( cvGetSize(frame), 8, 1 );

hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );//Tao bieu do

histimg = cvCreateImage( cvSize(320,200), 8, 3 );//Anh chua bieu do

cvZero( histimg );//Xoa anh bieu do

}

cvCopy( frame, image, 0 );//Copy khung nhin vao anh

cvCvtColor( image, hsv, CV_BGR2HSV );//Chuyen anh thu duoc sang dang HSV

if( track_object )

{

int _vmin = vmin, _vmax = vmax;

cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),

cvScalar(180,256,MAX(_vmin,_vmax),0), mask );//Kiem tra su sai khac giua 2

Scalar

cvSplit( hsv, hue, 0, 0, 0 );//Chia mang nhieu kenh vao trong cac mang don kenh hay rut

mot kenh don tu mang do

if( track_object < 0 )

{

float max_val = 0.f;

cvSetImageROI( hue, selection );//Dat kenh quan tam toi gia tri duoc chon

cvSetImageROI( mask, selection );

cvCalcHist( &hue, hist, 0, mask );

cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );

cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );

Page 29: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 29

cvResetImageROI( hue );

cvResetImageROI( mask );

track_window = selection;

track_object = 1;

cvZero( histimg );

bin_w = histimg->width / hdims;

for( i = 0; i < hdims; i++ )

{

int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );

CvScalar color = hsv2rgb(i*180.f/hdims);

cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),

cvPoint((i+1)*bin_w,histimg->height - val),

color, -1, 8, 0 );

}

}

cvCalcBackProject( &hue, backproject, hist );

cvAnd( backproject, mask, backproject, 0 );

cvCamShift( backproject, track_window,

cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),

&track_comp, &track_box );

track_window = track_comp.rect;

if( backproject_mode )

cvCvtColor( backproject, image, CV_GRAY2BGR );

if( image->origin )

track_box.angle = -track_box.angle;

cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );

}

if( select_object && selection.width > 0 && selection.height > 0 )

{

cvSetImageROI( image, selection );

cvXorS( image, cvScalarAll(255), image, 0 );

cvResetImageROI( image );

}

cvShowImage( "CamShiftDemo", image );

cvShowImage( "Histogram", histimg );

Page 30: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 30

c = cvWaitKey(10);

if( c == 27 )

break;

switch( c )

{

case 'b':

backproject_mode ^= 1;

break;

case 'c':

track_object = 0;

cvZero( histimg );

break;

case 'h':

show_hist ^= 1;

if( !show_hist )

cvDestroyWindow( "Histogram" );

else

cvNamedWindow( "Histogram", 1 );

break;

default:

;

}

}

cvReleaseCapture( &capture );

cvDestroyWindow("CamShiftDemo");

return 0;

}

#ifdef _EiC

main(1,"camshiftdemo.c");

#endif

Kết quả chương trình như sau:

Page 31: Thi Giac May_7-10

Thị giác máy – Computer Vision [email protected]

Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 31

Hình 21. Một số hình ảnh thu được khi điều chỉnh các thanh trượt

Hình 22. Biểu đồ thu được ứng với trường hợp trên