Bộ Giáo Dụ c Và Đào T ạo

Trường Đại Học Sư Ph ạm Kỹ Thuậ t TP H ồ Chí Minh
Khoa Công Nghệ Thông Tin

KHÓA LUẬN TỐT NGHIỆP

PHÁT HIỆN MỤC TIÊU DI ĐỘNG
SỬ DỤNG BỘ LỌC KALMAN

Sinh viên thực hiện: TRẦN NHẬT QUANG
MSSV: 06102070
Giáo viên hướng dẫn: THS. TRẦN TIẾN ĐỨC

TP Hồ Chí Minh , 201 1

ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HỒ CHÍ MINH

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

KHOA CÔNG NGHỆ THÔNG TIN

Độc lập – Tự do – Hạnh phúc





NHIỆM VỤ THỰC HIỆN KHÓA LUẬN TỐT NGHIỆP



Họ tên sinh viên: Trần Nhật Quang
MSSV: 06102070
Chuyên ngành: Công Nghệ Thông Tin
Tên đề tài: Phát hiện mục tiêu di động sử dụng bộ lọc Kalman

Nội dung thực hiện:
Lý thuyết:

Tìm hiểu phương pháp phát hiện vật thể dựa trên màu sắc.
Tìm hiểu về bộ lọc Kalman ứng dụng trong phát hiện mục tiêu di động.

Thực hành:

Xây dựng chương trình phát hiện mục tiêu di động dựa trên phân tích màu sắc và
sử dụng bộ lọc Kalman để tối ưu ước đoán.
Kết hợp việc theo dõi đối tượng với các thuật toán đồ họa máy tính để tạo ra chức
năng vẽ và điều khiển ảnh từ camera.

Thời gian thực hiện: từ 2.9.2010 đến 1.1.2011
Chữ ký của sinh viên: _______________________________________________________

TP Hồ Chí Minh, ngày

tháng

năm 2011

TRƯỞNG KHOA CNTT

GIẢNG VIÊN HƯỚNG DẪN

