ĐIỀU KHIỂN ROBOT DI ĐỘNG SỬ DỤNG THƯ VIỆN OPENCV
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Nguyễn Xuân Đức
ĐIỀU KHIỂN ROBOT DI ĐỘNG SỬ DỤNG
THƯ VIỆN OPENCV
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
HÀ NỘI-2010
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Nguyễn Xuân Đức
ĐIỀU KHIỂN ROBOT DI ĐỘNG SỬ DỤNG
THƯ VIỆN OPENCV
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Cơ học Kỹ thuật
Cán bộ hướng dẫn:ThS Phùng Văn Hiệp
HÀ NỘI – 2010
Trang 3LỜI CẢM ƠN
Khi bắt đầu nhận đồ án tốt nghiệp này em đã rất lo lắng bởi xử lý ảnh là lĩnh vực còn mới mẻ ở Việt Nam và bản thân cũng lần đầu tiên tiếp xúc với lĩnh vực này Em rất vui vì cuối cùng đã hoàn thành tốt đồ án được giao
Trước hết em xin gửi lời cảm ơn sâu sắc đến ThS Phùng Văn Hiệp tuy không có điều kiện trực tiếp được làm việc cùng thầy nhiều, nhưng qua những lần tiếp xúc ngắn ngủi đó chính thầy đã cho em những lời động viên, những lời khuyên quý báu, em học được ở thầy rất nhiều từ phong cách làm việc đến phong cách sống, em rất khâm phục thầy
Đồng thời em xin gửi lời cảm ơn đến ThS Võ Đức Mỹ, cán bộ nghiên cứu tại Viện Công nghệ Vũ trụ - Viện Khoa học và Công nghệ Việt Nam Mặc dù chỉ được trực tiếp làm việc với thầy trong thời gian ngắn do thầy phải đi công tác xa và rất bận rộn nhưng thầy vẫn luôn dành thời gian quý báu hướng dẫn, chỉ bảo tận tình, giúp em bước từ những bước đi đầu tiên đến lúc em hoàn thành được đồ án này
Em xin gửi lời cảm ơn chân thành đến KS Nguyễn Thanh Tuấn cán bộ nghiên cứu phòng Động lực học vũ trụ và Cơ điện tử chính xác - Viện Công nghệ Vũ trụ - Viện Khoa học và Công nghệ Việt Nam KS Nguyễn Thanh Tuấn không những giúp
đỡ em rất nhiều trong quá trình thực hiện đồ án này mà còn chỉ bảo, giúp đỡ em ngay
từ khi em bắt đầu được đến học tập tại Viện
Qua đây em cũng xin gửi lời cảm ơn đến thầy, cô giáo công tác tại trường Đại Học Công Nghệ - Đại Học Quốc Gia Hà Nội và các cán bộ nghiên cứu tại Viện Công Nghệ Vũ trụ Viện Khoa học và Công nghệ Việt Nam đã giúp đỡ em về chuyên môn, tạo điều kiện thuận lợi để em hoàn thành đồ án này
Thực sự con cũng không biết làm thế nào để nói hết công ơn bố mẹ đã dành cho con!
Một lần nữa xin cảm ơn tất cả mọi người, cầu chúc cho tất cả mọi người mạnh khỏe, vui vẻ, hạnh phúc và thành công!
Sinh viên
Nguyễn xuân Đức
Trang 4TÓM TẮT NỘI DUNG ĐỒ ÁN
Lĩnh vực rô bốt đang ngày càng chiếm được sự quan tâm của các nhà nghiên cứu
và xã hội Từ tình hình thực tế đó, việc xây dựng các chương trình hoạt động cho rô bốt là điều thiết yếu, đặc biệt đối với rô bốt di động Bài toán rô bốt di động bám đối tượng là một bài toán thường gặp trong lĩnh vực rô bốt
Đồ án này trình bày xây dựng một giải pháp điều khiển rô bốt di động bám đối tượng dựa vào thuật toán CamShift trong thư viện OpenCV Để theo dõi đối tượng trong OpenCV cần phải có quá trình dò tìm, phân tích và nhận dạng đối tượng
Bố cục của đồ án này được trình bày như sau: trước hết đồ án trình bày những khái niệm về thư viện OpenCV, sau đó trình bày các cơ sở lý thuyết của thư viện OpenCV Trên cơ sở tìm hiểu tìm hiểu thư viện OpenCV đồ án xây dựng thuật toán theo dõi đối tượng dựa vào một thuật toán rất phổ biến trong OpenCV là thuật toán CamShift Một Webcam được sử dụng để thu thập hình ảnh đóng vai trò như là con mắt của rô bốt và một laptop được sử dụng làm bộ xử lý trung tâm cho rô bốt Mô hình rô bốt được chế tạo nhằm kiểm nghiệm thuật toán đã xây dựng Kết quả đồ án là căn cứ để phát triển và xây dựng các thuật toán điều khiển rô bốt sử dụng OpenCV sau này
Trang 5
MỤC LỤC
MỞ ĐẦU 1
CHƯƠNG 1 GIỚI THIỆU CHUNG 2
1.1 Giới thiệu chung về rô bốt 2
1.2 Giới thiệu rô bốt bám đối tượng 3
1.3 Mục tiêu của đồ án 6
1.4 Giới hạn của đồ án 6
CHƯƠNG 2 TỔNG QUAN VỀ THƯ VIỆN OPENCV VÀ MỘT SỐ LINH KIỆN SỬ DỤNG TRONG KHỐI PHẦN CỨNG 7
2.1 Thế nào là thị giác máy? 7
2.2 Thư viện OpenCV 7
2.2.1 OpenCV là gì? 7
2.2.2 Vì sao lựa chọn OpenCV? 8
2.2.3 Cấu trúc và nội dung OpenCV như thế nào? 9
2.2.4 Các hàm I/O trong OpenCV 10
2.2.5 Các hàm thực hiện xử lý ảnh 12
2.2.6 Các hàm Histograms and Matching 13
2.2.7 Hàm Contours 13
2.2.8 Cơ sở toán học của thuật toán CamShift 14
2.3 Cơ bản về PIC16F877A 15
2.3.1 PIC là gì? 15
2.3.2 Đặc điểm nổi bật của PIC16F877A 15
2.3.3 Sơ đồ các chân của PIC16F877A 16
2.4 Giao tiếp RS232 18
2.5 Giới thiệu về chíp mạch cầu L298N 20
CHƯƠNG 3 XÂY DỰNG PHẦN MỀM ĐIỀU KHIỂN 22
3.1 Thị giác máy điều khiển rô bốt di động bám đối tượng 22
3.2 Thuật toán tính hướng và kích cỡ của đối tượng cần theo dõi 23
3.2.1 Thuật toán chung 23
3.2.2 Nhận dạng và bám mục tiêu di động 24
3.2.3 Chuyển đổi không gian màu từ RGB đến HSV 25
3.2.4 Histogram 26
3.2.5 Lọc nhiễu Filter 27
3.2.6 Thuật toán CamShift 28
3.2.7 Thiết kế hoàn chỉnh phần mềm điều khiển 30
CHƯƠNG 4 XÂY DỰNG MẠCH PHẦN CỨNG 34
Trang 64.1.1 Khối điều khiển trung tâm 34
4.1.2 Khối nguồn 35
4.1.3 Khối truyền thông RS232 35
4.1.4 Khối điều khiển động cơ 36
4.2 Tập lệnh điều khiển rô bốt 37
CHƯƠNG 5 KẾT QUẢ THỰC HIỆN 38
5.1 Kết quả thử nghiệm với môi trường tĩnh 40
5.2 Kết quả thử nghiệm với môi môi trường động 42
KẾT LUẬN 46
PHỤ LỤC A CHƯƠNG TRÌNH XỬ LÝ ẢNH 48
PHỤ LỤC B CHƯƠNG TRÌNH ĐIỀU KHIỂN ROBOT 62
PHỤ LỤC C CHƯƠNG TRÌNH TRUYỀN THÔNG RS232 66
TÀI LIỆU THAM KHẢO 72
Trang 7DANH SÁCH HÌNH VẼ
Hình 1: PANrobot (nguồn: mobilerobot.org 4
Hình 2: Rô bốt MIDbo (nguồn: telepresenceoptions.com) 4
Hình 3: Rô bốt Pops (nguồn: slashgear.com) 5
Hình 4: Rô bốt thám hiểm sao hoả (nguồn: robotics.youngester.com) 5
Hình 5: Quá trình phát triển của OpenCV 8
Hình 6: Cấu trúc cơ sở của OpenCV 9
Hình 7: PIC16F877A 16
Hình 8: Sơ đồ khối của PIC16F877A 17
Hình 9: Cổng giao tiếp RS232 19
Hình 10: Chíp mạch cầu L298N 21
Hình 11: Sơ đồ khối tổng quát của rô bốt 22
Hình 12: Sơ đồ thuật toán chung 23
Hình 13: Mặt phẳng ảnh 24
Hình 14: Biểu diễn đối tượng di chuyển trên mặt phẳng ảnh 25
Hình 15: Chuyển đối không gian màu RGB đến HSV 26
Hình 16: Histogram 26
Hình 17: kết quả trước và sau khi lọc nhiễu 27
Hình 18: Sơ đồ thuật toán CamShift 28
Hình 19: Kết quả tính toạ độ tâm bằng thuật toán CamShift 29
Hình 20: Kết quả bước đầu theo dõi đối tượng bằng thuật toán CamShift 29
Hình 21: Giao diện phần mềm thiết kế hoàn chỉnh 31
Hình 22: Kết quả thử nghiệm với phần mềm 32
Hình 23: Kết quả thử nghiệm với phần mềm 33
Hình 24: Sơ đồ khối điều khiển trung tâm 34
Trang 8Hình 26: Sơ đồ khối truyền thông RS232 35
Hình 27: Sơ đồ nguyên lý mạch cầu điều khiển động cơ 36
Hình 28: Sơ đồ phần cứng hoàn chỉnh 36
Hình 29: Hình ảnh robot hoàn chỉnh 39
Trang 9DANH SÁCH BIỂU ĐỒ
Biểu đồ 1: Giá trị toạ độ tâm đối tượng môi trường tĩnh (160x120) 40
Biểu đồ 2: Giá trị toạ độ tâm đối tượng môi trường tĩnh (176x144) 40
Biểu đồ 3: Giá trị toạ độ tâm đối tượng môi trường tĩnh (320x240) 41
Biểu đồ 4: Giá trị toạ độ tâm đối tượng môi trường tĩnh (640x480) 42
Biểu đồ 5: Giá trị toạ độ tâm đối tượng môi trường động (160x120) 42
Biểu đồ 6: Giá trị toạ độ tâm đối tượng môi trường động (176x144) 43
Biểu đồ 7: Giá trị toạ độ tâm đối tượng môi trường động (320x240) 43
Biểu đồ 8: Giá trị toạ độ tâm đối tượng môi trường động (640x480) 44
Biểu đồ 9: Giá trị toạ độ tâm đối tượng môi trường động tốc độ không đổi 44
Trang 10DANH SÁCH BẢNG
Bảng 1: Chức năng các chân của L298N 20 Bảng 2: Tóm tắt nguyên tắc điều khiển động cơ sử dụng L298N 21 Bảng 3: Tập lệnh điều khiển rô bốt 37
Trang 11MỞ ĐẦU
Xử lý ảnh bao gồm lý thuyết và các kỹ thuật liên quan nhằm mục đích tạo ra một
hệ thống nhân tạo có thể tiếp nhận thông tin từ các hình ảnh thu được hoặc các tập dữ liệu đa chiều Đối với mỗi người chúng ta, quá trình nhận thức thế giới bên ngoài là một điều dễ dàng Quá trình nhận thức đó được “học” thông qua quá trình sống của mỗi người Tuy nhiên với các vật vô tri vô giác như như các máy tính, rô bốt v v thì điều đó quả thực là một bước tiến rất gian nan Các thiết bị ngày nay không chỉ nhận thông tin ở dạng tín hiệu đơn lẻ mà còn có thể có cái “nhìn” thật với thế giới bên ngoài Cái “nhìn” này qua quá trình phân tích, kết hợp với các mô hình như máy học, mạng nơron v v sẽ giúp cho thiết bị tiến dần tới một hệ thống nhân tạo có khả năng ra quyết định linh hoạt và đúng đắn hơn rất nhiều OpenCV là thư viện mã nguồn mở về
xử lý ảnh của Intel nó đáp ứng đầy đủ các yêu cầu đó của lĩnh vực xử lý ảnh
Trên thế giới lĩnh vực rô bốt di động sử dụng xử lý ảnh phát triển vô cùng mạnh
mẽ và có được những bước tiến đáng kinh ngạc Ở Việt Nam lĩnh vực rô bốt di động đang rất phát triển, tuy nhiên lĩnh vực rô bốt di động sử dụng công cụ xử lý ảnh còn mới mẻ do thiếu các thiết bị hỗ trợ và tài liệu Vì vậy, đây sẽ là một hướng phát triển mới đầy hứa hẹn và cũng không ít thách thức Với mong muốn tham gia vào lĩnh vực còn mới này và góp phần vào sự phát triển lĩnh vực rô bốt di động sử dụng xử lý ảnh ở Việt Nam, em thực hiện đề tài “Điều khiển rô bốt di động sử dụng thư viện OpenCV”
Trang 12CHƯƠNG 1 GIỚI THIỆU CHUNG
1.1 Giới thiệu chung về rô bốt
Rô bốt hay người máy là một loại máy có thể thực hiện những công việc một cách tự động bằng sự điều khiển của máy tính
Rô bốt là một tác nhân cơ khí, nhân tạo, thường là một hệ thống cơ khí-điện tử Với sự xuất hiện và chuyển động của mình, rô bốt gây cho người ta cảm giác rằng nó giác quan giống như con người Từ "rô bốt" (người máy) thường được hiểu với hai nghĩa: rô bốt cơ khí và phần mềm tự hoạt động Về lĩnh vực người máy, Nhật Bản là nước đi đầu thế giới về lĩnh vực này
Ngày nay rô bốt đang là tâm điểm của một cuộc cách mạng lớn sau Internet Rô bốt ngày càng được sử dụng rộng rãi trong lĩnh vực công nghiệp, y tế, giáo dục đào tạo, giải trí, an ninh quốc phòng, thám hiểm không gian
Rô bốt là sản phẩm công nghệ có độ phức tạp cao, chứa hàm lượng tri thức vô cùng phong phú về tất cả các lĩnh vực của khoa học và công nghệ
Ngày nay, người ta vấn còn đang tranh cãi về vấn đề “Một loại máy như thế nào thì đủ tiêu chuẩn để được gọi là một rô bốt ?” Một cách gần chính xác, rô bốt phải có một vài (không nhất thiết phải đầy đủ) các đặc điểm sau đây:
Không phải là tự nhiên, tức là do con người sáng tạo ra
Có khả năng nhận biết môi trường xung quanh
Có thể tương tác với những vật thể trong môi trường
Có sự thông minh, có khả năng đưa ra các lựa chọn dựa trên môi trường và được điều khiển một cách tự động theo những trình tự đã được lập trình trước
Có khả năng điều khiển được bằng các lệnh để có thể thay đổi tùy theo yêu cầu của người sử dụng
Có thể di chuyển quay hoặc tịnh tiến theo một hay nhiều chiều
Có sự khéo léo trong vận động
Trang 131.2 Giới thiệu rô bốt bám đối tượng
Hệ thống điều khiển rô bốt có thị giác được sử dụng để theo dõi mục tiêu di động trong các ứng dụng công nghiệp, quốc phòng và xã hội Hệ thống thị giác có thể được phân thành 2 lớp, theo như cấu trúc của hệ, đó là hệ có camera gắn cố định và hệ có camera gắn trên tay máy (eye-in-hand) Trong hệ camera cố định, camera được gắn cố định so với hệ toạ độ thực, thu thập ảnh của cả mục tiêu và cả môi trường Mục tiêu của hệ này là cung cấp tín hiệu điều khiển sao cho tay máy đạt được vị trí mong muốn Mục đích của cấu truc eye-in-hand là điều khiển tay máy sao cho ảnh của mục tiêu cố định hay di động luôn được duy trì ở vị trí mong muốn trên mặt phẳng ảnh thu được Trên cơ sở ảnh thu được từ camera, được số hoá và tích hợp trong vòng điều khiển phản hồi, hệ thống điều khiển các khớp của tay máy
Các nghiên cứu của môi trường động bị bỏ khá xa so với của môi trường tĩnh do
bị ảnh hưởng khá lớn của tốc độ tính toán cũng như độ chính xác của việc phân tích ảnh Do vậy có nhiều thuật toán để cải thiện tốc độ xử lý và xem xét đến các quà trình nhiễu tác động lên quá trình thu thập hình ảnh
Một thách thức của thị giác máy là việc phân loại đối tượng Một rô bốt có thể phải đối mặt với nhiều đối tượng khác nhau, trong khi đó chỉ có một mục tiêu quan tâm, còn các đối tượng khác thì không
Để nhận biết được thông tin về vị trí của mục tiêu trong môi trường động, các đặc trưng của mục tiêu rất quan trọng Các điểm lỗ, các góc cạnh, các đặc điểm hình học của mục tiêu được phân tích qua quá trình nhận dạng Đặc tính về trọng tâm của mục tiêu có thể tính dễ dàng qua moment bâc nhất trong môi trường tĩnh, nhưng trong môi trường động việc này rất khó vì chi phí thời gian tính toán lớn
Bài toán bám mục tiêu di động với quỹ đạo không biết trước yêu cầu phải giữ được đối tượng ở một vị trí nhất định trên mặt phẳng ảnh Thuật toán CamShift được
sử dụng để tính toán toạ độ trọng tâm của đối tượng
Trang 14Hình 1: PANrobot (nguồn: mobilerobot.org
Hình 2: Rô bốt MIDbo (nguồn: telepresenceoptions.com)
Trang 15Hình 3: Rô bốt Pops (nguồn: slashgear.com)
Hình 4: Rô bốt thám hiểm sao hoả (nguồn: robotics.youngester.com)
Trang 161.3 Mục tiêu của đồ án
Mục tiêu nghiên cứu của đồ án có thể chia thành hai phần như sau:
Thứ nhất: Xây dựng phần mềm rô bốt di động bám đối tượng sử dụng OpenCV Thuật toán được lựa chọn để sử dụng trong đồ án là thuật toán CamShift
Thứ hai: Xây dựng khối phần cứng để kiểm nghiệm giải thuật của thuật toán đã xây dựng sử dụng vi điều khiển PIC16F877A
Như vậy công việc chính của đồ án là:
Tìm hiểu thư viện OpenCV
Tìm hiểu về thuật toán CamShift
Lập trình điều khiển rô bốt di động sử dụng thuật toán CamShift
Thiết kế mạch phần cứng và lập trình điều khiển động cơ sử dụng PIC16F877A
Lập trình truyền thông nối tiếp RS232
Trang 17CHƯƠNG 2 TỔNG QUAN VỀ THƯ VIỆN OPENCV
VÀ MỘT SỐ LINH KIỆN SỬ DỤNG TRONG KHỐI PHẦN CỨNG
2.1 Thế nào là thị giác máy
Thị giác máy là một lĩnh vực đa dạng và đang rất phát triển Khái niệm thị giác máy (Computer vision) có liên quan tới nhiều ngành học và hướng nghiên cứu khác nhau Từ những năm 1970 khi mà năng lực tính toán của máy tính ngày càng trở nên mạnh mẽ hơn, các máy tính lúc này có thể xử lý được những tập dữ liệu lớn như các hình ảnh, các đoạn phim thì khái niệm và kỹ thuật về thị giác máy ngày càng được nhắc đến và nghiên cứu nhiều hơn cho tới ngày nay Hiện tại, lĩnh vực này được các chuyên gia đánh giá là vẫn còn mới mẻ và sẽ có rất nhiều thay đổi trong thời gian tới Lĩnh vực nghiên cứu của thị giác máy rất rộng, và đặc điểm chung là các bài toán
về thị giác máy tính đều không có một đề bài chung và cách giải duy nhất Mỗi giải pháp giải quyết vấn đều được một kết quả nhất định cho những trường hợp cụ thể Ta
có thể thấy sự tương quan giữa thị giác máy với các lĩnh khác
2.2 Thư viện OpenCV
2.2.1 OpenCV là gì ?
OpenCV viết tắt của Open Source Computer Vision Library
Nó chứa hơn 500 hàm sử dụng trong thị giác máy
OpenCV là một thư viện mã nguồn mở (open source) http://sourceforge.net/ Thư viện được viết bằng ngôn ngữ C và C++ có thể chạy trên các hệ điều hành Linux, Window và Mac OS X OpenCV được thiết kế để nâng cao hiệu suất tính toán và nhấn mạnh đến hệ thống thời gian thực Một điều tuyệt vời của OpenCV là nó đưa ra một hệ thống đơn giản, dễ sử dụng giúp mọi người nhanh chóng xây dựng các ứng dụng trong thị giác máy, kể cả các hệ thống kiểm tra trong nhà máy, bức ảnh trong lĩnh vực y học, bảo mật, rô bốt học v v Nó chứa các lập trình xử lý ảnh rất đơn giản, kể cả thực thi các hàm bậc cao như dò tìm khuôn mặt, theo dõi khuôn mặt, nhận dạng khuôn mặt, lọc Kalman
Trang 18Kể từ khi được giới thiệu vào tháng 1 năm 1999, OpenCV đã được sử dụng trong rất nhiều ứng dụng, các sản phẩm và các nghiên cứu Ví dụ trong lĩnh vực hàng không
vũ trụ, bản đồ web, sử dụng giảm nhiễu trong y học, phân tích đối tượng, an ninh, hệ thống dò tìm, theo dõi tự động và hệ thống bảo mật, quản lý hệ thống sản xuất, xử lý camera, ứng dụng trong quân sự, hệ thống hàng không không người lái, trên mặt đất, các tàu ngầm Ngoài ra, nó còn được sử dụng trong nhận dạng âm thanh OpenCV còn
là một chìa khóa quan trọng trong các rô bốt sử dụng thị giác máy như Stanford, Asimo
Hình 5: Quá trình phát triển của OpenCV
2.2.2 Vì sao lựa chọn OpenCV?
Thị trường thị giác máy đang ngày càng mở rộng và liên tục phát triển
Thư viện tiêu chuẩn sẽ tạo ra các ứng dụng mới và các giải pháp xử lý dễ dàng hơn
Đặc biết tối ưu khi sử dụng cấu trúc của Intel
Tạo ra các mẫu ứng dụng bằng các thư viện được cập nhật thường xuyên và thực hiện được các thuật toán rất nặng như dò tìm khuôn mặt
Có rất nhiều công nghệ hiện đại và các công ty lớn sử dụng thư viện OpenCV trong ứng dụng của mình (điển hình như Intel, Microsoft, IBM, Siemens, Google v v.)
và các trung tâm nghiên cứu như (Stanford, MIT, CMU, Cambridge, INRIA…)
Trang 19Hơn 14000 thành viên trên forum OpenCVyahoogroups.com với trung bình 10 đến 20 bức thông điệp được trao đổi hàng ngày
Điều đó có thể khẳng định OpenCV thực sự đã góp phần vô cùng lớn trong lĩnh vực thị giác máy
2.2.3 Cấu trúc và nội dung OpenCV như thế nào?
Để hiểu OpenCV làm việc như thế nào chúng ta bắt đầu từ sự phân chia cấu trúc
và nội dung của OpenCV ở 5 phần Cấu trúc của OpenCV được chia thành 5 phần chính, 4 trong số đó được chỉ ra trong hình 6
CV (computer vision) là thành phần chứa những xử lý ảnh cơ sở và thuật toán thị giác máy ở mức cao
MLL (machine learning library) là thư viện machine learning, cái này bao gồm rất nhiều lớp thống kê và gộp các công cụ xử lý
HighGUI chứa các thủ tục vào ra và các hàm dùng cho việc lưu trữ và tải ảnh video
CXCore chứa cấu trúc và nội dung dữ liệu cơ sở
Hình 6: Cấu trúc cơ sở của OpenCV
Trang 202.2.4 Các hàm I/O trong OpenCV
OpenCV cung cấp các hàm mà cho phép chúng ta tương tác trực tiếp với hệ điều hành, các file hệ thống, các phần cứng như Webcam Các hàm này nằm trong thư viện HighGUI, HighGUI cho phép mở một window, hiển thị bức ảnh, đọc các file liên quan đến đồ hoạ (ảnh, video) các file ảnh như jpg, bmp v v các file video như avi, wma, mp4, dat v v Ngoài ra nó còn xử lý các sự kiện chuột, bàn phím, OpenCV còn cho phép chúng ta lựa chọn thuật toán linh động hơn bằng cách cung cấp các hàm tạo thanh trượt slider, switch v v Để làm việc với OpenCV trước hết phải học các hàm trong thư viện này
Thư viện HighGUI có thể chia thành 3 phần: phần cứng, phần file hệ thống và phần GUI (Graphical User Interface) chúng ta có thể xem xét các phần trong thư viện HighGUI như sau
Phần cứng: là phần thiết yếu nhất, liên quan đến hoạt động của Camera, trong phần lớn hệ điều hành việc tương tác với phần cứng rất khó khăn và thực sự rất khó nhưng OpenCV cung cấp hàm đơn giản để thực hiện việc tương tác này ví dụ: cvCaptureFromCAM()
Phần file hệ thống: là khái niệm liên quan đến việc tải và lưu ảnh, một đặc điểm rất tuyệt vời trong thư viện HighGUI là cho phép chúng ta làm việc với ảnh tương tự khi làm việc với video Vì vậy chúng ta có thể nhanh chóng tiếp cận với việc xử lý ảnh
mà không mất nhiều thời gian cho việc tải, lưu ảnh, video
Phần GUI: là hệ thống cửa sổ (Window), thư viện cung cấp một số hàm đơn giản
mà cho phép chúng ta mở một window hiển thị ảnh trên window này Ngoài ra nó còn cho phép chúng ta thực thi các sự kiện nhận được từ chuột và bàn phím
Một số hàm đơn giản thường xuyên sử dụng trong thư viện HighGUI như sau:
Đầu tiên chúng ta cần học cách làm thế nào để đọc và viết các files ảnh, chụp video chuyển đổi giữa các định dạng màu, và truy cập dữ liệu điểm ảnh tất cả qua giao diện OpenCV
Đọc và viết một bức ảnh
Bức ảnh vào/ra thì rất dễ dàng trong OpenCV, để đọc một file ảnh, đơn giản gọi hàm cvLoadImage(tên file) OpenCV hỗ trợ hầu hết các định dạng phổ biến
Trang 21kể cả JPEG, PNG và BMP Bạn không cần cung cấp thông tin định dạng cvLoadImage() tự động quyết định dạng file thông qua file header này
Để viết một bức ảnh đến một file, ta dùng hàm cvSaveImage() Hàm này cũng
tự quyết định file định dạng, để sử dụng từ tên file mở rộng
Cả cvLoadImage và cvSaveImage đều nằm trong module HighGUI
Khi bạn sử dụng xong bức ảnh đầu vào nhận được từ cvLoadImage(), loại bỏ
nó bằng hàm cvReleaseImage() Hàm này đưa ra một địa chỉ của con trỏ giống đầu vào của nó bởi việc nó làm là loại bỏ an toàn (Safe Release) Nó chỉ loại bức ảnh này khi bức ảnh là non-null Sau khi loại bỏ xong nó đặt giá trị con trỏ
về 0
Làm việc với Video tương tự như là việc với ảnh
Nhận các frame từ một webcam, hay các thiết bị video số khác thì dễ dàng như tải nó lên từ một file có sẵn Để nhận một khung từ camera ta chỉ việc thay cvCreateFileCapture() bằng hàm cvCreateCameraCapture()
Chúng ta có thể tạo cvCapture*Object với cvCreateFileCapture() Chúng ta sử dụng cvQueryFrame () để nhận từng frame và cvWaitkey(33) để chờ 33ms giữa từng frame Chúng ta sử dụng cvReleaseCapture() để loại bỏ capture khi ngừng
sử dụng
Copy một bức ảnh
Lưu trữ bức ảnh trong OpenCV
OpenCV lưu bức ảnh giống cấu trúc C, IplImage, Ipl viết tắt của image processing library
Kiểu dữ liệu IplImage được định nghĩa trong CXCORE Thêm vào dữ liệu ảnh thực, nó chứa một số đặc điểm để mô tả như sau:
Width - độ rộng bức ảnh tính theo pixel
Height - độ cao bức ảnh tính theo pixel
Depth - một kiểu tiền định nghĩa chỉ rõ lượng bits/pixel/channel
Ví dụ : Depth=IPL_DEPTH_8U, dữ liệu cho mỗi pixel kênh ảnh được lưu giữ như 8-bits không dấu
Trang 22 nChannel – số lượng của dữ liệu channel ảnh (từ 1- 4) Mỗi một channel chứa một kiểu của pixel dữ liệu
ví dụ: bức ảnh RGB có 3 kênh R (đỏ), G (xanh lá cây), B (xanh da trời)
Grayscale là bức ảnh chỉ chứa một kênh điểm ảnh sáng nhất
Truy cập giá trị điểm ảnh
Chúng ta có thể tạo ra rất nhiều hàm truy cập điểm ảnh mà không cần tác động trực tiếp đến dữ liệu ảnh thô
Cách dễ nhất để đọc từng điểm ảnh riêng lẻ là sử dụng hàm cvGet2D
cvScalar cvGet2D(const *CvArr, int row, int col)
Hàm này có 3 thuộc tính: một pointer trỏ đến dữ liệu chứa trong CvArr*, một mảng chỉ rõ vị trí hàng và cột Hàng topmost của điểm ảnh là row=0, và bottommost là row=height-1
2.2.5 Các hàm thực hiện xử lý ảnh
Thư viện HighGUI chỉ cung cấp các hàm thực hiện vào ra bức ảnh tuy nhiên vấn
đề xử lý ảnh mới thực sự là quan trọng và khó khăn OpenCV cung cấp các hàm thực hiện xử lý ảnh nằm trong thư viện cv Một bức ảnh không chỉ đơn giản là một mảng giá trị màu sắc khi chúng ta đề cập đến xử lý ảnh thì nó đã bao gồm các hàm xử lý liên quan đến cấu trúc của bức ảnh
Một số hàm xử lý ảnh thường xuyên sử dụng như sau:
Image morphology (hình thái học bức ảnh)
OpenCV cung cấp hàm chuyển đổi morphology nhanh chóng và tiện lợi khi làm việc với bức ảnh Cơ bản của morphology là dilation (giãn) và erosion (co) chúng ngày
Trang 23càng được sử dụng rộng rãi trong việc loại bỏ nhiễu, cô lập những thành phần riêng rẽ,
và liên kết các thành phần với nhau
Theshold (ngưỡng)
Chúng ta thường làm rất nhiều bước xử lý ảnh khác nhau và đưa ra những quyết định cuối cùng về điểm ảnh trên một bức ảnh hay nói cách khác là loại bỏ giá trị phía trên hoặc dưới một ngưỡng nào đó giữ lại nhưng điểm ảnh nằm trong khoảng giá trị mong muốn lúc đó ta dùng hàm threshold
2.2.6 Các hàm Histograms and Matching
Histogram
Trong việc phân tích hình ảnh thông tin về đối tượng và video, chúng ta thường muốn biểu diễn chúng giống như là một histogram Histogram có thể sử dụng để biểu diễn rất nhiều dạng khác nhau như phân bố màu của đối tượng, độ dốc mẫu cạnh của một đối tượng, hay xác suất phân bố vị trí của đối tượng
Tìm histogram được sử dụng rất nhiều trong các chương trình ứng dụng thị giác máy tính Histogram được sử dụng để dò tìm sự thay đổi giữa các cảnh trong video bằng cách đánh dấu khi cạnh và màu sắc thay đổi từ khung này đến khung khác Chúng sử dụng để nhận dạng nhưng điểm quan tâm trên một bức ảnh bằng cách gán mỗi điểm ảnh một “tag” chứa những Histogram của những đặc điểm gần nhất Histogram của cạnh, màu, góc và rất nhiều đặc điểm khác Một chuỗi các màu sắc, cạnh có thể dùng để xác nhận dù có hay không một video đã được copy trên web
Ghép mẫu template matching
Hàm ghép cvMatchTemplate() không dựa trên histogram, hơn nữa, hàm này ghép một bức ảnh thực đến một bức ảnh đầu vào bằng cách “Sliding” đường dẫn qua bức ảnh đầu vào này sử dụng thao tác ghép mô tả trong phần này
2.2.7 Hàm Contours
Mặc dù thuật toán như dò tìm cạnh candy có thể sử dụng để tìm ra cạnh pixel để phân bức ảnh thành các phần khác nhau Bước tiếp theo là xây dựng các cạnh này
thành contours
Trang 242.2.8 Cơ sở toán học của thuật toán CamShift
Camshift viết gọn của “Continuously Adaptive Mean Shift” là cơ sở của thuật toán theo dõi khuôn mặt trong OpenCV Nó bao gồm thuật toán cơ sở Mean Shift với thích ứng các bước thay đổi kích cỡ của vùng Nhân là một hàm step đơn giản nằm trong một bản đồ vỏ xác suất (skin-probability) Vỏ xác suất của mỗi một điểm ảnh được tính toán dựa trên màu sắc bằng cách sử dụng một phương pháp gọi là Histogram backprojection Màu sắc được đưa ra như Hue từ mô hình màu HSV
Kể từ nhân là một hàm step, Mean Shift ở mỗi một lần lặp thì chỉ đơn giản là giá trị trung bình x và y của vỏ xác suất đóng góp trong vùng hiện tại Điều này được xác định bằng cách chia moment thứ nhất của vùng này cho moment thứ không ở mỗi lần lặp và dịch chuyển vùng đến trọng tâm xác suất
Sau khi Mean Shift hội tụ đến một vị trí (x,y), phạm vi của vùng được cập nhật dựa trên giá trị hiện tại của moment thứ 0 Giá trị của bản cập nhật này có thể thay đổi, phạm vi tuyến tính của nó được giả định là tỉ lệ thuận với căn bậc 2 của tổng của các khoản đóng góp xác suất của khu vực hiện tại (ví dụ Moment thứ không) Chiều rộng
và chiều dài tại thời điểm thứ i sẽ được tính thông qua giá trị tại thời điểm thứ i-1, nghĩa là giá trị trước đó
Trong thuật toán CamShift, một bức ảnh về xác suất phân bố màu sắc của bức ảnh trong chuỗi video được tạo ra Đầu tiên nó tạo ra một mẫu mô tả hue sử dụng một biểu đồ màu sắc (color Histogram) và sử dụng không gian màu Hue Saturation Value (HSV) được tham chiếu từ không gian màu tiêu chuẩn RGB Vì phân bố màu sắc của các bức ảnh trong video thay đổi theo thời gian, nên thuật toán CamShift đã được sửa đổi để dễ dàng thích ứng với sự thay đổi phân bố xác suất màu sắc của mục tiêu nó theo dõi
Trong OpenCV thuật toán CamShift được điều chỉnh từ thuật toán Mean Shift
Và nó đươc tính toán như sau:
1) Chọn vị trí ban đầu của Search Window
2) Dùng thuật toán Mean Shift (lặp lại một hoặc nhiều lần), lưu moment thứ 0 này 3) Đặt kích cỡ của cửa sổ tìm kiếm bằng một hàm của moment thứ 0 tìm được trong bước 2
4) Lặp lại bước 2 và 3 cho đến khi hội tụ (vị trí dịch chuyển chính ít hơn giá trị threshold hiện tại)
Trang 252.3 Cơ bản về PIC16F877A
2.3.1 PIC là gì ?
PIC là viết tắt của “Programable Intelligent Computer”, tạm dịch là “ Máy tính thông minh khả trình” do hãng Microchip Technology đặt tên cho vi điều khiển đầu tiên của họ và phát triển thành dòng họ vi điều khiển PIC sau này
2.3.2 Đặc điểm nổi bật của PIC16F877A
Sử dụng công nghệ tích hợp RISC CPU
Người sử dụng có thể lập trình với 35 câu lệnh cơ bản
Tất cả câu lệnh thực hiện trong một chu kỳ lệnh, ngoại trừ một số câu lệnh
rẽ nhánh thực hiện trong 2 chu kỳ lệnh
Tốc độ hoạt động xung đồng hồ là DC-20MHZ
Bộ nhớ hoạt động là flash 8kx14 words
Bộ nhớ RAM 368x8 bytes
Bộ nhớ EFPROM 256x8 bytes
- Khả năng của bộ vi xử lý này
Khả năng ngắt lên đến 14 ngắt trong và ngắt ngoài
Ngăn nhớ Stack được phân chia làm 8 mức
Truy cập bộ nhớ bằng địa chỉ trực tiếp hoặc gián tiếp
Nguồn khởi động (POR)
Bộ tạo xung (PWRT) và bộ tạo dao động (OST)
Bộ đếm thời gian (WDT) với nguồn dao động trên chíp (nguồn dao động RC) hoạt động đáng tin cậy
Có mã chương trình bảo vệ
Phương thức cất giữ SLEEP
Có bảng lựa chọn dao động
Công nghệ CMOS FLASH/EFPRO nguồn mức thấp tốc độ cao
Thiết kế hoàn toàn tĩnh
Mạch chương trình nối tiếp có 2 chân
Mạch xử lý đọc ghi tới bộ nhớ chương trình
Dải điện thế hoạt động 2.0 đến 5.5V
Trang 26 Nguồn điện sử dụng 25mA
Dãy nhiệt độ công nghiệp và thuận lợi
Công suất tiêu thụ thấp
- Các đặc tính nổi bật của thiết bị ngoại vi trên Chip
TIMER0: 8 bits của bộ định thời, bộ đếm với hệ số tỉ lệ trước
TIMER1: 16 bits của bộ định thời, bộ đếm với hệ số tỉ lệ trước, có khả năng tăng trong khi ở chế độ sleep qua xung đồng hồ được cung cấp bên ngoài
TIMER2: 8 bits của bộ định thời, bộ đếm với 8 bits của hệ số tỉ lệ trước, hệ
số tỉ lệ sau
2.3.3 Sơ đồ các chân của PIC16F877A
Hình 7: PIC16F877A
Trang 27- Sơ đồ khối vi điều khiển PIC16F877A
Hình 8: Sơ đồ khối của PIC16F877A
Trang 28Đặc điểm:
Chân 13, 14 là các chân kết nối với thạch anh tạo dao động cho chip (Nó được ví như là quả tim của chíp) Ta mắc thêm vào 2 tụ điện có điện dung
= 33pF để tăng độ ổn định cho dao động thạch anh
PORTB vì PORTB lúc này đóng vai trò là ngõ xuất nên các thanh ghi TRISB trong chíp phải được đặt giá trị logic 1 (Nếu ta đặt ngõ B là ngõ nhập thì ta phải đặt giá trị logic 0)
Các thông số cần thiết khi làm việc với PIC ta dùng bảng datasheet của họ PIC16F877A
VDD: Là điện áp cấp nguồn cho vi điều khiển, nguồn điện cấp là 5V
GND: Là chân nối mass khi sử dụng cần thiết kế một mạch ổn áp để bảo vệ cho vi điều khiển , thường sử dụng IC ổn áp 7805
PORTA: Có 6 pin từ chân 2 đến chân 7
PORTB: Có 8 chân từ 34 đến 40, ngoài chức năng làm cổng xuất nhập còn
có thêm một số chức năng phụ khác
PORTC, PORTE: Tương tự như PORTB
Chân Reset (MCLR): Ngõ vào ở chân 1 dùng để thiết lập điều kiện đầu cho
Chuẩn giao tiếp RS232
Vấn đề giao tiếp giữa PC và vi điều khiển rất quan trọng trong các ứng dụng điều khiển, đo lường v v ghép nối qua cổng nối tiếp RS232 là một trong những kỹ thuật được sử dụng rộng rãi để ghép nối các thiết bị ngoại vi với máy tính Nó là một chuẩn giao tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều nhất là 2 thiết bị, chiều dài kết nối lớn nhất cho phép để đảm bảo truyền, nhận dữ liệu là 12.5m đến 25.4m, tốc
độ 20kbit/s, đôi khi là tốc độ 115kbit/s với một số thiết bị đặc biệt
Trang 29Ở đây tôi chọn chuẩn giao tiếp RS232 và điều khiển Active X Microsoft Communication 6.0 (MSComm)
Thiết lập giao diện cho chương trình
Viết mã cho chương trình
Giao diện của RS232-9-pin và chức năng các chân như sau:
- Chân 1: Data Carrier Detect (DCD): phát tín hiệu mang dữ liệu
- Chân 2: Receive Data (RXD): Nhận dữ liệu
- Chân 3: Transmit Data (TxD): Truyền dữ liệu
- Chân 4: Data Terminal Ready (DTR): Đầu cuối dữ liệu sẵn sàng kích hoạt bởi
bộ phận khi muốn truyền dữ liệu
- Chân 5: Signal Ground (SG): mass của tín hiệu
- Chân 6: Data Set Ready (DSR): Dữ liệu sẵn sàng, được kích hoạt bởi bộ nhận khi nó muốn truyền dữ liệu
- Chân 7: Request to Send: Yêu cầu gửi bộ truyền đặt đường này lên mức hoạt động khi sẵn sàng truyền dữ liệu
- Chân 8: Clear to Send (CTS): Xoá để gửi bộ nhận đặt đường này lên mức hoạt động để thông báo bộ truyền là nó đã sẵn sàng nhận tín hiệu
- Chân 9: Ring Indicate (RI): Báo chuông cho biết là bộ nhận đang nhận tín hiệu chuông
Hình 9: Cổng giao tiếp RS232
Trang 302.5 Giới thiệu về chíp mạch cầu L298N
IC L298N là mạch tích hợp đơn chíp có vỏ công suất 15 chân (multi watt 15) Là
IC mạch cầu đôi có khả năng hoạt động ở điện áp cao, dòng cao Nó có 2 chân enable
có chức năng cho phép hoặc không cho phép chíp hoạt động, độc lập với chân tín hiệu vào Cực phát (emitter) của transitor dưới của mỗi mạch cầu được nối với nhau và nối
ra chân ngoài để nối với mạch điện trở cảm ứng dòng khi cần
Nó có thêm một chân cấp nguồn giúp mạch logic có thể cấp nguồn ở điện thế thấp hơn
Bảng 1: Chức năng các chân của L298N
1; 15 Sensor A;
Sensor B
Nối chân này qua điện trở cảm ứng dòng xuống GND
để điều khiển dòng tải
Out 2
Ngõ ra của cầu A Dòng của tải mắc giữa 2 chân này được quy định bởi chân 1
4 VS Chân cấp nguồn cho tầng công suất, cần có một tụ
điện cảm kháng 100nF nối giữa chân này và chân GND
9 VSS Chân cấp nguồn cho khối logic Cần có tụ điện 100nF
giữa chân này với chân GND 10; 12 Input 3;
Input 4 Các chân logic ngõ vào của B
Trang 31- Bảng điều khiển động cơ sử dụng L298N
Ta có thể thay đổi trạng thái động cơ dựa vào bảng sự thật sau (Input 1; Input 2), ở đây tôi luôn để mức ra ở chân cho phép (enable) là mức cao
Bảng 2: Tóm tắt nguyên tắc điều khiển động cơ sử dụng L298N
Trang 32CHƯƠNG 3 XÂY DỰNG PHẦN MỀM ĐIỀU KHIỂN
Sơ đồ tổng quát của rô bốt di động
Hình 11: Sơ đồ khối tổng quát của rô bốt
3.1 Thị giác máy điều khiển rô bốt di động bám đối tượng
Mục tiêu của đồ án là điều khiển rô bốt bám theo một đối tượng sử dụng OpenCV Nó phải duy trì được khoảng cách nhất định giữa rô bốt và đối tương, khi đối tượng di chuyển rô bốt phải di chuyển theo dựa vào hình ảnh thu được từ webcam
để xác định đối tượng đi thẳng, rẽ phải, rẽ trái, đi tiến, đi lùi v v Nghĩa là chúng ta phải điều khiển cả tốc độ và hướng của rô bốt tuy nhiên trong đồ án này tôi chỉ điều khiển hướng, tốc độ của đối tượng có thể xem là không đổi Để làm được việc này, chúng ta phải nhận dạng được đối tượng và xác định được hướng di chuyển của nó Thứ hai phải xây dựng thuật toán bám đối tượng Thứ ba là phải xây dựng được phần cứng để kiểm định thuật toán CamShift
Có rất nhiều cách để dò tìm đối tượng ví dụ dựa trên hình dáng, âm thanh v v những thuật toán này thực sự rất phức tạp Để giảm độ khó của thuật toán theo dõi chúng ta đặt phía sau đối tượng một vật có những thuộc tính về màu sắc đặc biệt ví dụ
Trang 33bóng đèn led phát sáng màu đỏ, màu vàng, màu xanh v v Như vậy, lúc tiến hành theo dõi sẽ giảm được rất nhiều về việc xử lý nhiễu do nền và các đối tượng không mong muốn gây ra, giảm đáng kể sự nhầm lẫn đối tượng theo dõi Chương trình xử lý ảnh sử dụng thuật toán CamShift trong OpenCV để tiến hành theo dõi căn cứ vào màu sắc đối tượng Khoảng cách giữa rô bốt và đối tượng chúng ta đặt là cố định, dựa vào tâm của đối tượng tìm được qua thuật toán CamShift chúng ta biết được vị trí của đối tượng tham chiếu trên mặt phẳng ảnh Các thuộc tính nhận được sẽ truyền qua cổng giao tiếp RS232 xuống vi điều khiển PIC16f877A để điều khiển hướng động cơ một chiều (DC) thông qua mạch cầu điều khiển động cơ L298N
3.2 Thuật toán tính hướng và kích cỡ của đối tượng cần theo dõi
3.2.1 Thuật toán chung
Hình 12: Sơ đồ thuật toán chung
Trang 343.2.2 Nhận dạng và bám mục tiêu di động
Cấu trúc của hệ bám mục tiêu di động gồm hai phần chính Phần thứ nhất là phần
xử lý ảnh dựa vào chuỗi hình ảnh thu được từ webcam để nhận dạng và tính toán vị trí của đối tượng quan tâm
Phần thứ hai là phần điều khiển, dựa vào thông tin vị trí đối tượng nhận được trong mặt phẳng ảnh, tính toán tín hiệu điều khiển rô bốt sao cho đối tượng di chuyển được duy trì ở một vị trí nhất định trên mặt phẳng ảnh và ở một khoảng cách nhất định
Để giảm ảnh hưởng của nhiễu và giảm khối lượng tính toán trong xử lý ảnh nên các bước xử lý ảnh nhận dạng, thích nghi cũng được sử dụng Các bước này sẽ được trình bày lần lượt như dưới đây
Nhận dạng mục tiêu là bước quan trọng đầu tiên trong hệ thống bám mục tiêu di động Mục tiêu của quá trình này là lưu giữ các giá trị thuộc tính của đối tượng đã được chọn như đã nói ở trên các thuộc tính đó như cạnh, góc, các thuộc tính về màu sắc v v Trên cơ sở đó để so sánh nhằm phân biệt mục tiêu với nền và các mục tiêu khác Qua đó xác định được vị trí của mục tiêu trên mặt phẳng ảnh Trong quá trình tìm kiếm ta chia bức ảnh thành tập hợp các pixel bao gồm hai thành phần hoặc thuộc đối tượng hoặc thuộc nền Qua đó ta tiến hành xử lý các giá trị thuộc tính của đối tượng trong vị trí mới và tìm nhận dạng được đối tượng cần theo dõi
Mặt phẳng ảnh là mặt phẳng có gốc nằm phía trên bên trái, trục x là trục nằm ngang, trục y là trục thẳng đứng như hình vẽ
Hình 13: Mặt phẳng ảnh
Trang 35Căn cứ vào vị trí dịch chuyển của đối tượng trên mặt phẳng ảnh so với gốc toạ độ
mà ta tính toán các khả năng di chuyển của rô bốt sao cho đối tượng nằm ở một vị trí bất kỳ trên mặt phẳng ảnh
Tính toán vị trí của mục tiêu di động trong môi trường có nhiễu sử dụng thuật toán CamShift Căn cứ vào kết quả thu được về giá trị tâm của đối tượng qua thuật toán CamShift đề xuất thuật toán di chuyển như sau
Hình vẽ sau mô tả các vị trí tương ứng của đối tượng trên mặt phẳng ảnh với điều kiện di chuyển
Hình 14: Biểu diễn đối tượng di chuyển trên mặt phẳng ảnh
3.2.3 Chuyển đổi không gian màu từ RGB đến HSV
Chúng ta sử dụng hàm cvCvtColor() để chuyển đổi giữa các không gian màu trong OpenCV không gian màu chính là số lượng các kênh hay là chuyển đổi từ không gian màu này đến không gian màu khác
H: (Hue) vùng màu
S: (Saturation) Độ bão hoà màu
V( hay B): Độ sáng
Trang 36Kết quả chuyển đổi trong không gian màu
Hình 15: Chuyển đối không gian màu RGB đến HSV 3.2.4 Histogram
Trong việc nhận dạng đối tượng, bức ảnh và thông tin video, chúng ta thường muốn mô tả đối tượng dưới dạng biểu đồ (Histogram) để dễ quan sát Histogram có thể được sử dụng để chỉ ra sự khác nhau giữa các đối tượng về màu sắc, góc, cạnh các mẫu Gradient cạnh của đối tượng và chỉ ra xác suất phân bố màu sắc Trong mỗi một khung vùng màu mà chúng ta quan tâm được tính toán ở khung hình tiếp theo sau đó một chuỗi các khung hình liên tiếp sẽ được theo dõi với Histogram Histogram của đối tượng là duy nhất nếu giá trị Histogram mới nhận được gần với giá trị histogram nhất thì đối tượng đó sẽ được chọn
Tạo một Histogram Camshift theo dõi đối tượng dựa căn cứ vào việc so sánh Histogram màu sắc của đối tượng nhận được với giá trị của thuộc tính ở vị trí mới nên việc tạo một Histogram là điều thiết yếu đầu tiên trong mục đích nhận dạng đối tượng
Hình 16: Histogram
Trang 37Quan sát hai Histogram của đối tượng trong hình trên cho ta thấy thuộc tính màu sắc của hai đối tượng mà chúng ta cần theo dõi Mỗi thanh màu chỉ rõ có bao nhiêu pixel có giá trị “hue” Hue là một trong ba thuộc tính mô tả màu của pixel trong không gian màu HSV (Hue, Saturation, Value)
3.2.5 Lọc nhiễu Filter
Lọc thì được sử dụng để loại bỏ nhiễu, có nhiều nguyên nhân phát sinh nhiễu trong quá trình xử lý ảnh Ngoài ra lọc nhiễu còn quan trọng trong việc chúng ta giảm
độ phân giải của bức ảnh Có rất nhiều cách để chúng ta loại bỏ nhiễu, trong đồ án này,
do đối tượng theo dõi là vật bất kỳ nên tôi đặt các loại nhiễu thông thường qua đó sẽ tuỳ chỉnh tuỳ thuộc vào đối tượng nhận được
Kết quả lọc nhiễu sử dụng trong đồ án như sau
Hình 17: kết quả trước và sau khi lọc nhiễu
Trang 383.2.6 Thuật toán CamShift
Trong phần này tôi sẽ trình bày việc dùng thuật toán CamShift để theo dõi mục tiêu di động
Hình 18: Sơ đồ thuật toán CamShift
1) Histogram
Đầu tiên một Histogram sẽ được tạo ra, Histogram này chứa các thuộc tính liên quan đến màu sắc như đã trình bày ở phần trên Tiếp theo, tâm của và kích cỡ của mục tiêu được tính toán để theo dõi mục tiêu khi hình dạng và kích cỡ của nó thay đổi
2) Tính toán xác suất phân bố của mục tiêu căn cứ vào Histogram nhận được Histogram được tạo ra duy nhất một lần, lúc bắt đầu theo dõi Sau đó nó được sử dụng
để gán cho “xác suất đối tượng” giá trị mỗi điểm ảnh trong khung video tiếp theo 3) Dịch chuyển đến vị trí mới với mỗi khung hình vừa nhận được từ video, CamShift sẽ “dịch chuyển” đến vị trí mà nó ước lượng trên đối tượng nó sẽ mà tập trung nhiều điểm sáng nhất trong bức ảnh xác suất Nó tìm vị trí mới bắt đầu từ vị trí trước đó và tính toán giá trị trọng tâm của xác suất phân bố bên trong một hình chữ nhật Sau đó nó dịch chuyển vị trí của hình chữ nhật về trọng tâm vừa tìm được OpenCV sử dụng hàm cvCamShift() để thực hiện chuyển dịch này Việc tính toán trọng tâm trong Camshift thì dựa vào thuật toán Mean Shift như đã đề cập trước đó
Trang 39Kết quả tính toán tâm đối tượng khi dùng thuật toán CamShift
Hình 19: Kết quả tính toạ độ tâm bằng thuật toán CamShift
Dựa vào giá trị x, y vừa tìm được này ta có thể điểu khiển rô bốt chạy bám đối tượng
Kết quả theo dõi đối tượng
Hình 20: Kết quả bước đầu theo dõi đối tượng bằng thuật toán CamShift
Dựa vào kết quả nhận đươc như trên, ta sẽ gửi tín hiệu điều khiển này qua cổng kết nối RS232 để điều khiển rô bốt di động
Trang 403.2.7 Thiết kế hoàn chỉnh phần mềm điều khiển
Chương trình được thiết kế trên visual C++ 2008 (MFC Aplication) Giao diện chương trình điều khiển được chia thành 3 khối chính như trên hình sau
- DIEU KHIEN ROBOT Khối được xây dựng có chức năng điều khiển rô bốt quay phải, quay trái, đi tiến đi lui v v Đặc biệt nút lệnh “Tự động” được tính hợp chương trình xử lý ảnh OpenCV như đã nói ở trên
- MO CONG COM: Khối có chức năng thực hiện việc giao tiếp RS232 giữa PIC16F877A và laptop
- DIEU KHIEN DONG CO DC Khối thực hiện việc điều khiển động cơ một chiều
- Vmin: giá trị nhỏ nhất độ sáng của bức ảnh
- Vmax: giá trị lớn nhất độ sáng của bức ảnh
- Smin: giá trị bão hòa của bức ảnh
- Dilate: giá trị giãn của các thành phần ảnh
- Erode: giá trị co lại của thành phần ảnh
- Filter: các hàm lọc khác nhau sử dụng trong chương trình
- Histogram: giá trị histogram của đối tượng
- Backproject: quan sát bức ảnh từ phía sau