(K{ và ghi rõ họ tên)

(K{ và ghi rõ họ tên)

Đặng Trường Sơn

Trần Tiến Đức

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

LỜI CẢM ƠN

Trong suy nghĩ của em, bốn năm đại học của một sinh viên được tổng kết bởi đồ án tốt
nghiệp. Từ đầu em đã xác định sự quan trọng của đồ án này như thế.
Nhận được đề tài mình thích là một may mắn. Và em đã được nhận đề tài này.
Đồ án này có thể là không quá phức tạp so với những thành tựu về tin học hiện nay, nhưng
với một sinh viên như em thì không thể tránh khỏi những khó khăn trong quá trình thực
hiện.
May mắn thay em đã nhận được sự giúp đỡ nhiệt tình của thầy Trần Tiến Đức, ĐH Sư
Phạm Kỹ Thuật TP Hồ Chí Minh, giáo viên hướng dẫn và cũng là cố vấn học tập của em
trong suốt những năm đại học. Thầy không chỉ dạy em về kiến thức mà còn cho em nhiều
hiểu biết quý báu khác. Em rất cảm ơn thầy! Xin được gửi tới thầy lời cảm ơn chân thành!
Chúc thầy luôn khỏe mạnh để tiếp tục hướng dẫn thêm nhiều lớp sinh viên nữa.
Bên cạnh đó, cũng như nhiều bạn sinh viên khác, để hoàn thành được không chỉ đồ án này
mà còn cả khóa học đại học, em cần phải nhờ vào sự quan tâm, ủng hộ hết sức lớn lao của
cha mẹ em và mọi người trong gia đình. Nên nơi đây, từ đáy lòng mình, em xin được gửi
lời cảm ơn chân thành nhất tới cha mẹ em và mọi người! Họ luôn là những người mà em
yêu quý. Cầu mong những điều tốt đẹp nhất đến với họ!
Ngoài ra, không thể không nhớ tới các thầy cô trong khoa Công Nghệ Thông Tin, khoa Đào
Tạo Chất Lượng Cao, ĐH Sư Phạm Kỹ Thuật TP Hồ Chí Minh, và các thầy cô khác đã tận tâm
dạy và quan tâm giúp đỡ em cùng các bạn trong thời gian qua. Nhờ họ em mới có được
những kiến thức như hôm nay để hoàn thành đồ án này. Em xin được cảm ơn các thầy cô!
Một lần nữa, em cảm ơn mọi người!
TP Hồ Chí Minh, tháng 12 năm 2010

Trần Nhật Quang

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

ii

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN


_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
TP Hồ Chí Minh, ngày

tháng

năm 2011

Giáo viên hướng dẫn

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

iii

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN


_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
TP Hồ Chí Minh, ngày

tháng

năm 2011

Giáo viên phản biện

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

iv

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

MỤC LỤC
NHIỆM VỤ THỰC HIỆN KHÓA LUẬN TỐT NGHIỆP ................................................................ i
LỜI CẢM ƠN ....................................................................................................................... ii
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN .......................................................................... iii
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN .............................................................................. iv
MỤC LỤC............................................................................................................................. v
DANH MỤC HÌNH ............................................................................................................. viii
DANH MỤC BIỂU ĐỒ .......................................................................................................... ix
Mở Đầu ............................................................................................................................... 1
Vấn đề thực tế................................................................................................................. 1
Mục đích, đối tượng và phạm vi nghiên cứu .................................................................... 1
Bố cục của báo cáo .......................................................................................................... 5
1

Chương 1 Nền Tảng .................................................................................................... 6
1.1

Các khái niệm cơ bản về xác suất .......................................................................... 7

1.1.1

Công thức tính xác suất .................................................................................. 7

1.1.2

Xác suất có điều kiện ...................................................................................... 8

1.2

Biến ngẫu nhiên .................................................................................................... 9

1.3

Hàm xác suất......................................................................................................... 9

1.4

Hàm tích lũy ........................................................................................................ 10

1.5

Các đặc trưng số của biến ngẫu nhiên ................................................................. 10

1.5.1

Kz vọng ........................................................................................................ 10

1.5.2

Phương sai ................................................................................................... 12

1.6

Moment của biến ngẫu nhiên ............................................................................. 13

1.7

Hiệp phương sai .................................................................................................. 17

1.7.1

Định nghĩa .................................................................................................... 17

1.7.2

Tính chất ...................................................................................................... 18

1.8

Ma trận hiệp phương sai ..................................................................................... 19

1.9

Phân phối chuẩn (phân phối Gauss) .................................................................... 19

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

v

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

2

1.10

Ước lượng ....................................................................................................... 21

1.11

Nguyên tắc trực giao (Orthogonality principle) ................................................ 24

Chương 2 Bộ Lọc Kalman .......................................................................................... 26
2.1

Giới thiệu về lọc .................................................................................................. 27

2.2

Giới thiệu bộ lọc Kalman ..................................................................................... 27

2.2.1

Tổng quan .................................................................................................... 27

2.2.2

Đôi nét về Rudolf Emil Kalman ..................................................................... 28

2.2.3

Ứng dụng của bộ lọc Kalman ........................................................................ 29

2.2.4

Ví dụ dẫn nhập ............................................................................................. 29

2.2.5

Mô hình tổng quát của ước lượng dùng bộ lọc Kalman ................................ 31

2.3

2.3.1

Các ký hiệu sử dụng ..................................................................................... 32

2.3.2

Xây dựng bộ lọc Kalman ............................................................................... 33

2.3.3

Tóm tắt các phương trình của bộ lọc Kalman ............................................... 38

2.4
3

Bộ lọc Kalman trong OpenCV .............................................................................. 39

Chương 3 Phát Hiện Vật Thể Dựa Trên Màu Sắc ...................................................... 42
3.1

4

Bộ lọc Kalman ..................................................................................................... 32

Hệ màu HSV ........................................................................................................ 43

3.1.1

Định nghĩa .................................................................................................... 43

3.1.2

Chuyển từ màu RGB sang HSV ...................................................................... 44

3.2

Moment của ảnh (image moment) ...................................................................... 46

3.3

Thuật toán phát hiện đối tượng theo màu sắc .................................................... 46

3.4

Cài đặt thuật toán phát hiện vật thể dựa theo màu sắc với OpenCV.................... 47

Chương 4 Thiết Kế Và Cài Đặt Chương Trình Phát Hiện Di Động............................... 49
4.1

Thiết kế ............................................................................................................... 50

4.1.1

Mô hình hệ thống ........................................................................................ 50

4.1.2

Bộ đo ........................................................................................................... 52

4.2

Cài đặt................................................................................................................. 53

4.2.1

Hoạt động của chương trình ........................................................................ 53

4.2.2

Các đoạn mã chính ....................................................................................... 56

Kết Luận ............................................................................................................................ 70
Về lý thuyết ................................................................................................................... 70
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

vi

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

Về ứng dụng .................................................................................................................. 70
Hướng phát triển........................................................................................................... 70
Phụ Lục.............................................................................................................................. 71
Hướng dẫn cài đặt OpenCV 2.1 cho project Winform CLR, Visual Studio 2008 C++ ........ 71
TÀI LIỆU THAM KHẢO ....................................................................................................... 77

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

vii

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

DANH MỤC HÌNH
Hình 0-1 Phần màu vàng và hồng của cây bút sẽ được theo dõi .......................................... 2
Hình 0-2 Theo dõi đối tượng ............................................................................................... 2
Hình 0-3 Dùng theo dõi chuyển động để vẽ hình từ camera. ............................................... 3
Hình 0-4 Ảnh kết quả của thao tác vẽ qua camera ............................................................... 3
Hình 0-5 Zoom ảnh bằng cách điều khiển các vật thể .......................................................... 4
Hình 0-6 Kết quả của việc zoom ảnh .................................................................................... 4
Hình 1.6-1 Các phân phối xác suất và "độ nhọn". Đường ở giữa: phân phối chuẩn. ........... 17
Hình 2.3-1 Tóm tắt quá trình làm việc của lọc Kalman ....................................................... 39
Hình 3.1-1 Hình nón ngược biễu diễn hệ màu HSV ............................................................ 43
Hình 3.1-2 Hình tròn biếu diễn các sắc màu (H: 0-360) và độ bão hòa (S: 0-1). Màu đỏ: H=0,
màu xanh lá: H=120, màu xanh dương: H=240 .................................................................. 43
Hình 4.2-1 Cửa sổ điều khiển ............................................................................................. 53
Hình 4.2-2 Cửa sổ camera hiện kết quả của chức năng theo dõi ........................................ 53
Hình 4.2-3 Cửa sổ camera hiện kết quả của chức năng vẽ ................................................. 54
Hình 4.2-4 Ảnh kết quả của thao tác vẽ qua camera trên Khung nhìn ................................ 54
Hình 4.2-5 Zoom ảnh bằng cách điều khiển các vật thể ..................................................... 55
Hình 4.2-6 Kết quả của việc zoom ảnh trong Khung nhìn ................................................... 55
Hình PL-0-1 Cấu hình CMake 2.8.3..................................................................................... 71
Hình PL-0-2 Tạo project CLR Windows Forms Application .................................................. 72
Hình PL-0-3 Thêm item ...................................................................................................... 73
Hình PL-4 Thêm menu ....................................................................................................... 73
Hình PL-5 Kết của việc cài đặt và chạy thành công một chương trình Winform dùng
OpenCV ............................................................................................................................. 76

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

viii

Đề tài Phát Hiện Mục Tiêu Di Động Sử Dụng Mặt Nạ Kalman

DANH MỤC BIỂU ĐỒ
Biểu đồ 1.6-1 Phân phối xác suất của X hộp 1, phương sai lớn hơn: các giá trị phân tán xa
kz vọng hơn ...................................................................................................................... 15
Biểu đồ 1.6-2 Phân phối xác suất của X hộp 2, phương sai nhỏ hơn: các giá trị tập trung
hơn quanh kz vọng ............................................................................................................ 15
Biểu đồ 1.6-3 Moment trung tâm bậc 3 lớn hơn 0: lệch dương (đuôi bên phải dài hơn) .... 16
Biểu đồ 1.9-1 Đồ thị phân phối xác suất của X ................................................................... 20
Biểu đồ 1.9-2 Đồ thị của một số phân phối chuẩn ............................................................. 21
Biểu đồ 4.1-1 Một số phân phối Gauss, với phương sai σ2 càng lớn thì các giá trị x có giá trị
lớn (xa kz vọng) sẽ có xác suất cao hơn ............................................................................. 51

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

ix

Mở Đầu
Vấn đề thực tế
Ngày nay, mọi người nghe nói ngày càng nhiều về các ô tô tự lái có khả năng thay thế con
người trong việc vận hành xe, một chương trình máy tính sẽ điều khiển xe. Những chiếc xe
này thậm chí còn được giới thiệu là an toàn hơn xe lái bởi con người trong một số trường
hợp.
Trong các ứng dụng bảo vệ như camera an ninh, những thiết bị này hoạt động 24/24. Tuy
nhiên, chỉ một vài đoạn phim được quay là có { nghĩa quan trọng, chẳng hạn như đoạn
phim ghi lại cảnh có người đột nhập vào hành lang (nơi đặt camera) vào buổi tối. Vậy làm
sao chúng ta có thể tìm ra đoạn video đó? Sẽ rất mất thời gian (và kém hiệu quả) nếu ta
ngồi xem toàn bộ 24 giờ phim do camera quay. Các chương trình sẽ giúp chúng ta.
Một ứng dụng khác, có thể chúng ta không thích thú lắm, đó là các tên lửa không đối
không (air-to-air missile: AAM). Đó các là tên lửa dẫn hướng được bắn từ một máy bay để
tiêu diệt máy bay khác. Tên lửa dẫn hướng hoạt động theo nguyên lý phát hiện mục tiêu
(thông thường bằng ra đa hoặc hồng ngoại, đôi khi cũng sử dụng Lazer hoặc quang học)
sau đó tự động dẫn đến mục tiêu [1].
Và còn nhiều ứng dụng khác nữa.
Vậy làm sao máy tính (các chương trình) làm được những việc trên? Có nhiều thứ liên
quan cần phải giải quyết, nhưng một phần quan trọng trong đó là vấn đề phát hiện ra các
vật thể chuyển động.
Vì việc phát hiện ra các đối tượng di động được sử dụng rất rộng rãi như thế nên có thể
nói đề tài này rất có { nghĩa trong khoa học lẫn thực tiễn.

Mục đích, đối tƣợng và phạm vi nghiên cứu
Đồ án này sẽ tìm hiểu và cài đặt thuật toán phát hiện mục tiêu di động dựa trên phân tích
màu sắc và sử dụng bộ lọc Kalman. Ứng dụng được viết sử dụng thư viện OpenCV 2.1 và
ngôn ngữ lập trình C++, IDE Visual Studio 2008.
Có nhiều thuật toán phát hiện chuyển động. Một số thuật toán phổ biến được kể đến sau
đây:

Lucas-Kanade: phân tích cục bộ (một vùng ảnh) để tìm ra vị trí mới của những điểm
đặc trưng (thường là các điểm góc (corner)).

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

1

MỞ ĐẦU

Horn-Schunck: một thuật toán dựa trên phân tích toàn cục, khá chậm hơn LucasKanade và ngày nay ít dùng [2].
Mean-Shift: một kỹ thuật phân tích dữ liệu tổng quát. Được dùng trong nhiều lĩnh
vực không chỉ riêng trong xử lý ảnh [2]. Một phát triển của Mean-shift dùng cho xử
lý ảnh là Cam-shift (continuously adaptive mean-shit).

Những thuật toán này khá phức tạp đối với một sinh viên đại học.
Vì vậy, một phương pháp đơn giản hơn được tìm hiểu và sử dụng ở đây. Đó là phương
pháp phát hiện vật thể dựa trên màu sắc (Chương 3) kết hợp với bộ lọc Kalman (Chương 2)
để theo dõi chuyển động.
Cụ thể hơn, chúng ta sẽ thực hiện một giải pháp để phát hiện và theo dõi các đối tượng có
màu sắc chỉ định trước (Hình 0-2). Ở đây đối tượng là một phần cây bút có màu hồng và
vàng (Hình 0-1).

Hình 0-1 Phần màu vàng và hồng của cây bút sẽ được theo dõi

Hình 0-2 Theo dõi đối tượng

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

2

MỞ ĐẦU

Hình 0-3 Dùng theo dõi chuyển động để vẽ hình từ camera.

Hình 0-4 Ảnh kết quả của thao tác vẽ qua camera

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

3

MỞ ĐẦU
Sau khi đã theo dõi được chuyển động của vật thể, ta sẽ sử dụng các thuật toán trong đồ
họa máy tính để tạo ra một ứng dụng vẽ (Hình 0-3 và 0-4) và điều khiển ảnh từ camera (di
chuyển và zoom ảnh) (Hình 0-5 và 0-6).

Hình 0-5 Zoom ảnh bằng cách điều khiển các vật thể

Hình 0-6 Kết quả của việc zoom ảnh

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

4

MỞ ĐẦU
Ứng dụng được viết ở đây dừng lại với các chức năng vừa trình bày. Tuy nhiên, với kiến
thức về phát hiện vật thể và bộ lọc Kalman, nội dung lý thuyết được tìm hiểu hoàn toàn có
thể dùng để phát triển nhiều ứng dụng thích hợp khác.

Bố cục của báo cáo
Báo cáo của đồ án này gồm 2 phần chính: Phần lý thuyết và Phần viết ứng dụng.
Phần lý thuyết gồm 3 chương:


Chương 1: Nền Tảng. Trình bày về các nội dung toán và xác suất thống kê có liên
quan tới xây dựng bộ lọc Kalman.
Chương 2: Bộ Lọc Kalman. Giới thiệu về lọc, giới thiệu bộ lọc Kalman, xây dựng bộ
lọc Kalman, bộ lọc Kalman trong OpenCV 2.1.
Chương 3: Phát Hiện Vật Thể Dựa Trên Màu Sắc. Trình bày về phương pháp phát
hiện đối tượng bằng phân tích màu sắc và cài đặt với OpenCV 2.1.

Phần viết ứng dụng gồm 1 chương:

Chương 4: Thiết Kế Và Cài Đặt Chương Trình. Trình bày về thiết kế của chương trình
cũng như trích dẫn và giải thích một số đoạn code quan trọng.

Báo cáo còn có phần Phụ lục trình bày Cách cài đặt và cấu hình OpenCV 2.1 dùng để phát
triển chương trình của đồ án này.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

5

1 Chương

1

Nền Tảng
Các nội dung chính:




Biến ngẫu nhiên và các đặc trưng số của nó
Hàm xác suất và hàm tích lũy
Hiệp phương sai và ma trận hiệp phương sai
Ước lượng điểm
Nguyên tắc trực giao

6

CHƢƠNG 1. NỀN TẢNG

Các nội dung về xác suất và toán được trình bày ở đây nhằm mục đích phục vụ việc xây dựng bộ lọc
Kalman (Chương 2). Nếu bạn quan tâm đến các vấn đề và khía cạnh sâu hơn của lý thuyết xác suất
và toán, bạn hãy tìm đọc ở các tài liệu chuyên về xác suất thống kê và toán.

1.1 Các khái niệm cơ bản về xác suất
Trong cuộc sống hằng ngày, khi thực hiện một việc làm mà có nhiều kết quả có thể xảy ra,
người ta sẽ nghĩ tới “khả năng” xảy ra của mỗi kết quả. Xác suất ra đời để giúp chúng ta
đánh giá “khả năng” đó.
Một ví dụ là việc tung xúc xắc. Kết quả sẽ là 1 trong 6 trường hợp: ta được mặt 1 chấm hay
2, 3, 4, 5 và 6 chấm.
Trong xác suất thống kê, việc tung xúc xắc được gọi là một phép thử. Phép thử đơn giản là
một hành động mà ta muốn tính toán khả năng xảy ra giữa các kết quả của nó.
Kết quả của phép thử được gọi là một biến cố (hay sự kiện (event)). Trong ví dụ trên, ta có
một số biến cố:


“Được mặt 1 chấm”
“Được mặt 3 chấm”
“Được mặt 6 chấm”

Mỗi một biến cố có khả năng xảy ra khác nhau, và ta có một đại lượng là xác suất dùng để
do đạt khả năng này.
Ví dụ: nếu ta dùng một bộ bài gồm có 52 lá, và thực hiện phép thử rút ra một lá từ bộ bài,
như vậy có tất cả 52 khả năng đầu ra. Như vậy, ta có một vài biến cố và xác suất của nó:



"Rút ra lá bài vừa đỏ vừa đen cùng một lúc" (0 phần tử), xác xuất = 0/52 = 0
"Lá bài rút ra là con 5 cơ" (1 phần tử), xác xuất = 1/52
"Lá bài rút ra là con Già" (4 phần tử), xác xuất = 4/52
"Lá bài rút ra là một lá bài" (52 phần tử), xác xuất = 52/52 = 1

1.1.1 Công thức tính xác suất
Thường thì (nếu không đi sâu vào các vấn đề phức tạp), ta có thể tính được xác suất bằng
trực giác, đơn giản xác suất trong các trường hợp trên là lấy tỉ lệ.
Công thức cổ điển
Tổng quát, người ta định nghĩa xác suất như sau:
P(A) = mA / n

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

7

CHƢƠNG 1. NỀN TẢNG
với mA là số biến cố sơ cấp thuận lợi cho A, tức là, một cách tương đối1, các biến cố mà nó
xảy ra thì A xảy ra. Còn n là số biến cố sơ cấp đồng khả năng, tức là tất cả các trường hợp
có thể xảy ta khi thực hiện phép thử.
Công thức tính xác suất theo thống kê
Định nghĩa xác suất cổ điển có những hạn chế (những trường hợp không tính được xác
suất) là:

Nó chỉ xét trong trường hợp số biến cố sơ cấp (n) là hữu hạn.
Và chỉ xét trong trường hợp hệ biến cố là đồng khả năng2.

Do đó, người ta đưa ra thêm định nghĩa xác suất theo thống kê:
P(A) = lim (m/n), n  ∞
trong đó, n là số lần thực hiện phép thử còn m là số lần biến cố A xuất hiện.
Trong thực tế, n không cần tới vô cùng, tùy theo trường hợp mà người ta chọn một số n
lớn là được. Khi đó, ta có
P(A) ≈ m/n

1.1.2 Xác suất có điều kiện
Quan sát lược đồ bên cạnh.
Lấy ngẫu nhiên một điểm M trong hình E. Gọi A là
biến cố M ∈ A và B là biến cố M ∈ B.
Giả sử biến cố B đã xảy ra, bằng trực giác ta có thể
thấy các biến cố sơ cấp thuận lợi cho biến cố A
chính là phần giao giữa A và B: A ⋂ B.
Vì vậy xác suất để A xảy ra khi B đã xảy ra là:
P(A|B) = S(A⋂B) / S(B), với S là diện tích.
P(A|B) được gọi là xác xuất có điều kiện, đọc là “Xác xuất để A xảy ra khi B đã xảy ra”.
Có lẽ không phải nói, P(A|B) và P(A) = S(A) / S(E) không bằng nhau.
Tiếp theo, chia tử và mẫu cho S(E) ta được:
P(A|B) = [S(A⋂B) / S(E)] / [S(B) / [S(E)] = P(AB) / P(B), với P(B) > 0
trong đó AB là biến cố xảy ra khi A và B đồng thời xảy ra.
1

Để giải thích đầy đủ thế nào là một biến cố sơ cấp thuận lợi sẽ phải đi sâu vào khái niệm biến cố. Ta sẽ
không làm điều đó ở đây. Nếu quan tâm bạn có thể đọc các tài liệu về xác suất.
2
Hệ biến cố đồng khả năng là hệ biến cố mà các biến cố xảy ra hoàn toàn không có thứ tự ưu tiên nào.
Chúng xảy ra một cách hoàn toàn ngẫu nhiên, “công bằng”.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

8

CHƢƠNG 1. NỀN TẢNG
Trên đây chỉ là một ví dụ, nhưng ta sẽ thấy công thức tính xác suất có điều kiện cũng giống
như vậy.
Một cách tổng quát, người ta định nghĩa công thức xác suất có điều kiện như sau:
P(A|B) = P(AB) / P(B), với P(B) > 0
Ta nói đến xác suất có điều kiện ở đây vì dưới đây ta sẽ đề cập đến khái niệm kz vọng có
điều kiện.
Như vậy đến đây ta có các khái niệm cơ bản về phép thử, biến cố và xác suất.
Tuy nhiên, các biến cố như vậy vẫn mới chỉ được miêu tả bằng lời, không thể dùng trong
tính toán định lượng. Và biến ngẫu nhiên đã ra đời để giải quyết vấn đề này.

1.2 Biến ngẫu nhiên
Biến ngẫu nhiên (random variable) có thể hiểu đơn giản là một ánh xạ. Nó ánh xạ một biến
cố với giá trị số.
Ví dụ: Trong phép thử gieo một đồng xu, ta có thể có một ánh xạ như sau:
X(biến cố) =

0
1

nếu
nếu

biến cố="được mặt hình"
biến cố="được mặt số"

Một ví dụ khác là phép thử giao xúc xắc, ta có thể có ánh xạ như sau:
X(số chấm) = số chấm
trong đó “số chấm” là số chấm gieo được của xúc xắc.
Mỗi X trong các ví dụ trên được gọi là một biến ngẫu nhiên.
Như vậy, biến ngẫu nhiên không có nghĩa là một biến như các biến toán học khác. Thực
chất nó là một hàm số (hay ánh xạ).
Các kết quả đầu ra được ánh xạ bởi biến ngẫu nhiên được gọi là giá trị của biến ngẫu
nhiên. Trong ví dụ gieo đồng xu, biến ngẫu nhiên X có 2 giá trị 0 và 1. Trong ví dụ tung xúc
xắc, biến ngẫu nhiên X có 6 giá trị 1, 2, 3, 4, 5 và 6.

1.3 Hàm xác suất
Đối với biến ngẫu nhiên rời rạc, hàm xác suất, còn gọi là hàm khối xác suất (tiếng Anh:
Probability mass function), ký hiệu là p(x) được định nghĩa như sau: 𝑝
1 , 𝑥 = 𝑥1 𝑝
2 , 𝑥 = 𝑥2 𝑝
3 , 𝑥 = 𝑥3
p(x) =
… 𝑝𝑛
, 𝑥 = 𝑥𝑛
0 , 𝑥 𝑘𝑕á𝑐
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

9

CHƢƠNG 1. NỀN TẢNG
trong đó, x1, x2,… xn là các giá trị của biến ngẫu nhiên, và p1, p2,… pn là xác suất tại các biến
cố có giá trị tương ứng. p(x) = 0 tại các x khác vì đó là các biến cố không thể xảy ra (giống
như biến cố bóc được lá bài vừa đỏ vừa đen trong bộ bài).
Hàm này là hàm đặc trưng cho một biến ngẫu nhiên rời rạc.
Nói thêm: Đối với biến ngẫu nhiên liên tục, có một hàm tương đương là hàm mật độ. Về
trực giác, hàm mật độ chính là hàm xác suất được làm mịn, tức là các giá trị x gần như
liên tiếp nhau (xk+1 – xk ≈ 0). Hàm mật độ được ký hiệu là f(x) (khác với hàm tích lũy F(x)).

1.4 Hàm tích lũy
Hàm tích lũy còn gọi là hàm phân phối xác suất, được định nghĩa như sau (chung cho cả
biến ngẫu nhiên rời rạc và liên tục):
F(x) = P[X<x], ⩝x ∈ R
Lưu {: 2 hàm xác suất (mật độ) và tích lũy đều có thể dùng để đặc trưng cho một biến ngẫu
nhiên. Tuy nhiên, trong ứng dụng, người ta thường dùng hàm xác suất (mật độ) hơn. Khi
người ta nói đến phân phối xác suất của một biến ngẫu nhiên, chính là đang đề cập đến
hàm đặc trưng của nó, và thông thường là hàm xác suất.

1.5 Các đặc trƣng số của biến ngẫu nhiên
1.5.1 Kỳ vọng
Kz vọng (expected value) của một biến ngẫu nhiên X, còn gọi là kz vọng toán hay giá trị kz
vọng, được định nghĩa như sau (đối với biến ngẫu nhiên rời rạc):
E(X) = ∑xipi
Có thể diễn đạt bằng lời: Kz vọng là tổng của tích giá trị (biến ngẫu nhiên) với xác suất tại
đó.
Ví dụ: Một hộp có 8 viên bi, 3 viên có trọng lượng 40g, 5 viên có trọng lượng 60g. Gọi X là
biến ngẫu nhiên có giá trị là trọng lượng có các viên bi (hay nói cách khác, X là trọng lượng
mỗi viên bi). Ta tính được kz vọng của X:
E(X) = 40 * 3/8 + 60 * 5/8 = 52.5
Trong ví dụ trên, ta thấy E(X) là trọng lượng trung bình của một viên bi.
Một cách tổng quát, về { nghĩa, kz vọng chính là giá trị trung bình (về mặt xác suất) của
một biến ngẫu nhiên.
Ví dụ: Trong “trò chơi” số đề, người chơi đặt 1 số từ 00 – 99. Nếu người chơi đặt 1 đồng thì
khi thắng sẽ thu được 70 đồng, nếu không thì mất 1 đồng. Vậy nếu gọi X là biến ngẫu nhiên
có giá trị là số tiền thắng được của người chơi thì ta có kz vọng của X là:
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

10

CHƢƠNG 1. NỀN TẢNG
E(X) = 70 * 1/100 + -1 * 99/100 = -0.29
Như vậy có nghĩa là trung bình cứ đặt 1 đồng, người chơi sẽ “thu về” -0.29 đồng (mất đi
0.29 đồng).
Nói thêm: một trò chơi có kz vọng khác 0 được coi là trò chơi không công bằng. Trong trò
chơi số đề trên, người chơi lỗ.
1.5.1.1 Các tính chất của kỳ vọng

Kz vọng có tính tuyến tính, nghĩa là nó có tính chất sau:
E(aX + bY) = aE(X) + bE(Y), với X, Y là 2 biến ngẫu nhiên; a, b là 2 hằng số
Nói cách khác, nó bao gồm các tính chất sau:


E(c) = c, với c = hằng số
E(c.X) = c.E(X)
E(X + Y) = E(X) + E(Y), với X, Y là 2 biến ngẫu nhiên

Kz vọng không có tính nhân, nghĩa là E(X.Y) không bằng E(X).E(Y). Lượng sai khác giữa
E(X.Y) và E(X).E(Y) là hiệp phương sai cov(X,Y) (sẽ nói bên dưới):
cov(X.Y) = E(X.Y) - E(X).E(Y)
E(X.Y) chỉ bằng E(X).E(Y) khi 2 biến ngẫu nhiên là độc lập:
E(X.Y) = E(X).E(Y), với X và Y là 2 biến ngẫu nhiên độc lập
Ta sẽ nói lại vấn đề này trong phần Hiệp phương sai.
Ngoài ra dễ thấy một tính chất nữa là về mặt đơn vị thì E(X) có cùng đơn vị với X, ví dụ nếu
X có đơn vị là gram thì E(X) cũng có đơn vị là gram.
1.5.1.2 Kỳ vọng có điều kiện

Cho 2 biến ngẫu nhiên X và Y, ta có khái niệm kz vọng có điều kiện được định nghĩa như
sau:
E[X|Y](y) = E[X|Y = y] = 𝑥 𝑥

.P( X=x|Y=y )

trong đó y là một biến cố mà biến ngẫu nhiên Y ánh xạ, ký hiệu Y=y nghĩa là xảy ra biến cố
y. P( X=x|Y=y ) là xác suất có điều kiện (xem mục 2.1.2).
Nói thêm: Kz vọng lặp là một khái niệm dựa trên kz vọng có điều kiện:
E( E[X|Y] ) = E(X)
E( E[X|Y] ) gọi là kz vọng lặp.
Chứng minh:

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

11

CHƢƠNG 1. NỀN TẢNG

1.5.1.3 Kỳ vọng của ma trận

Nếu biến ngẫu nhiên X là một ma trận thì kz vọng của nó là ma trận các kz vọng của các
phần tử của X: 𝑥
1,1 𝑥
2,1
E(X) = E( ⋮ 𝑥𝑚
,1 𝑥

1,2 𝑥
2,2
⋮ 𝑥𝑚
,2




⋯ 𝑥

1,𝑛 𝐸
(𝑥1,1 ) 𝐸(𝑥1,2 ) 𝑥
2,𝑛 𝐸
(𝑥2,1 ) 𝐸(𝑥2,2 )
⋮ )=

⋮ 𝑥𝑚
,𝑛 𝐸
(𝑥𝑚 ,1 ) 𝐸(𝑥𝑚 ,2 )




⋯ 𝐸

(𝑥1,𝑛 ) 𝐸
(𝑥2,𝑛 )
⋮ 𝐸
(𝑥𝑚 ,𝑛 )

Tính chất này được dùng trong ma trận hiệp phương sai (sẽ đề cập bên dưới).

1.5.2 Phương sai
Phương sai (variance) của một biến số ngẫu nhiên rời rạc X được định nghĩa như sau:
var(X) = E[(X - µ)2]
trong đó µ là kz vọng của X, µ = E(X).
Một cách trực giác, nếu coi kz vọng là trung bình, thì phương sai chính là “khoảng cách
bình phương” trung bình từ các giá trị của X tới kz vọng. Hay nói cách khác, nếu các giá trị
(của biến ngẫu nhiên X) càng phân tán (nằm xa) giá trị trung bình (kz vọng) thì var(X) càng
lớn và ngược lại.
Một công thức phương sai tương đương là:
var(X) = E(X2) - µ2
Chứng minh: Sử dụng các tính chất của kz vọng ta có thể chứng minh công thức này như
sau:
var(X) = E[(X - µ)2]
= E[ X2 – 2X µ + µ2 ]
= E(X2) – E(2X µ) + E(µ2)
= E(X2) – 2 µ E(X) + µ2
= E(X2) – 2 µ2 + µ2
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

12

CHƢƠNG 1. NỀN TẢNG
= E(X2) - µ2
Nói thêm: Theo ý kiến cá nhân của tôi, có thể người ta muốn đo độ phân tán quanh giá trị
trung bình của các giá trị của biến ngẫu nhiên nên muốn tính E(|X-µ|). Tuy nhiên việc dùng
giá trị tuyệt đối đã dẫn tới khó khăn nào đó trong việc phát triển các công thức nên người
ta đã thay trị tuyệt đối bằng bình phương. Dù sao đây chỉ là suy diễn cá nhân về nguồn gốc
phương sai.
Về mặt đơn vị, phương sai có đơn vị là bình phương đơn vị của X. Ví dụ X có đơn vị là cm
thì var(X) sẽ có đơn vị cm2.
Người ta đưa ra thêm khái niệm độ lệch chuẩn, ký hiệu σ(X), được tính bằng căn bậc 2 của
phương sai:
σ(X) = var(x)
Với định nghĩa của phương sai, ta dễ thấy nó luôn ≥ 0, vì vậy không cần điều kiện gì ở đây.
Như vậy, độ lệch chuẩn, do kế thừa tính chất của phương sai, cũng có thể dùng để so sánh
sự phân tán của các giá trị quanh giá trị kz vọng: σ càng lớn thì các giá trị càng nằm xa
(phân tán) giá trị kz vọng.
Một thuận lợi của độ lệch chuẩn là nó có cùng đơn vị với độ lệch chuẩn.
Nói thêm: Có vẻ như độ lệch chuẩn là sự quay trở về mong muốn ban đầu: tính toán
“khoảng cách phân tán trung bình” (chứ không phải “khoảng cách bình phương trung
bình” – phương sai). “Khoảng cách phân tán trung bình” mà tôi nói là E(|X-µ|). Mặc dù độ
lệch chuẩn không bằng “khoảng cách phân tán trung bình” này ( σ≠E(|X-µ|) ) nhưng cũng
chẳng có vấn đề gì khi dùng nó để giải quyết vấn đề mà người ta mong muốn “khoảng
cách phân tán trung bình” giải quyết: tính toán sự phân tán của các giá trị quanh giá trị kz
vọng của một biến ngẫu nhiên.

1.6 Moment của biến ngẫu nhiên
Moment được đề cập ở mục này là moment trong toán và xác suất thống kê, nó khác với
khái niệm moment của ảnh (sẽ nói bên dưới) cũng như moment trong vật lý.
Cho F là một biến ngẫu nhiên, ta có đại lượng E(Fk) được gọi là moment bậc k của F, và đại
lượng E[ ( F-E(F) )k ] được gọi là moment trung tâm bậc k của F.
Rõ ràng, kz vọng mà chúng ta đề cập trong các mục trước chính là moment bậc 1 của biến
ngẫu nhiên. Còn phương sai chính là moment trung tâm bậc 2.
Nói thêm: Thông thường để tiếp cận một vấn đề mới lạ, chúng ta thường (và có lẽ là nên)
bắt đầu từ trực giác rồi đến một sự tổng quát đơn giản (gần trực giác) và sau đó là sự tổng
quát hóa và mở rộng. Có thể khái niệm moment ra đời sau các khái niệm phương sai và độ
lệch chuẩn, vì bạn có thể thấy nó là sự tổng quát hóa và mở rộng của các khái niệm này.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

13

CHƢƠNG 1. NỀN TẢNG
Chúng ta có thể đặt câu hỏi các moment khác kz vọng và phương sai có { nghĩa gì không.
Hầu như mọi sự tổng quát hóa đều rất có { nghĩa đối với sự phát triển. Các moment của
biến ngẫu nhiên cho ta các thông tin về dáng điệu của phân bố xác suất (hình dạng của đồ
thị hàm xác suất (hay hàm mật độ đối với biến ngẫu nhiên liên tục)) của biến ngẫu nhiên
đó.
Ví dụ, nếu moment trung tâm bậc 2 (phương sai) của biến ngẫu nhiên F nhỏ, thì có nghĩa là
các giá trị của F nói chung ít bị sai lệch so với giá trị kz vọng của nó, hay nói cách khác phần
lớn xác suất của phân bố xác suất của F tập trung trong một khoảng nhỏ xung quanh điểm
giá trị kz vọng. Ngược lại, nếu moment trung tâm bậc 2 lớn, thì phân bố xác suất của F nói
trung sẽ phân tán ra xa điểm giá trị kz vọng hơn. Đây là { nghĩa ta đã nói ở trên.
Ví dụ: Có 2 hộp bi, mỗi hộp đựng 12 viên bi. Gọi biến là biến ngẫu nhiên ánh xạ khối lượng
(đơn vị gram) các viên bi, nói cách khác X là khối lượng các viên bi. Ta có:
Hộp 1:
X (gram)

30

40

50

60

70

Số lượng

3

4

1

1

3

X (gram)

30

40

50

60

70

Số lượng

2

3

4

2

1

Hộp 2:

Cả hai hộp đều có E(X) = 47.5 (gram) (kz vọng: khối lượng trung bình)
Nhưng phương sai thì khác nhau: (nhắc lại: var(X) = E(X2) – (E(X))2)

Hộp 1: var(X) = 2491.67 – 47.52 = 235.42
Hộp 2: var(X) = 2391.67 – 47.52 = 135.42

Suy ra: các giá trị (khối lượng) của hộp 2 tập trung gần giá trị kz vọng (47.5) hơn.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

14

CHƢƠNG 1. NỀN TẢNG
0.33
0.25

Xác suất P(X)

0.25

0.08

0.08

Kỳ vọng

|

30

40

47.5

50

60

70

X (khối lượng)
Biểu đồ 1.6-1 Phân phối xác suất của X hộp 1, phương sai lớn hơn: các giá trị phân tán xa kỳ vọng hơn

0.33

Xác suất P(X)

0.25

0.17

0.17

0.08

Kỳ vọng

|

30

40

47.5 50

60

70

X (khối lượng)
Biểu đồ 1.6-2 Phân phối xác suất của X hộp 2, phương sai nhỏ hơn: các giá trị tập trung hơn quanh kỳ vọng

Moment trung tâm bậc 3 của F thể hiện độ lệch (skewness) của phân bố xác suất của F:
Nếu F có phân bố xác suất đối xứng quanh điểm giá trị kỳ vọng (có nghĩa là F và 2E(F) - F
có cùng phân bố xác suất), thì moment trung tâm bậc 3 của nó bằng 0. Nếu như moment
trung tâm bậc 3 lớn hơn không thì phân bố xác suất của F được gọi là lệch dương hay lệch
về bên phải (phần đuôi bên phải dài hơn), còn nếu moment trung tâm bậc 3 nhỏ hơn
không thì phân bố xác suất của F được gọi là lệch âm hay lệch về bên trái (phần đuôi bên
trái dài hơn).

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

15

CHƢƠNG 1. NỀN TẢNG
(+) Phân bố lệch dương
(đuôi phải dài hơn)

(-) Phân bố lệch âm
(đuôi trái dài hơn)

Ví dụ: Giả sử có một biến ngẫu nhiên F với phân bố xác suất rời rạc sau:
F

-2

1

3

p(F)

1/2

1/4

1/4

Khi đó giá trị kz vọng của F: E(F) = 0, moment trung tâm bậc 3 của F bằng:
E[ (F-E(F))3 ] = -23.1/2 + 13.1/4 + 33.1/4 = 3 > 0
Đồ thị phân bố xác suất của F có phần đuôi lệch về bên phải so nếu lấy điểm giá trị kz vọng
(F=0).

Xác suất P(F)

0.50

-2

Kỳ vọng
|
0

0.25

0.25

1

3

F
Biểu đồ 1.6-3 Moment trung tâm bậc 3 lớn hơn 0: lệch dương (đuôi bên phải dài hơn)

Còn moment trung tâm bậc 4 có liên quan đến công thức tính kurtosis mà ta có thể coi là
“độ nhọn” của phân bố xác xuất so với phân bố chuẩn3, nếu “độ nhọn” này lớn hơn 0 thì
biến ngẫu nhiên có đồ thị của phân bố xác suất “nhọn” hơn phân bố chuẩn, ngược lại thì
nó “bẹt” hơn. Xem thêm tại tài liệu [3].
3

Phân bố chuẩn (normal distribution) là phân bố xác suất thường dùng trong thực tế. Ta sẽ nói đến phân bố
này trong các mục sau.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

16

CHƢƠNG 1. NỀN TẢNG

Hình 1.6-1 Các phân phối xác suất và "độ nhọn". Đường ở giữa: phân phối chuẩn.

1.7 Hiệp phƣơng sai
1.7.1 Định nghĩa
Cho 2 biến ngẫu nhiên X và Y, ta có định nghĩa hiệp phương sai (covariance) của X và Y , ký
hiệu Cov(X,Y):
Cov(X,Y) = E[ (X-µx)(Y- µy) ]
trong đó µx, µy lần lượt là kz vọng của X, Y.
Một công thức tương đương của hiệp phương sai:
Cov(X,Y) = E (X Y) - µxµy
Chứng minh: Sử dụng các tính chất của kz vọng.
Cov(X,Y) = E[ (X-µx)(Y- µy) ]
= E( XY - µxY - X µy + µxµy )
= E(XY) - E(µxY) - E(X µy) + E(µxµy)
= E(XY) - µxE(Y) - µy E(X) + µxµy
= E(XY) - 2µxµy + µxµy
= E (X Y) - µxµy
Theo công thức thứ nhất, một cách trực giác, ta có thể thấy { nghĩa của hiệp phương sai,
đó là sự biến thiên cùng nhau của 2 biến ngẫu nhiên: Nếu 2 biến có xu hướng thay đổi
cùng nhau (nghĩa là, khi một biến có giá trị cao hơn giá trị kz vòng thì biến kia có xu hướng
cũng cao hơn giá trị kz vọng), thì hiệp phương sai giữa hai biến này có giá trị dương. Mặt
khác, nếu một biến nằm trên giá trị kì vọng còn biến kia có xu hướng nằm dưới giá trị kì
vọng, thì hiệp phương sai của hai biến này có giá trị âm.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

17

CHƢƠNG 1. NỀN TẢNG
Nếu 2 biến ngẫu nhiên là độc lập (sự biến thiên của chúng không liên quan nhau) thì hiệp
phương sai của chúng bằng 0.
X,Y độc lập  Cov(X,Y) = 0
Tuy nhiên điều ngược lại không đúng: nếu hiệp phương sai của X, Y bằng 0 thì không nhất
thiết 2 biến này độc lập. Các biến ngẫu nhiên mà có hiệp phương sai bằng 0 được gọi là
không tương quan (uncorrelated), chúng có thể độc lập nhau hoặc không.
Chúng ta đã từng đề cập trong phần kz vọng: Kz vọng không có tính nhân, và lượng khác
biệt giữa kz vọng của tích và tích các kz vọng là hiệp phương sai:
Cov(X,Y) = E(X Y) - µxµy
đây cũng là công thức mà chúng ta vừa trình bày.
Như vậy, nếu X, Y độc lập, ta có Cov(X,Y) = 0  E(X,Y) = µxµy
Cũng từ công thức định nghĩa hiệp phương sai, ta thấy đơn vị của hiệp phương sai là tích
đơn vị của X và Y, ví dụ X có đơn vị là m, Y có đơn vị là kg thì cov(X,Y) có đơn vị m.kg.

1.7.2 Tính chất
Với X, Y là 2 biến ngẫu nhiên, a, b là các hằng số (theo nghĩa a, b không là biến ngẫu nhiên)
ta có các tính chất sau được suy ra từ định nghĩa hiệp phương sai và tính chất kz vọng:



Cov(X,X) = Var(X)
Cov(X,Y) = Cov(Y,X)
Cov(aX, bY) = abCov(X,Y)
Cov(X1+X2, Y1+Y2) = Cov(X1, Y1) + Cov(X2, Y1) + Cov(X1, Y2) + Cov(X2, Y2)

Tổng quát, với các biến ngẫu nhiên X1, X2,… Xn và Y1, Y2,… Ym ta có:
Cov(∑x Xi, ∑Y Yj) = ∑X∑Y Cov(Xi, Yj)

Var(X1 + X2) = Var(X1) + Var(X1) + 2Cov(X1, X2)

Tổng quát, với các biến ngẫu nhiên X1, X2,… Xn ta có:
Var(∑x X) = ∑x Var(X) + 2

i, j:i<j Cov(X i ,

Xj )

Nói thêm: Ngoài khái niệm hiệp phương sai, người ta còn có khái niệm hệ số tương quan,
ký hiệu ρX, Y, bằng hiệp phương sai chia cho tích độ lệch chuẩn (σ) của 2 biến ngẫu nhiên.
ρX, Y = Cov(X,Y) / σXσY
Hệ số tương quan đặc trưng cho quan hệ tuyến tính của 2 biến ngẫu nhiên, nếu 2 biến
ngẫu nhiên có trị tuyệt đối hệ số tương quan càng gần bằng 1 thì chúng càng có quan hệ
tuyến tính, và ngược lại. Nếu 2 biến ngẫu nhiên có hệ số tương quan = 0 thì chúng không có
quan hệ tuyến tính. Về mặt đơn vị, hệ số tương quan lại không có đơn vị (khác với phương
sai có đơn vị là bình phương đơn vị của X và độ lệch chuẩn có đơn vị là đơn vị của X).
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

18

CHƢƠNG 1. NỀN TẢNG

1.8 Ma trận hiệp phƣơng sai4
Như chúng ta vừa trình bày, hiệp phương sai là đại lượng tính toán sự tương quan giữa 2
biến ngẫu nhiên.
Vậy giả sử chúng ta có một vector biến ngẫu nhiên5 có 3 phần tử X1, X2, X3. Nếu ta muốn
tính sự tương quan giữa tất cả các cặp biến ngẫu nhiên thì ta phải tính tất cả là 3 hiệp
phương sai: Cov(X1, X2), Cov(X1, X3), Cov(X2, X3).
Một cách tổng quát, ma trận hiệp phương sai đã ra đời để cho phép ta tính tất cả các Cov
giữa 2 biến ngẫu nhiên trong một vector biến ngẫu nhiên.
Cho một vector biến ngẫu nhiên X chứa n biến ngẫu nhiên, ma trận hiệp phương sai của X,
ký hiệu là ∑, được định nghĩa là: 𝐶𝑜𝑣
𝑋1 , 𝑋1 𝐶𝑜𝑣
𝑋2 , 𝑋1
∑=
⋮ 𝐶𝑜𝑣
𝑋𝑛 , 𝑋1
với X = 𝐶𝑜𝑣

𝑋1 , 𝑋2 𝐶𝑜𝑣
𝑋2 , 𝑋2
⋮ 𝐶𝑜𝑣
𝑋𝑛 , 𝑋2




⋯ 𝐶𝑜𝑣

𝑋1 , 𝑋𝑛 𝐶𝑜𝑣
𝑋2 , 𝑋𝑛
⋮ 𝐶𝑜𝑣
𝑋𝑛 , 𝑋𝑛 𝑋

1
⋮ 𝑋𝑛

Nói dễ hiểu, ma trận hiệp phương sai là “nơi chứa” các hiệp phương sai. Mỗi phần tử của
nó là một hiệp phương sai của 2 biến ngẫu nhiên Xi và Xj với i là chỉ số hàng và j là chỉ số
cột (i, j = 1..n).
Quan sát trên đường chéo của ma trận hiệp phương sai (i=j) ta thấy tại đó là các phương
sai, vì: Cov(Xi, Xi) = Var(Xi).

1.9 Phân phối chuẩn (phân phối Gauss)
Trong các mục vừa rồi chúng ta đã tìm hiểu khá đủ các khía cạnh cơ bản của một biến ngẫu
nhiên.
Chúng ta cũng đã đề cập đến hàm xác suất (hàm mật độ) là hàm đặc trưng cho một phân
phối xác suất. Nói một cách đơn giản phân phối xác suất (hay phân bố xác suất) là một
thuật ngữ dùng để chỉ sự phân bố các xác suất của một biến ngẫu nhiên.
Trong ví dụ về hộp bi ở mục 1.6, chúng ta có một hộp đựng 12 viên bi. Gọi biến là biến
ngẫu nhiên ánh xạ khối lượng (đơn vị gram) các viên bi, nói cách khác X là khối lượng các
viên bi. Ta có:

4

Tài liệu [4] Lindsay I Smith, A tutorial on Principal Components Analysis, 2002, có nói về ma trận hiệp
phương sai và ứng dụng của nó trong phân tích thành phần chính (mục 2.1.4 The covariance Matrix). Bạn
cũng có thể tham khảo cách nói dễ hiểu về các khái niệm xác suất ứng dụng trong tin học trong quyển này.
5
Vector biến ngẫu nhiên có thể hiểu đơn giản là một mảng (tập) các biến ngẫu nhiên.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

19

CHƢƠNG 1. NỀN TẢNG
X (gram)

30

40

50

60

70

Số lượng

3

4

1

1

3

Bảng trên cũng là một cách để biểu diễn phân phối xác suất của X, bởi vì nếu ta lấy số
lượng chia cho 12 (tổng số bi) ta sẽ xác suất của bi có khối lượng tương ứng. Hoặc ta có đồ
thị:
0.33
0.25

Xác suất P(X)

0.25

0.08

0.08

Kỳ vọng

|
30

40

47.5 50

60

70

X (khối lượng)
Biểu đồ 1.9-1 Đồ thị phân phối xác suất của X

Đồ thị trên cũng là một cách biểu diễn một phân phối xác suất.
Nói tóm lại, khi ta nói đến một phân phối xác suất là ta muốn nói về phân phối các xác suất
của các giá trị của một biến ngẫu nhiên, tức là phân phối xác suất cho biết mỗi giá trị của
biến ngẫu nhiên sẽ nhận xác suất là bao nhiêu.
Có rất nhiều phân phối xác suất, ví dụ của chúng ta vừa nói tới cũng là một phân phối xác
suất. Tuy nhiên, trong thực tế, người ta thường sử dụng một phân phối xác suất có tên là
phân phối chuẩn (normal distribution), hay phân phối Gauss.
Một biến ngẫu nhiên X được nói là có phân phối Gauss khi nó có hàm mật độ là hàm
Gauss, ký hiệu là X∼N(µ, σ), đọc là X có phân phối chuẩn (hay phân phối Gauss) với tham
số µ, σ (2 tham số đặc tả một hàm Gauss). Khi đó hàm mật độ của X là:
f(x; µ, σ) = 𝜑µ,𝜎 2 (x)=

1
σ 2π

e

-

(x-μ)2
2σ2

Với phân phối xác suất như trên, người ta tính được µ, σ lần lượt chính là kz vọng và độ
lệch chuẩn của X.
Dưới đây là đồ thị của một số phân phối chuẩn.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

20

CHƢƠNG 1. NỀN TẢNG

Biểu đồ 1.9-2 Đồ thị của một số phân phối chuẩn

Với μ = 0 và σ = 1, phân phối được gọi là phân phối chuẩn chuẩn hóa.
Quan sát đồ thị ta thấy phân phối chuẩn có dạng đối xứng. Giá trị kz vọng của X là μ, chính
là trục đối xứng. Và độ lệch chuẩn σ (hay phương sai σ2) càng lớn thì đồ thị của nó càng
“bẹt”, điều này phù hợp với hiểu biết của chúng ta: khi độ lệch chuẩn lớn thì các giá trị
càng phân tán ra xa kz vọng.

1.10 Ƣớc lƣợng
Trong mục này ta sẽ đề cập một số khái niệm liên quan đến vấn đề ước lượng (estimation).
Khái niệm
Ước lượng là phỏng đoán giá trị chưa biết dựa vào các quan sát. Có 2 loại:

Ước lượng điểm: Giá trị ước lượng là một số. Ví dụ, một chiếc xe đang chạy với vận
tốc khoảng 40km/h.
Ước lượng khoảng: Giá trị ước lượng là một đoạn [a, b]. Ví dụ, một chiếc xe đang
chạy với vận tốc khoảng 35 đến 40 km/h.

Trong báo cáo này ta chỉ đề cập đến ước lượng điểm.
Ước lượng điểm

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

21

CHƢƠNG 1. NỀN TẢNG
Gọi a là một giá trị chưa biết, khi đó người ta ký hiệu ước lượng điểm của a là â (có thể đọc
là “a mũ”), và ta viết a ≈ â.
Thống kê
Trong ước lượng, người ta có khái niệm thống kê: Thống kê là một đại lượng mà giá trị của
nó chỉ phụ thuộc vào các quan sát, không phụ thuộc vào các tham số chưa biết.
Ví dụ: Các biểu thức dùng để tính các điều sau là các thống kê:

Tỉ lệ học sinh giỏi.
Điểm trung bình của sinh viên.

Như vậy, chúng ta dựa vào các thống kê để tìm ra giá trị ước lượng, vì cậy người ta còn gọi
thống kê là hàm ước lượng.
Một cách tổng quát nếu ta có mẫu6 {x1, x2,… xn}, thì hàm θ:
θ = θ(x1, x2,… xn)
dùng để tính ra giá trị ước lượng θ cho tham số θ được gọi là hàm ước lượng.
Ước lượng không chệch (unbiased estimators)
Hàm ước lượng θ gọi là ước lượng không chệch của tham số θ nếu như:
E(θ) = θ.

Người ta chứng minh được các ước lượng sau đây là các ước lượng không chệch của cá
tham số tương ứng:
Tham số

Ký hiệu

Ước lượng không chệch

Trung bình

µ

X

Phương sai

Var (hay σ2)

S2

Độ lệch chuẩn

σ2

S

6

Mẫu: có thể hiểu là bộ dữ liệu quan sát. Để có một định nghĩa đầy đủ, xin tham khảo các tài liệu về thống
kê.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

22

CHƢƠNG 1. NỀN TẢNG

Tỷ lệ các phần tử
có tính chất nào đó

p

f

Bảng 1.10-1 Bảng các ước lượng không chệch

với X, f, S2, S, lần lượt là trung bình, tỷ lệ các phần tử có tính chất quan tâm, phương sai và độ lệch
chuẩn của mẫu quan sát.
Hoặc nói cách khác:


Trung bình mẫu X là ước lượng không chệch cho trung bình của đám đông 7.
Phương sai mẫu S2 8 (độ lệch chuẩn S) là ước lượng không chệch cho phương sai (độ
lệch chuẩn) của đám đông.

Tỷ lệ các phần tử có tính chất quan tâm f là ước lượng không chệch cho tỷ lệ các phần
tử đó của đám đông.

Ví dụ: để tìm tỷ lệ người biết nói 2 ngoại ngữ của một nước (đám đông), người ta khảo sát
một bộ phận dân cư (mẫu). Tỷ lệ người biết nói 2 ngoại ngữ trong bộ phận dân cư này là
một ước lượng không chệch của tỷ lệ người biết nói 2 ngoại ngữ trong cả nước.
Nói thêm: Thường thì đám đông rất lớn nên khảo sát toàn bộ (cho kết quả chính xác) gần
như không thể, do đó người ta dùng mẫu, đó là một tập con của đám đông mà người hy
vọng khảo sát nó sẽ cho kết quả muốn biết ở đám đông.
Ví dụ: để khảo sát chiều cao trung bình của người từ độ tuổi 15-18, người ta không thể do
hết tất cả những người trong độ tuổi này (đám đông), do đó người ta chọn ra một số
người để đo chiều cao (mẫu). Bằng nhiều phương pháp người ta có thể đảm bảo hoặc
khẳng định rằng kết quả từ mẫu là đúng với đám đông. Ước ượng không chệch làm được
phần nào mục đích đó.
Ngoài ra người ta còn có khái niệm ước lượng hiệu quả, ước lượng vững. Xin xem thêm các
tài liệu về thống kê nếu muốn biết chi tiết.
Độ chệch (bias)
Gọi θ là một ước lượng của θ, ta có định nghĩa độ chệch là:
Bias(θ) = E(θ) – θ
Với ước lượng không chệch ta có Bias bằng 0.
7

Đám đông là tập hợp các phần tử cần khảo sát.
Chính xác là phương sai mẫu hiệu chỉnh. Với số lượng các phần tử của mẫu lớn thì phương sai và phương
hiệu chỉnh gần bằng nhau. Tuy nhiên khi chứng minh thì người ta chứng minh được phương sai mẫu hiệu
chỉnh là ước lượng không chệch (chứ không phải phương sai). Xin xem thêm các tài liệu về thống kê nếu
muốn biết chi tiết.
8

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

23

CHƢƠNG 1. NỀN TẢNG
Ngoài ra còn có các khái niệm Ước lượng hiệu quả tốt nhất, Ước lượng nhất quán vững,…
có thể tham khảo tài liệu [5] Cao Hào Thi, Ước lượng các tham số thống kê.
Sai số bình phương trung bình (Mean Squared Error - MSE)
Sai số bình phương trung bình của ước lượng θ được định nghĩa là:
MSE(θ) = E[ (θ – θ)2 ]
Người ta chứng minh được rằng:
MSE(θ) = Var(θ) + [ θ - E(θ) ]2
Hay
MSE(θ) = Var(θ) + [ Bias(θ) ]2
Nếu θ là ước lượng không chệch thì:
MSE(θ) = Var(θ),
vì Bias(θ) = 0

1.11 Nguyên tắc trực giao (Orthogonality principle)
Nguyên tắc trực giao được dùng nhiều nhất trong thiết lập ước lượng tuyến tính.[6]
Nguyên tắc trực giao được dùng để tối ưu ước lượng. Nó có thể được dùng để tìm ước
lượng có sai số bình phương trung bình nhỏ nhất (Minimum MSE - MMSE).[6]
Gọi x là một vector ngẫu nhiên9 chưa biết sẽ được ước lượng dựa trên vector quan sát10 y.
Nếu ước lượng x của x và y có quan hệ tuyến tính:
x = Hy + c, với H là một ma trận và c là một vector nào đó.
Khi đó, nguyên tắc trực giao phát biểu rằng ước lượng 𝐱 sẽ có sai số bình phương trung
bình nhỏ nhất (MMSE) khi và chỉ khi:
E[ (𝐱 - x)yT ] = 0, và
E(𝐱 - x) = 0
9

Nhắc lại: vector ngẫu nhiên đơn giản là một bộ các biến ngẫu nhiên. Ví dụ ta có thể gọi tọa độ một điểm
trong không gian 2 chiều là một vector ngẫu nhiên, vì 2 tọa độ x và y của nó có thể xem là 2 biến ngẫu nhiên.
10
Vector quan sát ở đây là ma trận cùng kích thước với vector ngẫu nhiên x cần tìm. Ví dụ: vector x cần tìm là
một vector cột 2x1 thì vector quan sát y cũng là vector cột 2x1. Nó chính là bộ dữ liệu mà ta dùng để ước
lượng x. Ví dụ: ta muốn ước lượng vận tốc của một vật khi biết tọa độ của nó qua thời gian, khi đó vận tốc là
x, tọa độ là vector quan sát y.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

24

CHƢƠNG 1. NỀN TẢNG
Nếu x và y có trung bình (mean, hay kz vọng) bằng 0 thì chỉ cần điều kiện thứ nhất là được
(vì điều kiện thứ 2 đã tự động thỏa).
Một chút ghi chú: yT là ma trận chuyển vị của y.

Vậy nguyên tắc trực giao thực chất là hệ phương trình dùng để tìm các tham số cho một
hàm ước lượng (ở đây là H và c) để nó đạt tối ưu (theo nghĩa ước lượng này có sai số bình
phương trung bình nhỏ nhất – MMSE).
Bạn có thể xem ví dụ và phát biểu cho trường hợp tổng quát của nguyên tắc trực giao
trong tài liệu [6] Orthogonality principle – Wikipedia.
Nguyên tắc này cũng như hầu hết các nội dung đã trình bày trong chương này sẽ được
dùng trong xây dựng bộ lọc Kalman (Chương 2).

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

25

2 Chương

2

Bộ Lọc Kalman
Các nội dung chính:



Giới thiệu về lọc
Giới thiệu bộ lọc Kalman
Xây dựng bộ lọc Kalman
Bộ lọc Kalman trong OpenCV

26

CHƢƠNG 2. BỘ LỌC KALMAN

2.1 Giới thiệu về lọc
Một cách tổng quát, lọc là loại bỏ những phần không quan tâm hoặc không có { nghĩa hoặc
những phần sai sót để thu được một đầu ra tốt hơn (theo nghĩa hợp hơn với mong muốn,
quan tâm của ta).
Ví dụ: Trong xử lý ảnh ta có lọc làm trơn để làm mịn ảnh, lọc trung vị để khử nhiễu muối
tiêu. Trong microphone hoặc các máy thu âm cũng có một bộ phận lọc để loại bỏ tạp âm.
Hình thức hơn một chút, giả sử ta có trong một tín hiệu X bao gồm tín hiệu S (signal) ta
quan tâm và nhiễu N (noise):
X(k) = S(k) + N(k)
Nếu ta biết nhiễu N dao động quanh 0 và có giá trị trung bình bằng 0:
∑N(k) / m = 0, m: số lần quan sát N(1), N(2),… N(m)
cũng tức là ∑N(k) = 0
Vậy khi đó ta có:
∑X(k) = ∑(S(k) + N(k)) = ∑S(k) + ∑N(k) = ∑S(k)
Nhìn theo một khía cạnh nào đó ta đã loại được nhiễu N.
Tuy nhiên, trên đây chỉ là một ví dụ. Trong thực tế các nhiễu rất đa dạng và phức tạp nên
rất khó (đôi khi là không thể) loại bỏ hoàn toàn nhiễu. Bộ lọc chỉ “làm sạch” tín hiệu đến
một mức độ nào đó và trong đa số trường hợp ta cũng chỉ cần có thế.

2.2 Giới thiệu bộ lọc Kalman
2.2.1 Tổng quan
Năm 1960, R.E. Kalman công bố bài báo nổi tiếng về một giải pháp đệ quy để giải quyết bài
toán lọc thông tin rời rạc tuyến tính (discrete data linear filtering).[13] Bài báo có tựa đề “A
New Approach to Linear Filtering and Prediction Problems”. Khoảng 50 năm trôi qua, bộ
lọc Kalman đã trở nên phổ biến. Nó xuất hiện trong rất nhiều ứng dụng (xem mục 2.2.2) và
bởi vì vấn đề lọc mà nó giải quyết là một vấn đề cơ bản trong rất nhiều lĩnh vực, nên nó có
thể vẫn luôn còn được dùng nhiều ứng dụng mới nữa ở tương lai (trừ khi có một bộ lọc
hay một giải pháp nào đó tốt hơn ra đời).
Một cách tổng quát, bộ lọc Kalman là một tập hợp các phương trình toán học giúp tối ưu
ước lượng trạng thái của một hệ (theo nghĩa giá trị ước đoán có sai số bình phương trung
bình nhỏ nhất – MMSE) dựa trên mô hình hệ thống (system model), giá trị đo
(measurement value) và các hiểu biết về nhiễu (của hệ thống lẫn phép đo).
Biểu đồ sau đây là một mô tả hình thức của một bộ lọc nói chung.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

27

CHƢƠNG 2. BỘ LỌC KALMAN

Tín hiệu
cần đo

Tín hiệu
nhiễu
Cảm biến
(Bộ đo)

Tín hiệu
đã lọc

Tín hiệu
đo
Bộ lọc

Sai số của
cảm biến

Trong biểu đồ trên, bộ lọc Kalman cũng như các bộ lọc khác sẽ nằm vào vị trí của hình chữ
nhật Bộ lọc. Điểm khác biệt của bộ lọc Kalman là sự hiệu quả của nó.
Như phần sau sẽ trình bày, ta sẽ phương trình hóa các tín hiệu: tính hiệu đầu vào (cần đo),
tín hiệu nhiễu (bao gồm sai số cảm biến), tín hiệu đo được và tín hiệu đầu ra.
Ngoài ra bộ lọc Kalman còn cho phép thêm một tín hiệu điều khiển và cũng kể đến nhiễu
hệ thống (do mô hình hệ thống, khác nhiễu của phép đo nói trên).

2.2.2 Đôi nét về Rudolf Emil Kalman
Rudolf Emil Kalman sinh năm 1930 tại thủ đô Budapest, Hungary. Năm nay (2011) ông đã
81 tuổi. Ông tốt nghiệp bằng cử nhân và thạc sĩ về Electrical engineering tại học viện MIT
năm 1953 và 1954. Ông nhận bằng tiến sĩ tại Đại học Columbia năm 1957.
Những vị trí chính ông phụ trách:



Nghiên cứu toán học tại RIAS (Research Institute for Advanced Study) tại Baltimore
từ 1958 – 1964.
Giáo sư tại Đại học Standford từ 1964-1971.
Giáo sư nghiên cứu sau đại học (Graduate Research Professor) và Giám đốc Center
for Mathematical System Theory, đại học Florida, Gainesville từ 1971 – 1992.
Từ năm 1973, ông trở thành thành viên của Mathematical System Theory tại ETH
(Swiss Federal Institute of Technology), Zurich.

Ông cũng nhận nhiều giải thưởng như:




Huy chương danh dự của IEEE (1974)
Huy chương Centennial của IEEE (1984)
Giải thưởng Kyoto trong công nghệ cao của tổ chức Inamori, Nhật Bản (1985)
Giải thưởng Steele của Hội Toán học Mỹ (American Mathematical Society) (1987)
Giải thưởng Bellman (1997)

Ông cũng là viện sĩ của Viện Hàm lâm Khoa học Quốc gia (Mỹ), Viện Hàn lâm Kỹ thuật Quốc
gia (National Academy of Engineering) (Mỹ) và Viện Hàn lâm Khoa học và Nghệ thuật
(American Academy of Arts and Sciences) (Mỹ).

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

28

CHƢƠNG 2. BỘ LỌC KALMAN
Ông còn là viện sĩ của các viện hàm lâm ở các nước khác như Viện Hàn lâm Khoa học
Hungary, Pháp và Nga. Ông cũng đã nhận nhiều bằng tiến sĩ danh dự.[7]

2.2.3 Ứng dụng của bộ lọc Kalman
Bởi vì bộ lọc Kalman giải quyết một vấn đề cơ bản là lọc nhiễu và tối ưu cho các ước lượng
nên nó được ứng dụng rất rộng rãi.
Một số ứng dụng được liệt kê từ bài viết Kalman Filter trên Wikipedia [8]:












Lái tự động của máy bay (Autopilot)
Ước lượng trạng thái sạc của pin (Battery state of charge (SoC) estimation)
Giao diện tương tác với máy tính bằng não (Brain–computer interface)
Chaotic signals
Định vị chuyển động (Dynamic positioning)
Các ứng dụng trong kinh tế, đặc biệt là kinh tế vĩ mô, time series, và econometrics
Hệ thống dẫn đường quán tính (Inertial guidance system)
Theo dõi bằng radar (Radar tracker)
Hệ thống định vị vệ tinh (Satellite navigation systems)
Speech enhancement
Dự báo thời tiết (Weather forecasting)
Hệ thống định vị (Navigation Systems)
Mô hình hóa 3 chiều (3D-Modelling)

Ở Việt Nam có một số ứng dụng như:



Ứng dụng lọc Kalman trong phân tích biến dạng nhà cao tầng do bức xạ nhiệt mặt
trời.[9]
Cải thiện chất lượng truyền động không đồng bộ bằng cấu trúc tách kênh trực tiếp
sử dụng kalman filter để quan sát từ thông.[10]
Ứng dụng Kalman Filter cho dự báo nhiệt độ 2m từ sản phẩm mô hình HRM.[11]
Hệ thống dẫn đường quán tính INS/GPS.[12]

2.2.4 Ví dụ dẫn nhập
Chúng ta sẽ xem xét một ví dụ về ước lượng sau.
Giả sử ta có một vật thể chuyển động thẳng đều (vận tốc không đổi) theo phương x nào
đó. Ta cần xác định vị trí của vật sau thời gian t.
Các thông tin ta biết là:

Vận tốc của vật không đổi: v = 70 m/s.
Vị trí ban đầu của vật x(0) = 0

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

29

CHƢƠNG 2. BỘ LỌC KALMAN
Chúng ta cũng có một bộ phận định vị gắn trên vật thể cho chúng biết vị trí x(t) của vật thể
lúc t.
Vậy là chúng ta có 2 cách xác định vị trí vật:
Cách 1: Dùng phương trình động học để tính vị trí vật
Ta có vị trí của vật tại thời điểm t là x(t) = x(0) + v.t
Hay viết dưới dạng truy hồi là: 𝑥
1(0) = 0 𝑥
1(1) = 𝑥1(0) + v = v 𝑥
1(2) = 𝑥1(1) + v = 2v

(ký hiệu 𝑥1 có nghĩa là ước lượng vị trí cách 1)
Cách 2: Sử dụng bộ phận định vị gắn trên vật
Khi đó các vị trí đơn giản là giá trị do bộ phận này cung cấp: 𝑥
2(0) = z(0) 𝑥
2(1) = z(1) 𝑥
2(2) = z(2)

Trong đó z(k) là giá trị do bộ phận định vị cung cấp tại thời điểm k.
Đến đây ta thấy, nếu như 𝑥1(k) = 𝑥2(k), với mọi k, thì có vẻ như kết của tính toán và giá trị
đo được của bộ phận định vị là có thể tin tưởng. Tuy nhiên, bạn sẽ thất vọng khi biết rằng
đó chỉ là cảm giác của bạn, còn thực tế không phải vậy!
Bởi lẽ phép tính của bạn (trong những trường hợp phức tạp) lẫn giá trị cung cấp bởi bộ
phận định vị không có cơ sở nào để khẳng định là chính xác với thực tế. Cho dù 2 kết quả
này hoàn toàn trùng khớp thì cũng có thể chỉ là ngẫu nhiên.
Một trường hợp khác thường xảy ra hơn là khi 2 kết quả này không giống nhau. Vậy bạn sẽ
tin tưởng kết quả nào?
Câu hỏi này đưa đến một giải pháp thứ 3, đó là kết hợp cả 2 kết quả.
Cách 3: Tính toán kết quả bằng cách tổng hợp 2 phương pháp 𝑥
3(k) = ⍺. 𝑥1(k) + β. 𝑥2(k)

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

30

CHƢƠNG 2. BỘ LỌC KALMAN
Cách này nhìn có vẻ ổn. Vì có thể có trường hợp 𝑥1 chính xác hơn, có trường hợp 𝑥2 chính
xác hơn, nên sẽ là tốt nhất nếu tùy vào trường hợp mà ta chọn (hoặc kết hợp) kết quả một
cách thích đáng.
Tuy nhiên, đến đây lại nảy sinh 2 vấn đề mới:
1. ⍺ và β phải chọn ra sao để được kết quả tối ưu?
2. Và như đã nói, ⍺ và β có thể sẽ thay đổi (để tùy trường hợp mà kết hợp 2 ước
lượng cho hợp lý nhất), vậy thì đâu sẽ là căn cứ, tiêu chuẩn để ta cập nhật 2 hệ số
này?
Đến đây, bộ lọc Kalman xuất hiện. 2 vấn đề chúng ta vừa nêu chính là đối tượng giải quyết
của bộ lọc Kalman.

2.2.5 Mô hình tổng quát của ước lượng dùng bộ lọc Kalman
Sơ đồ khối sau sẽ mô tả mô hình tổng quát của một ước lượng dùng bộ lọc Kalman.
Giá trị tính toán
Mô hình hệ thống
Giá trị ước lượng
tối ưu 𝑋
Bộ lọc Kalman

Cảm biến
(bộ đo)

Giá trị đo

Chúng ta có thể ánh xạ các phần trong ví dụ ở mục 2.2.4 vào sơ đồ trên như sau:



Mô hình hệ thống: phương trình động học x(k) = x(k-1) + v.
Cảm biến: bộ định vị gắn trên vật.
Giá trị ước lượng tối ưu: 𝑥3.
Bộ lọc Kalman: “hộp đen” tính các hệ số ⍺ và β.

Một ước lượng thực sự sử dụng bộ lọc Kalman cũng bao gồm các phần như trên.
Như vậy đến đây chúng ta đã có đầy đủ các khái niệm cần thiết để bước vào xây dựng bộ
lọc Kalman (thực chất là tìm và giải các phương trình để tính toán các tham số cho ước
lượng tối ưu).

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

31

CHƢƠNG 2. BỘ LỌC KALMAN

2.3 Bộ lọc Kalman
2.3.1 Các ký hiệu sử dụng
Mục này liệt kê các ký hiệu dùng trong biểu diễn các phương trình quá trình xây dựng cũng
như kết quả của bộ lọc Kalman. Các ký hiệu này được sử dụng thống nhất trong báo cáo
này nhưng ở các sách và tài liệu khác có thể có hệ thống ký hiệu khác. Bạn có thể tham
khảo vấn đề ký hiệu này trong mục 1.3 ON THE NOTATION USED IN THIS BOOK của tài liệu
[14].
Ký hiệu

Ý nghĩa

H

Ma trận đo độ nhạy được dùng để xác định quan hệ tuyến tính của vector trạng
thái và vector đo.

K

Ma trận độ lợi Kalman

P

Ma trận hiệp phương sai của sai số ước lượng

Q

Ma trận hiệp phương sai của sai số hệ thống

R

Ma trận hiệp phương sai của sai số đo đạt

x

Vector trạng thái

z

Vector đo (measurement vector)

Ф

Ma trận chuyển trạng thái
Bảng 2.3-1 Ký hiệu chuẩn của bộ lọc Kalman

Ký hiệu

Ý nghĩa

x

Vector trạng thái

xk

Phần tử thứ k của chuỗi các trạng thái x1, x2, x3, …

x

Ước lượng của x

xk (−)

Tiên nghiệm của ước lượng xk

xk (+)

Hậu nghiệm của ước lượng x tại thời điểm tk

x

Đạo hàm của x theo thời gian t
Bảng 2.3-2 Các ký hiệu liên quan đến vector trạng thái

Ký hiệu
x

Tên
Vector trạng thái hệ thống

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

Kích thước (hàng x cột)
nx1

32

CHƢƠNG 2. BỘ LỌC KALMAN
w

Vector nhiễu hệ thống

rx1

u

Vector điều khiển

rx1

z

Vector giá trị đo đạt

lx1

v

Vector nhiễu đo đạt

lx1

Ф

Vector chuyển trạng thái

nxn

Q

Ma trận hiệp phương sai
nhiễu hệ thống

rxr

H

Ma trận hệ số quan hệ tuyến
tính

lxn

R

Ma trận hiệp phương sai
nhiễu đo đạt

lxl

Bảng 2.3-3 Ký hiệu và kích thước các ma trận

Tên
Trạng thái hệ thống
Giá trị đo

Biểu thức
xk = Ф xk-1 + wk-1
zk = H xk + vk
Bảng 2.3-4 Biểu thức của trạng thái và giá trị đo

2.3.2 Xây dựng bộ lọc Kalman11
Theo như mô hình của ước lượng dùng bộ lọc Kalman đã đề cập ở trên, trước tiên, mô
hình hệ thống sẽ cho ta một giá trị gọi là ước lượng tiên nghiệm (ước lượng chưa qua bộ
lọc Kalman). Nó được tính bằng phương trình:
xk (−) = Ф xk-1 (+) + wk-1
trong đó:

xk (−) : giá trị tiên nghiệm tại bước k
xk-1 (+): giá trị hậu nghiệm của bước k-1 (giá trị đã tối ưu của bước trước)

wk-1: nhiễu hệ thống tại bước k-1

11

Phần này là phần diễn dịch lại và giải thích chi tiết hơn nội dung từ mục 4.2 KALMAN FILTER
trong tài liệu [14] Mohinder S. Grewal and Angus P. Andrews, KALMAN FILTERING - Theory and
Practice Using MATLAB, third edition, John Wiley & Sons, 2008.
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

33

CHƢƠNG 2. BỘ LỌC KALMAN
Một chú ý quan trọng: Tất cả các nhiễu trong bộ lọc Kalman đều được giả định là tuân theo
phân phối chuẩn (Gauss) (xem 1.9, chương 1).
Sau đó, giá trị tiên nghiệm xk (−) sẽ “đi qua” bộ lọc Kalman để kết hợp với giá trị đo (zk) tạo
ra một ước lượng tối ưu.
Có thể tóm tắt quá trình làm việc của lọc Kalman như sau:
Tính tiên nghiệm (từ hậu nghiệm bước trước)  “Lọc”  Hậu nghiệm (ước lượng tối ưu)

Ta có phương trình quan hệ của ước lượng tiên nghiệm và hậu nghiệm:

trong đó:


xk (−) : giá trị tiên nghiệm
xk (+) : giá trị hậu nghiệm
K1𝑘 và K k : các ma trận chưa biết, K k là độ lợi của bộ lọc Kalman

Theo quy tắc trực giao, để sai số của ước lượng bình phương trung bình là nhỏ nhất
(MMSE) ta phải có:

Thay xk = Ф xk-1 + wk-1 và biểu thức của xk (+) vào phương trình thứ nhất ta có:

Tiếp tục thay zk = H xk + vk vào ta thu được:

Sử dụng các điều kiện sau:

(do vk và z là 2 biến ngẫu nhiên độc lập và vk có phân phối chuẩn với kz vọng bằng 0 nên ta
có E(v.z) = E(v) x E(z) = 0 x E(z) = 0)
Ta biến đổi phương trình trên:

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

34

CHƢƠNG 2. BỘ LỌC KALMAN

Như vậy ta có:

Đặt các sai số:

Sai số 𝑥k(+) và 𝑥k(-) là các sai số của ước lượng ứng với tiên nghiệm và hậu nghiệm. Sai số 𝑧
k là sai số của đo đạt.
Trừ 2 phương trình sau: 𝐸
𝑥𝑘 − 𝑥𝑘 + 𝑧𝑘𝑇 (−) = 0

(hai phương trình này có là vì ta muốn thỏa quy tắc trực giao)
ta thu được: 𝐸
𝑥𝑘 − 𝑥𝑘 + 𝑧𝑘𝑇 = 0
Thay xk, 𝑥k và 𝑧k vào phương trình trên ta có:

Lưu { là vì các biến ngẫu nhiên w, v có kz vọng bằng 0 và chúng độc lập với x, z nên ta có:

và thay K1𝑘 , zk và 𝑥k(-) vào ta được:

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

35

CHƢƠNG 2. BỘ LỌC KALMAN

Nhắc lại: ta có theo định nghĩa
Cov(XY) = E[( X-µx )( Y-µy )]
= E(XY) - µxµy
với µx, µy lần lượt là kz vọng của 2 biến ngẫu nhiên X và Y.
Vậy nếu X hoặc/và Y có kz vọng bằng 0 thì:
Cov(XY) = E(XY)
Từ tính chất trên, ta có ma trận hiệp phương sai của sai số của ước lượng tiên nghiệm là:
(thực chất P chính là sai số bình phương trung bình – MSE)

bởi vì 𝑥k(-) là biến ngẫu nhiên có kz vọng bằng 0.12
Khai triển phương trình phía trên và thế Pk vào ta thu được:

trong đó: Rk là ma trận hiệp phương sai của sai số nhiễu đo đạt (cũng thu được do kz vọng
của nhiễu đo đạt v bằng 0) 𝑅𝑘
= 𝐸 𝑣𝑘 𝑣𝑘𝑇
Như vậy ta thu được độ lợi của bộ lọc Kalman:

Tương tự, đối với hậu nghiệm của ước lượng ta cũng có ma trận hiệp phương sai của sai số
ước lượng hậu nghiệm:

Thay biểu thức của K1𝑘 tìm được ở trên

12

Chứng minh: do 𝑥 là ước lượng không chệch nên E[𝑥k(-)] = E[xk]

Ta có: E[𝑥k(-)] = E[𝑥k(-)-xk] = E[𝑥k(-)] – E[xk] = 0
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

36

CHƢƠNG 2. BỘ LỌC KALMAN
vào phương trình quan hệ của tiên nghiệm và hậu nghiệm:

ta thu được 𝑥𝑘
+ = 𝐼 − 𝐾𝑘 𝐻𝑘 𝑥𝑘 − + 𝐾𝑘 𝑧𝑘 , 𝑥𝑘
+ = 𝑥𝑘 − + 𝐾𝑘 𝑧𝑘 − 𝐻𝑘 𝑥𝑘 − .
Trừ 2 vế cho xk và thay zk = H xk + vk vào phương trình trên ta được :

Thế biểu thức vừa thu được vào Pk(+) và sử dụng:

ta được:

Phương trình ta vừa thu được gọi là dạng Joseph (Joseph form) của phương trình cập nhật
ma trận hiệp phương sai.
Tiếp tục khai triển phương trình này ta được:

Phương trình cuối cùng thường được dùng để cập nhật Pk(+) nhất.
Ma trận hiệp phương sai của sai số:
Ta có:

Trừ 2 vế của phương trình sau cho xk và thế xk = Ф xk-1 + wk-1 vào ta thu được:
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

37

CHƢƠNG 2. BỘ LỌC KALMAN

Thay biểu thức của sai số ước lượng tiên nghiệm 𝑥k(-) vừa thu được vào Pk(-) và sử dụng:

ta được:

Đây chính là biểu thức của ma trận hiệp phương sai của sai số của ước lượng tiên nghiệm.

2.3.3 Tóm tắt các phương trình của bộ lọc Kalman
Trong phần trên chúng ta đã xây dựng xong các phương trình của bộ lọc Kalman. Phần này
sẽ tóm tắt lại các phương trình đó cho việc tra cứu khi sử dụng.
Mô tả

Phương trình

Mô hình hệ thống

xk = Ф xk-1 + wk-1
wk ∼ N(0, Qk)

Mô hình đo

zk = H xk + vk
vk ∼ N(0, Rk)

Giá trị khởi tạo

E(x0)=𝑥0
E(x0 xT0 )=P0

Giả thiết độc lập

E(wk vTj )=0 với mọi k và j

Ước lượng trạng thái 𝑥𝑘

(−) = Φ𝑘−1 𝑥𝑘−1 (+)

Ma trận hiệp phương sai của sai số 𝑇 𝑃𝑘

(−) = Φ𝑘−1 𝑃𝑘−1 (+)Φ𝑘−1
+ 𝑄𝑘−1

Cập nhật trạng thái 𝑥𝑘

(+) = 𝑥𝑘 (−) + 𝐾𝑘 [𝑧𝑘 − 𝐻𝑘 𝑥𝑘 (−)]

Cập nhật ma trận hiệp phương sai của sai số 𝑃𝑘

(+) = [𝐼 − 𝐾𝑘 𝐻𝑘 ]𝑃𝑘 (−)

Ma trận độ lợi Kalman 𝐾𝑘

= 𝑃𝑘 (−)𝐻𝑇𝑘 𝐻𝑘 𝑃𝑘 (−)𝐻𝑇𝑘 + 𝑅𝑘

−1

Bảng 2.3-5 Tóm tắt các phương trình của bộ lọc Kalman

Và quá trình làm việc của bộ lọc Kalman có thể tóm tắt trong hình sau:
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

38

CHƢƠNG 2. BỘ LỌC KALMAN

Kết hợp giá trị đo tạo ước lượng tối ưu
Tính trạng thái từ mô hình hệ thống

(3) Tính độ lợi Kalman:

(1) Cập nhật trạng thái: 𝐾𝑘

= 𝑃𝑘 (−)𝐻𝑇𝑘 𝐻𝑘 𝑃𝑘 (−)𝐻𝑇𝑘 + 𝑅𝑘 𝑥𝑘

(−) = Φ𝑘−1 𝑥𝑘−1 (+) + Buk-1 (điều khiển)

(4) Kết hợp giá trị đo tạo ước lượng tối ưu:

(2) Tính ma trận hiệp phương sai của sai số: 𝑃𝑘
(−) =

Φ𝑘−1 𝑃𝑘−1 (+)Φ𝑇𝑘−1

−1 𝑥𝑘

(+) = 𝑥𝑘 (−) + 𝐾𝑘 [𝑧𝑘 − 𝐻𝑘 𝑥𝑘 (−)]

+ 𝑄𝑘−1

(5) Cập nhật ma trận hiệp phương sai sai số: 𝑃𝑘
(+) = [𝐼 − 𝐾𝑘 𝐻𝑘 ]𝑃𝑘 (−)

Khởi tạo 𝑥𝑘−1 (+) và 𝑃𝑘−1 (+)
Hình 2.3-1 Tóm tắt quá trình làm việc của lọc Kalman

2.4 Bộ lọc Kalman trong OpenCV
Để thực hiện lọc Kalman, OpenCV cung cấp cho chúng ta các hàm sau:

Hàm tạo và hủy cấu trúc CvKalman:

cvCreateKalman(
int
nDynamParams,
int
nMeasureParams,
int
nControlParams
);

//Số chiều vector trạng thái
//Số chiều vector đo
//Số chiều vector điều khiển

cvReleaseKalman(
CvKalman** kalman
);

Cấu trúc CvKalman chứa các thông tin dùng trong bộ lọc Kalman: vector trạng
thái, ma trận độ lợi (Kalman gain) và các ma trận liên quan.

typedef struct CvKalman {
int MP;
int DP;
int CP;
CvMat* state_pre;

//
//
//
//
//
//
//

measurement vector dimensions
state vector dimensions
control vector dimensions
predicted state:
x_k = F x_k-1 + B u_k
corrected state:
x_k = x_k’ + K_k (z_k’- H

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

39

CvMat* state_post;
x_k’)

CHƢƠNG 2. BỘ LỌC KALMAN
CvMat* transition_matrix;
CvMat* control_matrix;
control)
CvMat* measurement_matrix;
CvMat* process_noise_cov;
CvMat* measurement_noise_cov;
CvMat* error_cov_pre;
CvMat* gain;
+ R)^-1
CvMat* error_cov_post;
CvMat* temp1;
CvMat* temp2;
CvMat* temp3;
CvMat* temp4;
CvMat* temp5;
} CvKalman;

// state transition matrix
//
F
// control matrix
//
B
//
(not used if there is no
//
//
//
//
//
//
//
//
//
//

measurement matrix
H
process noise covariance
Q
measurement noise covariance
R
prior error covariance:
(P_k’=F P_k-1 Ft) + Q
Kalman gain matrix:
K_k = P_k’ H^T (H P_k’ H^T

// posteriori error covariance
//
P_k = (I - K_k H) P_k’
// temporary matrices

Hàm tiên đoán trạng thái, kết quả của hàm này là tiên nghiệm state_pre.

cvKalmanPredict(
CvKalman* kalman,
const
CvMat* control = NULL
);

Hàm tính toán tối ưu cho ước lượng của trạng thái (kết hợp giá trị của phép
đo), kết quả của hàm này là hậu nghiệm stat_post.

cvKalmanCorrect(
CvKalman* kalman,
CvMat*
measured
);

Sau khi thực hiện 2 hàm trên, chúng ta đã thực hiện xong một chu kz của bộ ước lượng
dùng bộ lọc Kalman.
Tóm tắt làm việc của bộ lọc Kalman trong OpenCV:
1. Khởi tạo các tham số và ma trận cần thiết (trong cấu trúc CvKalman):





MP: kích cỡ vector đo
DP: kích cỡ vector đo
CD: kích cỡ vector điều khiển
transition_matrix (F): ma trận chuyển trạng thái
control_matrix (B): ma trận điều khiển (nếu có)
measurement_matrix (H): ma trận đo

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

40

CHƢƠNG 2. BỘ LỌC KALMAN

process_noise_cov (Q): ma trận hiệp phƣơng sai của nhiễu
hệ thống
measurement_noise_cov (R): ma trận hiệp phƣơng sai của
nhiễu đo

đó là các tham số bất biến. Ngoài ra ta còn phải khởi tạo trạng thái ban đầu cho hệ thống:

state_post (x_k+): hậu nghiệm (coi nhƣ trạng thái đầu tiên),
có thể khởi tạo ngẫu nhiên.
error_cov_post (P_k+): ma trận hiệp phƣơng sai của sai số hậu
nghiệm (coi nhƣ sai số của trạng thái đầu tiên)

2. Sau khi các thông số trên đã được khởi tạo ta gọi hàm
x_k- = cvKalmanPredict( cautrucCvKalman, vectordieukhien )

để lấy về trạng thái tiên nghiệm. Tham số vectordieukhien bằng 0 nếu không có điều
khiển.
Khi gọi cvKalmanPredict, trạng thái tiên nghiệm sẽ được tính bằng cách lấy hậu nghiệm
của bước trước nhân với ma trận chuyển trạng thái cộng với ma trận điều khiển (nếu có):
x_k- = F* x_k-1- + B*vectordieukhien
3. Sau đó ta lấy giá trị đo z_k và gọi tiếp hàm cvKalmanCorrect để lấy hậu nghiệm:
x_k+ = cvKalmanCorrect(cautrucCvKalman, z_k)

Khi gọi hàm cvKalmanCorrect, các thông số: độ lợi K_k, trạng thái hậu nghiệm x_k+ và
ma trận hiệp phương sai của sai số hậu nghiệm P_k+ và sẽ được tính.
Như vậy, sử dụng bộ lọc Kalman trong OpenCV có thể tóm tắt trong lược đồ sau:
Khởi tạo  Lặp
[ Gọi cvKalmanPredict  Cung cấp giá trị đo  Gọi cvKalmanCorrect ]

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

41

3 Chương

3

Phát Hiện Vật Thể
Dựa Trên Màu Sắc
Các nội dung chính:



Hệ màu HSV
Các moment của ảnh
Thuật toán phát hiện vật thể dựa trên
màu sắc
Cài đặt thuật toán với OpenCV

42

CHƢƠNG 3. PHÁT HIỆN VẬT THỂ DỰA TRÊN MÀU SẮC

3.1 Hệ màu HSV
3.1.1 Định nghĩa
Có nhiều hệ màu khác nhau dùng để biểu diễn màu sắc trong máy tính. Trong số đó thông
dụng là hệ màu RGB (trong một số màn hình LCD thì dùng BGR, đây chỉ là sự thay đổi vị trí
3 màu cơ bản).
Trong mỹ thuật người ta thường dùng màu HSV (hay còn có tên HSB) hoặc HSL vì các hệ
màu này trực quan, dễ cảm nhận. Trong mục này ta sẽ trình bày về hệ màu HSV.
Hệ màu HSV được Alvey Ray Smith đưa ra năm 1978.

Hình 3.1-1 Hình nón ngược biễu diễn hệ màu HSV

Hình tròn bên dưới đây là một mặt cắt ngang biểu diễn H và S.

Hình 3.1-2 Hình tròn biếu diễn các sắc màu (H: 0-360) và độ bão hòa (S: 0-1).
Màu đỏ: H=0, màu xanh lá: H=120, màu xanh dương: H=240

Hệ màu HSV có 3 tham số:

H (hue) (0-360): sắc màu. Ví dụ màu đỏ có H = 0, màu vàng có H = 60.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

43

CHƢƠNG 3. PHÁT HIỆN VẬT THỂ DỰA TRÊN MÀU SẮC

S (saturation) (0-1): độ bão hòa. Chỉ ra mức độ “thuần” của màu, màu có S càng lớn
thì càng “rõ”, ngược lại thì càng “mờ”. Tại S=0 sắc màu không còn giá trị, mọi H đều
chỉ cho màu xám hoặc trắng.
V (value, có nơi ghi B: Brightness) (0-1): độ phát sáng. Đó là cường độ ánh sáng mà
tự đối tượng phát ra chứ không phải do phản xạ từ các nguồn sáng khác.

Hệ màu HSV này được biểu diễn bởi một hình nón ngược (Hình 3.1-1).
Trong đó H (màu sắc) được biểu diễn bằng góc quay quanh trục đứng của hình nón, vì vậy
H có giá trị 0-360o, với:


Màu đỏ có H = 0o
Màu xanh lá có H = 120o
Màu xanh dương có H = 240o

S là khoảng cách từ trục hình nón tới điểm xét màu. S có giá trị thực nằm trong đoạn 0-1.
Tại trục: S = 0, tại vành ngoài cùng: S = 1. Ta có thể quan sát thấy màu của S càng “rõ” khi
càng nằm gần vành (S>0). Với S = 0 thì H không còn { nghĩa, như trong hình, tại trục của
hình nón chỉ có màu xám và trắng.
Độ phát sáng V (hay B) là khoảng cách từ đỉnh dưới của hình nón (vì hình nón bị lật ngược)
tới mặt cắt ngang hình nón chứa điểm xét màu. Tại đỉnh (bên dưới) của hình nón, V có giá
trị là 0, tại đó là màu đen (không có ánh sáng). V = 1 tại tâm của mặt đáy phía trên, tại đó là
màu trắng (H: không xác định, S=0, V= 1).
Một tính chất quan trọng của hệ màu HSV là các màu được đặc trưng bằng sắc độ (H). Tức
là một vật thể có một màu nhất định thì H của nó thay đổi rất ít trong các độ sáng khác
nhau của môi trường. Nghĩa là, ví dụ, một vật thể có màu vàng với H = 32. 3 thì khi môi
trường thay đổi độ sáng, chỉ có giá trị S và V của nó (màu của vật thể) là thay đổi, còn H chỉ
dao động trong khoảng 32.3 ± 6. Đây là tính chất khiến ta chọn HSV để làm hệ màu cho
ảnh muốn phân ngưỡng (mục 3.3).

3.1.2 Chuyển từ màu RGB sang HSV
Như mục trên vừa trình bày, trong lý thuyết của hệ màu HSV thì:


H: Sắc độ màu [0-360] với màu đỏ tại điểm 0
S: Độ bão hòa [0-1]
V: Giá trị cường độ sáng [0-1]

Nhưng trong OpenCV, HSV được lưu giống như RGB, tức 1 byte cho một giá trị H, S và V,
nên khoảng có giá trị 0-255.
Bởi vì H có giá trị lớn hơn 255 nên nó được lưu là H/2, ví dụ: H = 240 (màu xang dương)
thì OpenCV lưu H = 240/2 = 120. Còn S và V thì được giãn thành 0-255 (số nguyên) tương

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

44

CHƢƠNG 3. PHÁT HIỆN VẬT THỂ DỰA TRÊN MÀU SẮC
ứng cho khoảng 0-1 (số thực). Đây là một lưu { quan trọng để biểu diễn màu HSV trong
OpenCV.
Thuật toán Chuyển từ màu RGB sang HSV:
(Thuật toán này tính toán trên lý thuyết. Sau khi có được giá trị trên lý thuyết (Hl, Sl, Vl)
(với Hl: 0-360, Sl: 0-1, Vl: 0-1) ta chuyển về giá trị được lưu bởi OpenCV: H=Hl/2, S = Sl*255,
V = Vl*255)
Đặt:
M = max (R, G, B)
m = min (R, G, B)
C=M–m

Giá trị H: 𝑘𝑕
ô𝑛𝑔 𝑥á𝑐 đị𝑛𝑕, 𝐺
−𝐵

H = 60 * 𝐶 𝐵

−𝑅 𝐶 𝑅

−𝐺 𝐶

 𝑚𝑜𝑑

6, 𝑛

ế𝑢 𝑀 = 𝑅

+ 2, 𝑛

ế𝑢 𝑀 = 𝐺

+ 4, 𝑛

ế𝑢 𝑀 = 𝐵

Giá trị S =

0, 𝐶 𝑀

 𝑛

ế𝑢 𝐶 = 0

, 𝑛

ế𝑢 𝐶 = 0 𝑛𝑔
ượ𝑐 𝑙ạ𝑖

Giá trị V = M/255

Thuật toán hoàn thành.
Chú ý: mod là phép chia lấy dư trên SỐ THỰC (như hàm MOD trong MS Excel hoặc mod
trên http://www.wolframalpha.com).
Nói thêm: vậy trong đề tài của chúng ta, để lấy được khoảng ngưỡng tối ưu ta làm như
sau:


Chụp một hình chứa vật thể.
Pick một màu ra (dùng MS Paint hoặc phần mềm rgbhsv)
Tính H, S, V theo thuật toán trên (nhớ đổi sang dạng của OpenCV sau khi tính (H: 0180))

Chú ý:

Nhất thiết phải tính H theo thuật toán trên, chứ H từ các chương trình hoặc code
khác là không đúng.
H thì thường biến thiên rất ít đối với một màu, ta chỉ cần +, - 3 vào H đã tính là có
khoảng tối ưu.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

45

CHƢƠNG 3. PHÁT HIỆN VẬT THỂ DỰA TRÊN MÀU SẮC

Còn S, V thì chương trình rgbhsv đã tính đúng, có thể dùng để tra khoảng biến thiên
của 2 đại lượng này cho thuận tiện.

Ví dụ: ta có màu với giá trị RGB = (195, 125, 43) (màu vàng hơi tối nâu).
Ta tính:


M = 195 (R)
m = 43
C = M-m = 152

Giá trị H:


(G-B)/C = 0.5395
0.5395 mod 6 = 0.5395
0.5395*60 = 32.37o (giá trị lý thuyết)
 Giá trị lưu trong OpenCV là: H = 32.37 / 2 = 16

Giá trị S:

C/M = 0.7795 (giá trị lý thuyết)
 Giá trị lưu trong OpenCV là: S = 0.7795*255 = 198

Giá trị V:

M/255 = 0.7647
 Giá trị lưu trong OpenCV là: V = 0.7647*255 = 195

3.2 Moment của ảnh (image moment)
Moment 2 chiều của bậc (p+q) của một ảnh f(x, y) có kích thước MxN được định nghĩa là:
Mpq = 𝑀

−1 𝑥
=0 𝑁

−1 𝑝 𝑞 𝑦
=0 𝑥 𝑦 𝑓(𝑥, 𝑦)

trong đó p=0, 1, 2,… và q=0, 1, 2,… là số nguyên.
Một số tính chất ảnh đơn giản được đặc trưng bởi moment ảnh là:

Diện tích (cho ảnh nhị phân13) hoặc tổng mức xám (đối với ảnh xám14): M00.
Tâm ảnh: {xc, yc} = {M10/ M00, M01/ M00}

2 tính chất trên của moment sẽ được dùng trong phần phát hiện đối tượng theo màu sắc.

3.3 Thuật toán phát hiện đối tƣợng theo màu sắc
Từ những kiến thức trình bày trong các phần trên, ta có thể xây dựng một thuật toán phát
hiện đối tượng theo màu sắc đơn giản như sau:
13
14

Ảnh nhị phân: là ảnh có màu trắng (f = 255) và đen (f = 0).
Ảnh xám: ảnh có mức xám f=0..255.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

46

CHƢƠNG 3. PHÁT HIỆN VẬT THỂ DỰA TRÊN MÀU SẮC
(1) Chuyển từ ảnh RGB (hoặc các hệ màu khác) về HSV.
(2) Thực hiện phân ngưỡng ảnh: tạo ảnh nhị phân từ ảnh HSV với ngưỡng trên và dưới
thích hợp (tham khảo cách lấy ngưỡng trong mục 3.1.2). Các điểm ảnh nằm trong
khoảng ngưỡng trên và ngưỡng dưới sẽ có giá trị 1 (trắng), còn các điểm còn lại sẽ
có giá trị 0 (đen).
(3) Làm mịn ảnh phân ngưỡng để loại bỏ các điểm nhiễu (có thể dùng lọc trung vị).
(4) Tính toán các moment M00, M10 và M01 để lấy tâm của vật thể (xc, yc) = (M10/ M00,
M01/ M00).
Thuật toán hoàn thành.
Có một số điểm cần lưu { trong thuật toán trên:

Hệ màu được chọn ở bước 1 phải là HSV. Có một hệ màu tương tự được dùng
trong nhiều hệ thống là HSL. Mặc dù 2 hệ màu này dựa trên cùng một { tưởng về
Sắc màu, Độ bão hòa và Độ sáng, nhưng chúng có những khác biệt khiến cho hệ
màu HSL không phải là ứng viên tốt nhất cho phân ngưỡng ảnh theo màu (sắc độ).
Khi lấy các giá trị ngưỡng, nếu tìm được một ngưỡng (một màu) có trong hệ RGB ta
phải chuyển nó về hệ HSV theo theo thuật toán trình bày ở mục 3.1.2. Có nhiều
chương trình (và cả code) chuyển từ màu RGB sang HSV nhưng chúng không chính
xác và điều này dẫn tới thất bại trong việc phân ngưỡng ảnh. Ngoài ra ta cũng phải
lưu ý cách biểu diễn màu HSV trong OpenCV là HSV = (0-180, 0-255, 0-255) để đưa
giá trị vào chương trình cho đúng.
Điểm lưu { sau cùng là về bước (3). Trong thực tế cài đặt, nếu ta tiến hành làm mịn
ảnh (khử nhiễu) sẽ ảnh hưởng rất nhiều tới hiệu năng của chương trình (chương
trình sẽ chậm đi rõ rệt). Bên cạnh đó việc này cũng không cần thiết lắm ở chương
trình của chúng ta bởi vì màu của vật thể mà ta chọn khá khác biệt với môi trường,
nên nếu ta chọn ngưỡng tốt thì hầu như ảnh sau phân ngưỡng sẽ không có nhiễu15.
Cho nên giải pháp ở đây (cho phần cài đặt) là bỏ qua bước 3. Thay vào đó, đơn
giản ta chỉ dùng một câu lệnh điều kiện:
nếu (M00 < diện_tích_min) thì quay lại bƣớc (1)

Câu lệnh trên có nghĩa là nếu diện tích của vật thể (M00) nhỏ hơn một giá trị nào đó
(diện_tích_min) thì ta bỏ qua việc tính tọa độ tâm, xem như đó là một nhiễu chứ không
phải vật thể (vì vật thể của ta luôn có kích thước lớn hơn diện_tích_min này).

3.4 Cài đặt thuật toán phát hiện vật thể dựa theo màu sắc với
OpenCV
Trong OpenCV có hỗ trợ chúng ta các hàm dùng cho thuật toán phát hiện vật thể theo màu
sắc vừa trình bày.
15

Nhiễu ở đây là các điểm ảnh không thuộc về vật thể ta quan tâm mà vẫn lọt được vào vùng phân ngưỡng.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

47

CHƢƠNG 3. PHÁT HIỆN VẬT THỂ DỰA TRÊN MÀU SẮC
Hàm cvCvtColor
void cvCvtColor(
const CvArr* src,
CvArr*
dst,
int
code
);

Hàm này dùng để chuyển ảnh từ một hệ màu này sang hệ màu khác. Trong đó src là ảnh
nguồn, dst là ảnh đầu ra, và code là mã chuyển. Một số code thường dùng:




CV_BGR2RGB: chuyển từ BGR sang RGB
CV_RGB2BGR: chuyển từ RGB sang BGR
CV_RGB2RGBA: thêm tham số Alpha cho hệ màu RGB
CV_BGR2BGRA: thêm tham số Alpha cho hệ màu BGR
CV_BGR2HSV: chuyển từ BGR sang HSV (ta dùng mã này trong chương trình)

Hàm cvInRangeS
void cvInRangeS(
const CvArr*
CvScalar
CvScalar
CvArr*
);

src,
lower,
upper,
dst

Hàm này tạo ra ảnh phân ngưỡng. Trong đó, src là ảnh nguồn và dst là ảnh đầu ra. lower
và upper là 2 ngưỡng của ta, nó có dạng là một 3 giá trị (H, S, V).
Hàm cvMoments
void cvMoments(
const CvArr* image,
CvMoments*
moments,
int
isBinary = 0
);

Hàm này thực hiện tính toán các moment của ảnh, trong đó image là ảnh cần tính moment
và moments là một biến cấu trúc chứa các moment của ảnh.
typedef struct CvMoments {
// spatial moments
double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
// central moments
double mu20, mu11, mu02, mu30, mu21, mu12, mu03;
// m00 != 0 ? 1/sqrt(m00) : 0
double inv_sqrt_m00;
} CvMoments;

Bằng việc sử dụng các hàm trên chúng ta có thể dễ dàng cài đặt thuật toán phát hiện vật
thể dựa trên màu. Code cụ thể cho phần này sẽ được trình bày trong chương 4.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

48

4 Chương

4

Thiết Kế Và Cài Đặt
Chương Trình Phát Hiện Di Động
Các nội dung chính:

Thiết kế chương trình: Mô hình hệ
thống và Bộ đo.
Cài đặt: Hoạt động của chương trình
và Các đoạn mã quan trọng.

49

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG

4.1 Thiết kế
4.1.1 Mô hình hệ thống
Như đã trình bày trong chương 2, các ước lượng sử dụng bộ lọc Kalman phải gồm 2 phần:
Mô hình hệ thống (tính toán giá trị ước lượng cho trạng thái hệ thống) và Cảm biến (lấy giá
trị đo thực tế của trạng thái). Trong mục này chúng sẽ trình bày về mô hình của hệ thống.
Mục đích của chúng ta là xây dựng một mô hình theo dõi vật thể chuyển động, như vậy
chúng ta có thể mô hình hệ thống như sau:
4.1.1.1 Vector trạng thái

Vector trạng thái là một vector cột chứa 4 thành phần: 𝑥 𝑦

xk = 𝑣 𝑥 𝑣𝑦

Trong đó x, y là tọa độ của vật thể, vx, vy là vận tốc theo phương x và y. Ở đây chúng ta xem
vật thể có một chuyển động với vận tốc không đổi nên ta có ma trận chuyển trạng thái như
sau:
1
0
Ф=
0
0

0
1
0
0

1
0
1
0

0
1
0
1

Nếu lấy ma trận chuyển trạng thái nhân với vector trạng thái ta sẽ có trạng thái ở bước
sau:
1
0
xk+1 = Ф xk =
0
0

0
1
0
0

1
0
1
0

0
1
0
1 𝑥 𝑥

+ 𝑣𝑥 𝑦 𝑦

+ 𝑣𝑦 𝑣𝑥
= 𝑣𝑥 𝑣𝑦 𝑣𝑦

Tức là ta có xk+1 = xk + vx và yk+1 = yk + vy.
4.1.1.2 Nhiễu hệ thống

Bởi vì vector trạng thái có kích thước 4x1 nên vector nhiễu hệ thống wk cũng phải cùng kích
thước 4x1. Do đó ma trận hiệp phương sai của nhiễu hệ thống Q là một ma trận 4x4:
10−3
Q= 0
0
0

0
10−3
0
0

0
0
10−3
0

0
0
0
10−3

Nó là một ma trận chỉ có các phần tử trên đường chéo chính (chỉ số hàng = chỉ số cột) khác
không, bởi vì ta giả thiết rằng nhiễu của các giá trị khác nhau là độc lập thống kê. Ví dụ
nhiễu của x và y là độc lập thống kê nên Cov(x, y) = 0. Đối với các giá trị trên đường chéo
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

50

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
chính, đó là phương sai của biến ngẫu nhiên đó, ví dụ: phần tử 0, 016 chính là Var(X). Các
giá trị này thể hiện độ lớn của khoảng giá trị của nhiễu (hay nói cách khác chính là độ lớn
của nhiễu). Như ta đã biết, bộ lọc Kalman giả định các nhiễu có phân phối chuẩn với kz
vọng bằng 0 (hàm mật độ đối xứng qua trục Oy), vì vậy, nếu phương sai (hay độ lệch
chuẩn) càng lớn thì các giá trị x lớn sẽ có xác suất cao hơn. Ngược lại, nếu phương sai càng
nhỏ thì các giá trị càng tập trung quanh giá trị kz vọng (ở đây là 0), các điểm x có giá trị lớn
sẽ có xác suất gần bằng 0.
Như vậy, tóm lại, nếu ta muốn (hay nghĩ rằng) nhiễu có giá trị lớn thì cho phương sai (các
giá trị trên đường chéo) lớn và ngược lại.

Biểu đồ 4.1-1 Một số phân phối Gauss,
với phương sai σ2 càng lớn thì các giá trị x có giá trị lớn (xa kỳ vọng) sẽ có xác suất cao hơn

4.1.1.3 Vector đo

Mặc dù vector trạng thái có 4 thành phần, nhưng các giá trị ta ước đoán chỉ có 2, đó là tọa
độ x và y. Vì vậy vector đo zk của chúng ta cũng chỉ có 2 thành phần x, y: 𝑥

zk = 𝑦
Bởi vì vector trạng thái có kích thước 4x1, vector đo có kích thước 2x1 nên ma trận đo H
(thể hiện quan hệ tuyến tính giữa x và z) sẽ có kích thước 2x4: (2x1) = (2x4)(4x1)

16

Chỉ số hàng và cột trong OpenCV bắt đầu từ 0 (như mảng trong C++).

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

51

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
H=

1
0

0 0
1 0

0
0

Ma trận H trên thể hiện đúng quan hệ của x và z, bởi vì x và z đều là các tọa độ: 𝑥 𝑥

1 0 0 0 𝑦
zk = Hxk =
= 𝑦 𝑣

0 1 0 0 𝑥 𝑣𝑦

Nói thêm về ma trận đo: Ma trận đo là ma trận thể hiện quan hệ tuyến tính giữa trạng thái
và giá trị đo. Xem lại Ví dụ dẫn nhập mục 2.2.4, chương 2, ta có bộ phận định vị trả về tọa
độ nên giá trị đo có quan hệ với trạng thái quan tâm x - tọa độ của vật thể, là:
z = a.x, a là hệ số tuyến tính (mà ở đây là ma trận H)
Trong trường hợp khác, nếu ta không có bộ phận định vị trả về tọa độ mà có đồng hồ vận
tốc trả về vận tốc, thì khi đó vector đo z là vận tốc và dĩ nhiên nó không bằng x. Giữa z và x
khi đó sẽ có một hệ số tuyến tính a khác. Chằng hạn trong chuyển động đều thì:
z = (1/t) * x, a = (1/t), t là thời gian tính từ lúc x = 0.
Như vậy, ta lại có thêm một lưu { nữa, hệ số a (hay ở đây là ma trận H) có thể thay đổi
theo thời gian.Tuy nhiên trong trường hợp của chúng ta thì nó phải là không đổi.
4.1.1.4 Nhiễu đo

Bởi vì vector đo có kích thước 2x1 nên vector nhiễu đo wk cũng có kích thước là 2x1, do đó
ma trận hiệp phương sai của nhiễu đo R sẽ là ma trận có kích thước 2x2.
−4
R = 10
0

0
10−4

Như trong mục 4.1.2 đã nói, các giá trị không nằm trên trên đường chéo sẽ bằng 0 bởi vì
nhiễu của các thành phần khác nhau là độc lập nhau.
Các giá trị trên đường chéo chính càng lớn thì nhiễu có thể càng lớn. Ở đây ta cho nhiễu
càng nhỏ chứng tỏ ta càng tin tưởng phép đo (nhiễu ở đây có thể coi là sai số của phép
đo).

4.1.2 Bộ đo
Bộ đo cho ra giá trị của vector đo z ở đây chính là hàm phát hiện vật thể dựa trên màu sắc
viết theo thuật toán trình bày trong chương 3. Đầu ra của hàm này là tọa đô tâm của vật
thể quan tâm.
Ngoài ra còn có 2 giá trị cần khởi tạo đó là:

Hậu nghiệm của bước 0: ta khởi tạo với giá trị ngẫu nhiên.
Ma trận hiệp phương sai sai số hậu nghiệm bước 0: khởi tạo là ma trận đơn vị.

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

52

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG

4.2 Cài đặt
Chương trình viết cho đồ án này sử dụng thư viện OpenCV 2.1 (xem cách cài đặt và thiết
lập trong phần Phụ lục) với ngôn ngữ lập trình C++, CLR Windows Forms Application
project, IDE Visual Studio 2008.

4.2.1 Hoạt động của chương trình
Chương trình có 3 form chính: Cửa sổ điều khiển, Camera và Khung nhìn.

Cửa sổ điều khiển: form này thể hiện các chức năng của chương trình:
 Theo dõi (mặc định): theo dõi vị trí của vật thể có màu quan tâm (vàng và
hồng).
 Vẽ: vẽ các đường theo di chuyển của vật thể.
 Điều khiển: di chuyển, zoom một ảnh theo chuyển động và sự xuất hiện của
các vật thể.
 Thoát: dừng và thoát chương trình.
 Giới thiệu: hiện cửa sổ thông tin về chương trình.

Hình 4.2-1 Cửa sổ điều khiển

Camera: là cửa sổ ghi hình, nó hiện hình thu từ camera cũng như kết quả của chức
năng vẽ và theo dõi.

Hình 4.2-2 Cửa sổ camera hiện kết quả của chức năng theo dõi

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

53

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG

Hình 4.2-3 Cửa sổ camera hiện kết quả của chức năng vẽ

Khung nhìn: nơi hiển thị kết quả của chức năng vẽ và điều khiển ảnh.

Hình 4.2-4 Ảnh kết quả của thao tác vẽ qua camera trên Khung nhìn

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

54

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG

Hình 4.2-5 Zoom ảnh bằng cách điều khiển các vật thể

Hình 4.2-6 Kết quả của việc zoom ảnh trong Khung nhìn

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

55

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG

4.2.2 Các đoạn mã chính
Phần này sẽ ghi lại code và giải thích kèm theo của một số hàm quan trọng.
4.2.2.1 Hàm StartCamera_MotionTracking

Hàm này sẽ lấy từng frame ảnh và gọi các hàm khác xử l{, sau đó nó thể hiện kết quả.
public: void StartCamera_MotionTracking()
{
/*
Ta sẽ tiến hành detect vật thể dựa trên màu (color
based tracking)
Sau đó dùng bộ lọc Kalman để tạo ra kết quả tối ƣu
theo Giá trị đo, mô hình hệ thống và nhiễu
*/
static CvScalar mauVang =
static CvScalar mauHong =

CV_RGB(255,255,0);
CV_RGB(255,0,225);

//Khởi tạo capture cho camera
CvCapture* capture;
capture = cvCreateCameraCapture(0);
//Nếu không có camera thì thoát chƣơng trình
assert( capture != NULL );
//Lấy từng frame và xử lý
//Tạo ảnh chứa đƣờng vẽ quỹ đạo của vật thể (từ
việc bắt màu, chƣa lọc Kalman)
IplImage* imgScribbleYellow = NULL;
IplImage* imgScribblePink = NULL;
//ảnh chứa 2 quỹ đạo đã vẽ
IplImage* imgYellowAndPink = NULL;
//tạo ảnh chứa frame lấy từ camera
IplImage* frame = NULL;
//lấy ra một frame từ camera
frame = cvQueryFrame( capture );
if( !frame ) return;
//và khởi tạo các ảnh cùng kích thƣớc với frame
imgScribbleYellow =
cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
imgScribblePink = cvCreateImage(cvGetSize(frame),
IPL_DEPTH_8U, 3);
imgKalmanYellow = cvCreateImage(cvGetSize(frame),
IPL_DEPTH_8U, 3);
imgKalmanPink = cvCreateImage(cvGetSize(frame),
IPL_DEPTH_8U, 3);
imgYellowAndPink = cvCreateImage(cvGetSize(frame),
IPL_DEPTH_8U, 3);
//Khởi tạo tất cả phần tử về 0
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

56

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
cvZero(imgScribbleYellow);
cvZero(imgScribblePink);
cvZero(imgKalmanYellow);
cvZero(imgKalmanPink);
cvZero(imgYellowAndPink);
//Khai báo ảnh phân ngƣỡng màu vàng và màu hồng
IplImage* imgYellowThresh = NULL;
IplImage* imgPinkThresh = NULL;
//Khai
static
static
static
static

báo
int
int
int
int

các biến chứa vị trí của vật thể
posXYellow, XYellow_Kalman;
posYYellow, YYellow_Kalman;
posXPink, XPink_Kalman;
posYPink, YPink_Kalman;

//và vị trí trƣớc đó (trong frame trƣớc)
int lastXYellow, lastYYellow, lastXPink,lastYPink;
int XYellow_Kalman_last, YYellow_Kalman_last;
int XPink_Kalman_last, YPink_Kalman_last;
//Các ngƣỡng màu cần thiết (hệ màu HSV)
//TỐT NHẤT MÀU VÀNG:
//MÀU VÀNG: H = 17.4
//MÀU HỒNG: H = 168.5
//New: ánh sáng nhiều (1/1/2011)
//MÀU VÀNG: H = 12.1
//MÀU HỒNG: H = 166.6
//Tối ƣu cũ
//CvScalar yellowLower =cvScalar(14, 150, 130),
yellowUpper=cvScalar(20, 250, 240);
//CvScalar pinkLower =cvScalar(166, 150, 150),
pinkUpper=cvScalar(171, 255, 235);
//Tối ƣu mới:
//CHÚ Ý: KHÔNG GIẢM H THẤP QUÁ (Vàng: ko dƣới 14).
//và KHÔNG MỞ KHOẢNG S,V RỘNG QUÁ, vì sẽ trùng màu
da và các vật khác
//TỐT NHẤT MÀU VÀNG:
CvScalar yellowLower =cvScalar(11, 130, 150),
yellowUpper=cvScalar(20, 240, 255);
//TỐT NHẤT MÀU HỒNG:
CvScalar pinkLower =cvScalar(165, 150, 150),
pinkUpper=cvScalar(171, 255, 250);
//ngƣỡng S và V nhƣ sau (rộng quá) ko tốt bằng.
(xem phiên bản 0.4)
//Thử với giá trị scale to 255 (chứ không chia 2)
: KHÔNG chính xác. (xem phiên bản 0.4)
//=>(QUAN TRỌNG) Kết luận: H: tính bằng mod và
chia 2 là chính xác (nhƣ wiki)
//
S, V: lấy
nhƣ bên ngoài dùng chƣơng trình RGB to HSV (chính xác nhất)
//Màu XANH DUONG (test)
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

57

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
//CvScalar pinkLower =cvScalar(100, 100,50),
pinkUpper=cvScalar(140, 240, 150);
//tâm vật thể
CvPoint yellowCenter , pinkCenter;
//biến bool chỉ định có giá trị mới hay ko (có
phát hiện vật thể trong frame mới ko)
bool
coGiaTriMoiYellow=false,coGiaTriMoiPink=false;
//Khởi tạo cấu trúc CvKalman
CvKalman* kalmanYellow;
KhoiTaoKalman(kalmanYellow);
CvKalman* kalmanPink;
KhoiTaoKalman(kalmanPink);
//Vector đo : vector côt 2x1: chứa tọa độ x và y
CvMat* vectorDo_z_k =cvCreateMat( 2, 1, CV_32FC1
);
cvZero( vectorDo_z_k );
const CvMat* trangThaiPre_UocDoan;
const CvMat* trangThaiPost_ToiUu;
/*Bắt đầu vòng lặp lấy từng frame từ camera và xử
lý*/
while(tiepTuc)
{
//lấy một frame để xử lý
frame = cvQueryFrame( capture );
if( !frame ) break;
//Lật ngƣợc frame lại (nhƣ gƣơng)
cvFlip(frame,0 ,1);
/*Xử lý bắt đối tƣợng chuyển động dựa trên
màu sắc*/
//Tạo ảnh phân ngƣỡng màu vàng và hồng
imgYellowThresh =
TaoAnhPhanNguong(frame,yellowLower,yellowUpper);
imgPinkThresh=
TaoAnhPhanNguong(frame,pinkLower, pinkUpper);
//làm trơn để lọc nhiễu
//HÀM NÀY LÀM CHẬM CHƢƠNG TRÌNH ĐÁNG KỂ
//cvSmooth(imgYellowThresh,imgYellowThresh,CV_MEDIAN,5,0,0,0);
//Lấy tọa độ tâm
yellowCenter=
LayToaDoTamVatThe(imgYellowThresh,coGiaTriMoiYellow);
pinkCenter=
LayToaDoTamVatThe(imgPinkThresh,coGiaTriMoiPink);
//lƣu lại vị trí trong frame trƣớc
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

58

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
lastXYellow = posXYellow;
lastYYellow = posYYellow;
lastXPink = posXPink;
lastYPink = posYPink;
XYellow_Kalman_last
YYellow_Kalman_last
XPink_Kalman_last =
YPink_Kalman_last =

= XYellow_Kalman;
= YYellow_Kalman;
XPink_Kalman;
YPink_Kalman;

//Cập nhật vị trí mới
if(coGiaTriMoiYellow)
{
posXYellow = yellowCenter.x;
posYYellow = yellowCenter.y;
//Câp nhật giá trị cho vector
vectorDo_z_k
//hàng 0, cột 0
cvSetReal2D(vectorDo_z_k,
0,0,posXYellow);
//hàng 1, cột 0
cvSetReal2D(vectorDo_z_k,
1,0,posYYellow);
/*Thực hiện lọc Kalman ở đây*/
LocKalman(kalmanYellow, vectorDo_z_k,
trangThaiPre_UocDoan, trangThaiPost_ToiUu);
//Lấy giá trị mới tối ƣu
XYellow_Kalman=
cvGetReal2D(trangThaiPost_ToiUu,0,0);
YYellow_Kalman=
cvGetReal2D(trangThaiPost_ToiUu,1,0);
}
if(coGiaTriMoiPink)
{
posXPink = pinkCenter.x;
posYPink = pinkCenter.y;
//Câp nhật giá trị cho vector
vectorDo_z_k
//hàng 0, cột 0
cvSetReal2D(vectorDo_z_k,
0,0,posXPink);
//hàng 1, cột 0
cvSetReal2D(vectorDo_z_k,
1,0,posYPink);
/*Thực hiện lọc Kalman ở đây*/
LocKalman(kalmanPink, vectorDo_z_k,
trangThaiPre_UocDoan, trangThaiPost_ToiUu);
//Lấy giá trị mới tối ƣu
XPink_Kalman=
cvGetReal2D(trangThaiPost_ToiUu,0,0);
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

59

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
YPink_Kalman=
cvGetReal2D(trangThaiPost_ToiUu,1,0);
}
//vẽ đƣờng nối 2 vị trí của của vật thể
//CHÚ Ý: Kiểm tra các tọa độ đều >0 (vật thể
đƣợc phát hiện) mới vẽ
//if(lastXYellow>0 && lastYYellow>0 &&
posXYellow>0 && posYYellow>0)
//{
// cvLine(imgScribbleYellow,
cvPoint(posXYellow, posYYellow), cvPoint(lastXYellow, lastYYellow),
CV_RGB(0,0,255), 1);
//}
//if(lastXPink>0 && lastYPink>0 &&
posXPink>0 && posYPink>0)
//{
// cvLine(imgScribblePink, cvPoint(posXPink,
posYPink), cvPoint(lastXPink, lastYPink), CV_RGB(255,0,0), 1);
//}
//
if(dangTheoDoi)
{
//Kiểm tra có tọa độ lớn hơn 0 (detect
đƣợc vật thể) mới vẽ
if(yellowCenter.x > 0)
{
VeHinhVuongTracking(frame,
XYellow_Kalman, YYellow_Kalman, mauVang);
}
if(pinkCenter.x > 0)
{
VeHinhVuongTracking(frame,
XPink_Kalman, YPink_Kalman, mauHong);
}
}
if(dangVe)
{
//vẽ đƣờng thẳng nối vị trí detect ở
frame trƣớc và vị trí hiện tại
if(XYellow_Kalman_last>0 &&
YYellow_Kalman_last>0 && XYellow_Kalman>0 && YYellow_Kalman>0 )
{
cvLine(imgKalmanYellow,
cvPoint(XYellow_Kalman, YYellow_Kalman), cvPoint(XYellow_Kalman_last,
YYellow_Kalman_last), mauVang, 3, CV_AA);
}
if(XPink_Kalman_last>0 &&
YPink_Kalman_last>0 && XPink_Kalman>0 && YPink_Kalman>0 )
{
cvLine(imgKalmanPink,
cvPoint(XPink_Kalman, YPink_Kalman), cvPoint(XPink_Kalman_last,
YPink_Kalman_last), mauHong, 3, CV_AA);
}

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

60

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG

frame);
màu thôi)

//thêm ảnh quỹ đạo vừa vẽ vào frame
//cvAdd(frame, imgScribbleYellow,
//Ảnh quỹ đạo chƣa qua lọc Kalman (mới detect dựa trên
//cvAdd(frame, imgScribblePink,

frame);
cvAdd(frame, imgKalmanYellow, frame);
cvAdd(frame, imgKalmanPink, frame);
//cộng 2 ảnh quỹ đạo vàng và hồng để
vẽ ra cửa sổ quan sát
cvAdd(imgKalmanYellow,imgKalmanPink,imgYellowAndPink);
//Vẽ lên khung nhìn PictureForm
pictureForm>SetImage(imgYellowAndPink);
pictureForm->VeLenPictureBox();
}
if(dangDieuKhien)
{
//Nếu tìm thấy đồng thời 2 vật thể, và
đã đọc ảnh từ file vào xong thì
//ta tiến hành zoom và xoay ảnh
if(yellowCenter.x > 0 && pinkCenter.x
> 0 && imgForControl_AnhGoc != NULL)
{
imgForControl_BienDoi =
ZoomAnh(imgForControl_AnhGoc, XYellow_Kalman_last, YYellow_Kalman_last,
XYellow_Kalman, YYellow_Kalman,
XPink_Kalman_last,
YPink_Kalman_last, XPink_Kalman, YPink_Kalman );
//Vẽ đƣờng nối 2 vật thể cho
biết
VeDuongNoi2VatThe(frame,
XYellow_Kalman, YYellow_Kalman, XPink_Kalman, YPink_Kalman);
//Vẽ lên khung nhìn PictureForm
pictureForm>SetImage(imgForControl_BienDoi);
pictureForm->VeLenPictureBox();
}
//Nếu chỉ thấy một vật thể ta tiến
hành di chuyển ảnh
else if( (yellowCenter.x > 0 ||
pinkCenter.x > 0) && imgForControl_AnhGoc != NULL)
{
if(yellowCenter.x > 0)
{
imgForControl_BienDoi =
DiChuyenAnh(XYellow_Kalman_last, YYellow_Kalman_last, XYellow_Kalman,
YYellow_Kalman);
VeHinhVuongTracking(frame,
XYellow_Kalman, YYellow_Kalman, CV_RGB(0,0,255));
}
else
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

61

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
{
imgForControl_BienDoi =
DiChuyenAnh(XPink_Kalman_last, YPink_Kalman_last, XPink_Kalman,
YPink_Kalman);
VeHinhVuongTracking(frame,
XPink_Kalman, YPink_Kalman, CV_RGB(0,0,255));
}
//Vẽ lên khung nhìn PictureForm
pictureForm>SetImage(imgForControl_BienDoi);
pictureForm->VeLenPictureBox();
}
}
//Hiện ảnh threshold (mục đích debug)
//DrawCvImage(imgYellowThresh,pictureBoxCam);
//Hiện ảnh ra
DrawCvImage(frame,pictureBoxCam);
//Hết vòng lặp
}
//Giải phóng bộ nhớ: Xóa ảnh, ma trận
cvReleaseImage(&imgScribbleYellow);
cvReleaseImage(&imgScribblePink);
cvReleaseImage(&imgYellowThresh);
cvReleaseImage(&imgPinkThresh);
cvReleaseImage(&imgYellowAndPink);
cvReleaseMat(&vectorDo_z_k);
cvReleaseKalman(&kalmanYellow);
cvReleaseKalman(&kalmanPink);
//frame ko thể release (có lỗi)
//cvReleaseImage(&frame);
//Xóa capture, để chƣơng trình khác có thể dùng
cvReleaseCapture( &capture );
}

4.2.2.2 Hàm TaoAnhPhanNguong

Hàm này có chức năng tạo ra một ảnh phân ngưỡng với các ngưỡng dưới và ngưỡng trên
là các tham số lowerGrade và upperGrade.
public: IplImage* TaoAnhPhanNguong(IplImage* img, CvScalar lowerGrade,
CvScalar upperGrade)
{
//Hệ màu của ảnh từ camera là BGR
//Chuyển ảnh từ BGR thành HSV
IplImage* imgHSV = cvCreateImage(cvGetSize(img),
8, 3);
cvCvtColor(img, imgHSV, CV_BGR2HSV);
//Khai báo ảnh phân ngƣỡng
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

62

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
IplImage* imgThreshed =
cvCreateImage(cvGetSize(img), 8, 1);
//Phân ngƣỡng ảnh
cvInRangeS(imgHSV, lowerGrade, upperGrade,
imgThreshed);
cvReleaseImage(&imgHSV);
return imgThreshed;
}

4.2.2.3 Hàm LayToaDoTamVatThe

Hàm này thực hiện tính các moment của ảnh đã phân ngưỡng và lấy ra tọa độ tâm vật thể.
Đầu ra của nó chính là vector đo zk của chúng ta.
public: CvPoint LayToaDoTamVatThe(IplImage* imgThresh,bool &coGiaTriMoi)
{
//Khai báo biến kiểu cấu trúc CvMoment chứa các
moment của ảnh
CvMoments *moments =
(CvMoments*)malloc(sizeof(CvMoments));
//Khai báo các biến để chứa các giá trị moment của
ảnh
double area, moment10, moment01;
//Tính toán các moment cần thiết
cvMoments(imgThresh, moments, 1);
//Lấy ra moment 0th và 1th để tính vị trí tâm của
vật thể màu
//area là moment bậc (0,0) của ảnh: diện tích
//moment10, moment01 là moment bậc (1,0), (0,1)
//Từ đó, ta có tọa độ tâm của vật thể là
// xCenter = area/moment10
// yCenter = area/moment01
area = cvGetCentralMoment(moments, 0, 0);
moment10 = cvGetSpatialMoment(moments, 1, 0);
moment01 = cvGetSpatialMoment(moments, 0, 1);
//Thêm vào để xét area lớn hơn dienTichMin thì mới
lấy, không thì bỏ qua (thay cho lọc nhiễu) (vì lọc nhiễu làm chậm chƣơng
trình
static const int dienTichMin=30;
if(area >= dienTichMin)
{
coGiaTriMoi=true;
}
else
{
coGiaTriMoi=false;
}
CvPoint
tamVatThe=cvPoint((int)(moment10/area),(int)(moment01/area));
delete moments;
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

63

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
return tamVatThe;
}

4.2.2.4 Hàm KhoiTaoKalman

Hàm này thiết lập các ma trận của bộ lọc Kalman và khởi tạo các giá trị đầu vào:

Hậu nghiệm bước trước xk-1(+) và
Ma trận hiệp phương sai của sai số hậu nghiệm bước trước Pk-1(+).

public: void KhoiTaoKalman(CvKalman* &kalman)
{
//Khởi tạo generator cho random number
CvRandState rng;
cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );
//Khởi tạo cấu trúc Kalman:
//kích cỡ vector trạng thái nDynamParams:
x,y,vx,vy; vx, vy là vận tốc theo phƣơng x và y
//ở đây ta coi chyển động là đều và cho vx = vy =
2 (2pixel / 1frame)
//kích cỡ vector đo nMeasureParams: 2: tạo độ x, y
tính từ ohát hiện vật thể theo màu
//kích cỡ vector điều khiển nControlParams: 0
(không dùng)
kalman = cvCreateKalman( 4, 2, 0 );
//Tạo
//[ 1
// 0
// 0
// 0
//với
//
//
//
//

ma trận chuyển trạng thái F
0 vx 0
1 0 vy
0 1 0
0 0 1 ]
ma trận nhƣ vậy ta có F*x_k sẽ là:
x_k.x = x_k.x + vx
x_k.y = x_k.y + vy
x_k.vx = vx
x_k.vy = vy

//int vx = 1;
//vận tốc đều theo phƣơng x
//int vy = 1; //vận tốc đều theo phƣơng y
int vx = 2; //vận tốc đều theo phƣơng x
int vy = 2; //vận tốc đều theo phƣơng y
//hàng 0
cvSetReal2D(kalman->transition_matrix, 0,0,1);
cvSetReal2D(kalman->transition_matrix, 0,1,0);
cvSetReal2D(kalman->transition_matrix, 0,2,vx);
cvSetReal2D(kalman->transition_matrix, 0,3,0);
//hàng 1
cvSetReal2D(kalman->transition_matrix,
cvSetReal2D(kalman->transition_matrix,
cvSetReal2D(kalman->transition_matrix,
cvSetReal2D(kalman->transition_matrix,

1,0,0);
1,1,1);
1,2,0);
1,3,vy);

//hàng 2
cvSetReal2D(kalman->transition_matrix, 2,0,0);
cvSetReal2D(kalman->transition_matrix, 2,1,0);
cvSetReal2D(kalman->transition_matrix, 2,2,1);
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

64

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
cvSetReal2D(kalman->transition_matrix, 2,3,0);
//hàng 3
cvSetReal2D(kalman->transition_matrix,
cvSetReal2D(kalman->transition_matrix,
cvSetReal2D(kalman->transition_matrix,
cvSetReal2D(kalman->transition_matrix,

3,0,0);
3,1,0);
3,2,0);
3,3,1);

////////////
//Khởi tạo các
//Ma trận đo,
//ma trận hiệp
//ma trận hiệp
//ma trận hiệp

ma trận:
phƣơng sai của nhiễu hệ thống,
phƣơng sai của nhiễu đo,
phƣơng sai của sai số hậu nghiệm

(khởi tạo để tính)
//cvRealScalar(n): tạo cấu trúc CvScalar(n,0,0,0):
chỉ một số thực
//cvSetIdentity(): tạo ma trận chỉ có đƣờng chéo
(i=j) là khác 0 (bằng giá trị của cvRealScalar(n) = n), còn lại bằng 0
cvSetIdentity( kalman->measurement_matrix,
cvRealScalar(1) );
cvSetIdentity( kalman->process_noise_cov,
cvRealScalar(1e-3) );
//1e-3 = 10^-3
//Việc chọn giá trị các phần tử trong ma trận hiệp
phƣơng sai càng lớn thì có nghĩa là nhiễu càng lớn
//Ta chọn giá trị này càng nhỏ nếu ta càng tin
tƣởng giá trị của phép đo.
cvSetIdentity( kalman->measurement_noise_cov,
cvRealScalar(1e-4) );
//1e-4 = 10^-4
cvSetIdentity( kalman->error_cov_post,
cvRealScalar(1));
//Khởi tạo trạng thái hậu nghiệm ban đầu (ngẫu
nhiên)
cvRand( &rng, kalman->state_post );
/*Khởi tạo xong*/
}

4.2.2.5 Hàm LocKalman

Sau đã gọi hàm KhoiTaoKalman ta đã có thể gọi hàm này. Hàm này chính là bộ lọc Kalman.
Nó sẽ tính giá trị hậu nghiệm tối ưu từ giá trị tiên nghiệm theo mô hình hệ thống và giá trị
đo, nó cũng cập nhập các ma trận để sẵn sàng cho một lần lọc kế tiếp.
public: void LocKalman(CvKalman* &kalman, CvMat* vectorDo_z_k,const CvMat*
&trangThaiPre_UocDoan,const CvMat* &trangThaiPost_ToiUu)
{
/*Bắt đầu bộ lọc Kalman*/
//Tiên đoán tiên nghiệm (trạng thái x_k+1 (-) )
trangThaiPre_UocDoan=cvKalmanPredict( kalman, 0 );
//Giá trị đo z_k đã đƣợc đƣa vào là vectorDo_z_k

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

65

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
//Ta tiến hành Tối ƣu ƣớc lƣợng (tạo hậu nghiệm)
trangThaiPost_ToiUu = cvKalmanCorrect( kalman,
vectorDo_z_k );
/*Xong một chu kỳ lọc*/
}

4.2.2.6 Hàm TinhTienAnh

Hàm này và hàm ZoomAnh là 2 hàm dùng các thuật toán đồ họa máy tính để điều khiển
ảnh. Hàm này làm nhiệm vụ tịnh tiến ảnh.
Về mặt tổ chức chương trình, để có thể zoom và di chuyển qua một loạt các lần khác nhau
(theo di chuyển và xuất hiện của vật thể) ta lưu lại ảnh gốc ban đầu và một ma trận biến
đổi. Mỗi lần có một phép di chuyển hay zoom mới xảy ra ta lại cập nhật ma trận này bằng
cách nhân vào bên trái nó:
MaTranBienDoi = MaTranPhepBienDoiCuoi * MaTranBienDoi

Như vậy ta chỉ cần lưu lại một ma trận này và một ảnh gốc, muốn tạo ra ảnh biến đổi (di
chuyển hay zoom ảnh) ta chỉ việc nhân ma trận biến đổi (được cập nhật liên tục) này với
ảnh gốc. Nhờ đó ta sẽ có hiểu quả là một loạt các biến đổi ảnh liên tục.
/*Tịnh tiến ảnh từ điểm A đến điểm B
Hàm này đôi khi dc dùng chỉ để cập nhật
MaTran_BienDoiAnhGoc (tham so: thucHienBienDoiTrenAnh = false,
capNhatMaTranBienDoi = true)
Khi đó, sau khi gọi hàm này, để có biến đổi thực sự, ta
phải gọi:
cvWarpAffine( imgForControl_AnhGoc, dst,
MaTran_BienDoiAnhGoc);
scale: độ co dãn (dc nhân với khoảng cách giữa 2 điểm)
*/
public: void TinhTienAnh(const IplImage* src, IplImage* dst, CvPoint
diemA, CvPoint diemB, double scale, bool thucHienBienDoiTrenAnh, bool
capNhatMaTranBienDoi)
{
int xA, yA, xB, yB;
xA = diemA.x;
yA = diemA.y;
xB = diemB.x;
yB = diemB.y;
//Mảng 3 điểm vào và 3 điểm ra, để tính ma trận
biến đổi warp_mat
CvPoint2D32f srcTri[3], dstTri[3];
//Ma trận biến đổi hình
CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1);
//Tính ma trận biến đổi warp matrix
//Lấy 3 điểm tại 3 góc của ảnh gốc
srcTri[0].x = 0;
//src Top left
srcTri[0].y = 0;
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

66

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
srcTri[1].x
srcTri[1].y
srcTri[2].x
srcTri[2].y

=
=
=
=

src->width - 1;
0;
0;
src->height - 1;

//src Top right
//src Bottom left

if(scale<=0)
scale = 1;
int doDoiX = (xB - xA)*scale;
int doDoiY = (yB - yA)*scale;
//3 điểm đầu ra (vị trí mới của 3 điểm trên)
dstTri[0].x = srcTri[0].x + doDoiX;
//dst Top
left
dstTri[0].y = srcTri[0].y + doDoiY;
dstTri[1].x = srcTri[1].x + doDoiX;

//dst Top

dstTri[1].y = srcTri[1].y + doDoiY;
dstTri[2].x = srcTri[2].x + doDoiX;

//dst Bottom

right
left offset
dstTri[2].y = srcTri[2].y + doDoiY;
//lấy ma trận biến đổi
cvGetAffineTransform( srcTri, dstTri, warp_mat );
//biến đổi hình theo ma trận vừa tính
if(thucHienBienDoiTrenAnh)
cvWarpAffine( src, dst, warp_mat );
//Nếu thucHienBienDoiTrenAnh == false nghĩa là hàm
dc gọi chỉ để tính ma trận biến đổi
if(capNhatMaTranBienDoi)
NhanMaTranBienDoi(warp_mat,
MaTran_BienDoiAnhGoc ,MaTran_BienDoiAnhGoc);
cvReleaseMat(&warp_mat);
}

4.2.2.7 Hàm ZoomAnh

Hàm này thực hiện chức năng zoom ảnh.
private: IplImage* ZoomAnh(const IplImage* anhGoc, int xa_last, int
ya_last, int xa_new, int ya_new,
int xb_last, int yb_last, int xb_new, int yb_new)
{
double khoangCachMoi, khoangCachCu;
khoangCachCu = KhoangCach(xa_last, ya_last,
xb_last, yb_last);
khoangCachMoi = KhoangCach(xa_new, ya_new,
xb_new, yb_new);
double scale;
if(khoangCachCu != 0)
scale = khoangCachMoi/khoangCachCu;
else
scale = 1;

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

67

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
//Ảnh kết quả
IplImage *imgZoomAndRotate =
cvCreateImage(cvSize(chieuRongKhungNhin, chieuCaoKhungNhin), IPL_DEPTH_8U,
3);
//CvPoint2D32f centerAnhGoc = cvPoint2D32f(
anhGoc->width/2, anhGoc->height/2);
//Tính ma trận xoay
//Ma trận xoay
CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1);
//NHẮC LẠI: Do phép biến đổi tịnh tiến ban đầu
nên có thể coi (và chính xác là phải xem vậy) tâm của hình bây giờ là tâm
của khung nhìn
CvPoint2D32f center = cvPoint2D32f(
chieuRongKhungNhin/2, chieuCaoKhungNhin/2);
double angle = 0.0;
//lấy ma trận xoay và zoom
cv2DRotationMatrix( center, angle, scale, rot_mat
);
//CẬP NHẬT MA TRẬN BIẾN ĐỔI MaTran_BienDoiAnhGoc
//Vì ta có các phép biến đổi:
//
X2 = M1 x X1
//
X3 = M2 x X2 = M2 x M1 x X1
//
...
//Vậy ta có ma trận biến đổi tổng hợp là Mk x Mk1
//MaTran_BienDoiAnhGoc = rot_mat x
MaTran_BienDoiAnhGoc
//Tuy nhiên, CHÚ Ý: Các ma trận biến đổi là (2x3)
vì vậy ta không nhân chúng với nhau dc
//Ta phải pad thêm hàng cuối: 0 0 1 cho nó thành
ma trận vuông
//Vì vậy ta dùng hàm NhanMaTranBienDoi()
NhanMaTranBienDoi(rot_mat,MaTran_BienDoiAnhGoc,MaTran_BienDoiAnhGoc);
//xoay và zoom hình
cvWarpAffine(anhGoc, imgZoomAndRotate,
MaTran_BienDoiAnhGoc );
////khung nhìn có kích cỡ bằng kích cỡ ảnh đầu ra
(ở đây là 640, 480), vì vậy ta tính tâm khung nhìn nhƣ sau
//CvPoint2D32f centerKhungNhin = cvPoint2D32f(
imgZoomAndRotate->width/2, imgZoomAndRotate->height/2);
////Sau khi zoom và xoay xong, ta phải dời ảnh
////sao cho tâm ảnh (centerAnhGoc) trùng tâm
khung nhìn (centerKhungNhin)
//IplImage *imgZoomAndRotate_Out =
cvCreateImage(cvSize(imgZoomAndRotate->width,imgZoomAndRotate->height),
IPL_DEPTH_8U, 3);

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

68

CHƢƠNG 4. THIẾT KẾ VÀ CÀI ĐẶT CHƢƠNG TRÌNH PHÁT HIỆN DI ĐỘNG
//TinhTienAnh(imgZoomAndRotate,imgZoomAndRotate_Out, centerAnhGoc,
centerKhungNhin);
///////////////
cvReleaseMat(&rot_mat);
return imgZoomAndRotate;
}

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

69

Kết Luận
Đồ án này hoàn thành thu được các kết quả sau:

Về lý thuyết


Nắm rõ được bộ lọc Kalman.
Có khả năng phát triển hệ thống ước lượng dùng bộ lọc Kalman.
Nắm được thuật toán phát hiện vật thể dựa trên màu sắc, cách kết hợp với bộ lọc
Kalman để tạo ra một theo dõi các đối tượng chuyển động.

Về ứng dụng

Một ứng dụng dùng các kiến thức lý thuyết nêu trên đã hoàn chỉnh: Chương trình
phát hiện mục tiêu di động và ứng dụng để vẽ, điều khiển ảnh.
Trong chương trình, ngoài ứng dụng các kiến thức về lọc Kalman và phát hiện vật
thể dựa trên màu sắc còn ứng dụng thuật toán biến hình của đồ họa máy tính để
điều khiển ảnh.

Hƣớng phát triển

Một mức phát triển nhỏ của ứng dụng là thêm các chức năng điều khiển có thể từ
việc phát hiện mục tiêu di động, chẳng hạn điều khiển các chức năng của máy tính
thay cho chuột.
Một hướng khác là thay thuật toán phát hiện vật thể dựa trên màu sắc. Nếu ta thay
bộ đo này bằng các cài đặt của các thuật toán phát hiện chuyển động tinh vi hơn, ta
có thể mở rộng ứng dụng ra nhiều hướng mới: điều khiển máy tính bằng di chuyển
của tay, mắt; theo dõi các hệ thống giao thông và đưa ra giải pháp phân luồng tối
ưu dựa vào lưu lượng xe…

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

70

Phụ Lục
Hƣớng dẫn cài đặt OpenCV 2.1 cho project Winform CLR, Visual
Studio 2008 C++
1. Cài đặt OpenCV 2.1 (file OpenCV-2.1.0-win32-vs2008.exe)
Nhớ chọn: Add OpenCV to the system PATH for all users
2. Cài đặt Cmake (file cmake-2.8.3-win32-x86.exe)
3. Chạy Cmake, thực hiện các bước sau:
 Where is the source code: thư mục OpenCV cài ở bước 1 (mặc định là
C:/OpenCV2.1)
 Where to build the binaries: thư mục lưu các file tạo bởi Cmake (tùy ý, ở đây ta
chọn: F:/QbuildOpenCV)
 Nhấn Configure, Specify the generator for this project: chọn Visual Studio 9 2008.
Chọn Use default native compilers và nhấn Finish.

Hình PL-0-1 Cấu hình CMake 2.8.3

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

71

PHỤ LỤC

Chọn thêm các tùy chọn (hoặc để mặc định) và nhấn Configure lần nữa.
Nhấn Generate.

4. Dùng VS2008 mở solution OpenCV
Cmake vừa tạo trong filder ta chỉ định, ở
đây là F:\QbuildOpenCV\OpenCV.sln
5. Để chế độ debug và build sulution.
6. Sau đó chuyển qua release và build
solution.
(sẽ mất vài phút)
7. Mở thư mục lib/Debug và lib/Release
trong thư mục của solution (ở đây là
F:\QbuildOpenCV\) và copy tất cả file .lib
trong 2 thư mục ấy vào
C:\OpenCV2.1\lib.
Chú ý: file cvhaartraining.lib phải là file của
debug.
Ta có các file trong C:\OpenCV2.1\lib như sau:
8. Cấu hình VS 2008:
 Tạo một project C++ CRL Windows Forms Application, ví dụ: project tên
QtryOpenCV:

Hình PL-0-2 Tạo project CLR Windows Forms Application

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

72

PHỤ LỤC

Right click project và chọn Add new item, ví dụ: QTry1:

Hình PL-0-3 Thêm item

Thêm vào một menu strip và tạo menu Open:

Hình PL-4 Thêm menu


Thêm một picture box đặt tên pictureBox1.
Double vào menu item Open vào thêm vào code: OpenFile();

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

73

PHỤ LỤC
Với hàm OpenFile() như sau (được đặt vào cùng file code này)
private: void OpenFile()
{
OpenFileDialog^ dlg = gcnew OpenFileDialog;
dlg->Filter
=
"SelectFile(*.bmp,*.jpg,*.png,*.tif,jp2)|*.bmp;*.jpg;*.png;*.tif;*.jp2";
if
(dlg->ShowDialog()
==
System::Windows::Forms::DialogResult::Cancel) return;
System::String^ strFilename = dlg->FileName;
char*
pStr
=
(char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strF
ilename).ToPointer();
src_img
=
cvLoadImage(pStr,
CV_LOAD_IMAGE_ANYCOLOR);

CV_LOAD_IMAGE_ANYDEPTH

|

System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr
(pStr));
///////////////////////////////////
Bitmap^ bmpPicBox = gcnew Bitmap(strFilename);
this->pictureBox1->Image = bmpPicBox;
///////////////////////////////////
this->pictureBox1->Refresh();
this->Invalidate();
//delete bmpPicBox;
}

Trên đầu file code này, thêm mã sau (để thêm các thư viện cần thiết cho chương
trình) (chú ý chỉnh lại đúng đường dẫn tới thư mục vài OpenCV trên máy):

#pragma once
#include "C:\OpenCV2.1\include\opencv\cv.h"
#include "C:\OpenCV2.1\include\opencv\highgui.h"
#ifdef _DEBUG

//Debug
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210d.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210d.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210d.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210d.lib")

#else
//Release
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210.lib")

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

74

PHỤ LỤC
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210.lib")
#endif

Thêm code sau:

IplImage* src_img;

Dưới phần sau:
private:
/// <summary>
/// Required designer variable.
/// </summary>

Ta được:
private:
/// <summary>
/// Required designer variable.
/// </summary>
IplImage* src_img;

Trong hàm hủy (ở đây là ~QTry1()) thêm code sau:

if (src_img != NULL){
IplImage *temp_img = src_img;
cvReleaseImage(&temp_img);
src_img = NULL;
}

Ta có hàm hủy như sau:
protected:

/// <summary>
/// Clean up any resources being used.
/// </summary>
~QTry1()
{
if (components)
{
delete components;
}
///////////////////////
if (src_img != NULL){
IplImage *temp_img = src_img;
GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

75

PHỤ LỤC
cvReleaseImage(&temp_img);
src_img = NULL;
}
}

(QUAN TRỌNG) Right click project và chọn Properties, trong Configuration
Properties/ General/ Common language Runtime support: chọn Common
Language Runtime Support (/clr) để project chấp nhận unmanaged code.
Sửa file chính của project (trùng tên project), ở đây là file: QtryOpenCV.cpp, để
chạy form của chúng ta

// QTryOpenCV.cpp : main project file.
#include "stdafx.h"
#include "QTry1.h"

///////Sửa Form1.h thành QTry1.h

using namespace QTryOpenCV;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
//
created

Enabling

Windows

XP

visual

effects

before

any

controls

are

Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// Create the main window and run it
Application::Run(gcnew QTry1());

///////Sửa Form1.h thành QTry1.h

return 0;
}

Biên dịch và chạy thử project, nếu có thể nhấn Open để mở một bức hình là thành
công.

Hình PL-5 Kết của việc cài đặt và chạy thành công một chương trình Winform dùng OpenCV

GVHD: ThS. Trần Tiến Đức
SVTH: Trần Nhật Quang – trannhatquang4810@gmail.com

76

TÀI LIỆU THAM KHẢO
[1] Tên lửa không đối không, http://vi.wikipedia.org/wiki/Tên_lửa_không_đối_không
[2] Gary Bradski and Adrian Kaehler, Learning OpenCV, O’Reilly, 2008.
[3] Bài giảng xác suất thống kê: Biến ngẫu nhiên (3),
http://zung.zetamu.com/2009/09/bai-giảng-xac-suất-thống-ke-biến-ngẫu-nhien-3/
[4] Lindsay I Smith, A tutorial on Principal Components Analysis,
users.ecs.soton.ac.uk/hbr03r/pa037042.pdf, 2002
[5] Cao Hào Thi, Ước lượng các tham số thống kê,
www.ctu.edu.vn/~dvxe/stat/stat_caohaothi/MS07-R07bV.pdf
[6] Orthogonality principle, http://en.wikipedia.org/wiki/Orthogonality_principle
[7] Rudolf Emil Kalman, http://www.cs.unc.edu/~welch/kalman/kalmanBio.html
[8] Kalman filter, http://en.wikipedia.org/wiki/Kalman_filter
[9] http://www.cesti.gov.vn/kh-cn-trong-n-c/ng-d-ng-l-c-kalman-trong-phan-tich-bi-n-dng-nha-cao-t-ng-do-b-c-x-nhi-t-m-t-tr-i.html
[10]
http://webcache.googleusercontent.com/search?q=cache:WflSR0tXXe8J:khcn.vimaru.edu.
vn/fckfiles/file/danhmuc_tckhcn/DANH%2520MUC%2520BAI%2520DANG%252020.doc+d
ung+kalman&cd=40&hl=vi&ct=clnk&gl=vn&client=opera
[11] http://www.nchmf.gov.vn/web/vi-VN/71/155/5760/Default.aspx
[12] http://www6.vnmedia.vn/newsdetail.asp?CatId=35&NewsId=148914
[13] Giới thiệu về bộ lọc Kalman,
http://vntelecom.org/diendan/showthread.php?t=134&page=1
[14] Mohinder S. Grewal and Angus P. Andrews, KALMAN FILTERING - Theory and Practice
Using MATLAB, 3rd edition, John Wiley & Sons, 2008

77

Sign up to vote on this title
UsefulNot useful