mobile robot opencv.pdf

82
ĐẠ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 HÀ NỘI-2010

Upload: sun-rise

Post on 13-Aug-2015

592 views

Category:

Documents


19 download

TRANSCRIPT

Page 1: mobile robot OpenCV.pdf

ĐẠ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

HÀ NỘI-2010

Page 2: mobile robot OpenCV.pdf

ĐẠ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

Page 3: mobile robot OpenCV.pdf

LỜ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

Page 4: mobile robot OpenCV.pdf

TÓ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.

Page 5: mobile robot OpenCV.pdf

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 4.1. Sơ đồ mạch dùng trong đồ án ............................................................................... 34

Page 6: mobile robot OpenCV.pdf

4.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

Page 7: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

DANH 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

Hình 25: Sơ đồ khối nguồn ........................................................................................ 35

Page 8: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

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

Page 9: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

DANH 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

Page 10: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

DANH 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

Page 11: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

1

MỞ ĐẦ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”.

Page 12: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

2

CHƯƠ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.

Page 13: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

3

1.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.

Page 14: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

4

Hình 1: PANrobot (nguồn: mobilerobot.org

Hình 2: Rô bốt MIDbo (nguồn: telepresenceoptions.com)

Page 15: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

5

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

Page 16: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

6

1.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.

1.4. Giới hạn của đồ án

- Đồ án tập trung chủ yếu vào xây dựng phần mềm điều khiển sử dụng thư viện OpenCV.

- Rô bốt chỉ thực hiện việc bám đối tượng trong một số môi trường và đối tượng nhất định mà ít bị ảnh hưởng của nhiễu.

- Mạch phần cứng và thuật toán điều khiển động cơ chỉ thực hiện việc điều khiển hướng của rô bốt, nghĩa là không điều khiển tốc độ của rô bốt.

- Sử dụng lại phần cơ khí đồ án khoá trước đã xây dựng được.

Page 17: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

7

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

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.

Page 18: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

8

Kể 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…).

Page 19: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

9

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

Page 20: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

10

2.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

Page 21: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

11

kể 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.

Page 22: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

12

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:

Smoothing (làm mịn).

Smoothing hay còn gọi là blurring nó là một thuật toán xử lý ảnh đơn giản và thường xuyên sử dụng. Có rất nhiều nguyên nhân chúng ta dùng đến smoothing nhưng nó thường dùng để loại bỏ nhiễu do máy ảnh sinh ra. Smoothing quan trọng khi bạn muốn giảm độ phân giải của một bức ảnh theo rất nhiều cách khác nhau.

Bằng việc thay thế kiểu smooth và các thông số sẽ có các bức ảnh tương đối khác nhau tuy theo mục đích sử dụng nhưng thường dùng nhất vẫn là CV_GAUSSIAN.

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

Page 23: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

13

cà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.

Page 24: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

14

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

Page 25: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

15

2.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.

Page 26: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

16

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

Page 27: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

17

- Sơ đồ khối vi điều khiển PIC16F877A.

Hình 8: Sơ đồ khối của PIC16F877A

Page 28: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

18

Đặ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

vi điều khiển. OSC1, OSC2: Hai chân này được sử dụng để nhận nguồn xung clock từ bên

ngoài cụ thể là từ thạch anh dao động. Các chân RC3, RC4 dùng để kết I2C. Các chân RC6, RC7 là chân kết nối RS232.

2.4. Giao tiếp RS232

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.

Page 29: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

19

Ở đâ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

Page 30: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

20

2.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

MW. 15 Tên Chức năng

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

2; 3 Out 1;

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

5; 7 Input 1;

Input 2

Chân ngõ vào của cầu A, tương thích chân TTL

6; 11 Enable A; Enable B

Chân ngõ vào Enable tương thích chuẩn TTL. Mức thấp của chân này sẽ cấm ngõ ra cầu A, đối với enable A; hoặc ngõ ra cầu B đối với enable B;

8 GND Chân mass

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

Page 31: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

21

13; 14 Output 3;

Output 4

Ngõ ra của cầu B, dòng của tải mắc giữa 2 chân này được quy định bởi chân 15.

Sơ đồ chân

Hình 10: Chíp mạch cầu L298N

- 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

Chiều điều khiển Input 1 Input 2

Dừng lại 0 0

Quay thuận 0 1

Quay ngược 1 0

Dừng lại 1 1

Vì vậy, để điều khiển động cơ chỉ cần điều khiển giá trị xuất ra từ cổng của PIC16f877A ở hai chân nối với Input 1 và Input 2.

Page 32: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

22

CHƯƠ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ụ

Page 33: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

23

bó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

Page 34: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

24

3.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

Page 35: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

25

Că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.

Page 36: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

26

Kế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

Page 37: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

27

Quan 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

Page 38: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

28

3.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 đó.

Page 39: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

29

Kế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.

Page 40: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

30

3.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.

Page 41: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

31

Hình 21: Giao diện phần mềm thiết kế hoàn chỉnh

Page 42: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

32

Hình 22: Kết quả thử nghiệm với phần mềm

Page 43: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

33

Hình 23: Kết quả thử nghiệm với phần mềm

Page 44: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

34

CHƯƠNG 4

XÂY DỰNG MẠCH PHẦN CỨNG

4.1. Sơ đồ mạch dùng trong đồ án

Mạch phần cứng được chia thành 4 khối:

- Khối điều khiển trung tâm sử dụng PIC16F877A.

- Khối nguồn.

- Khối điều khiển động cơ.

- Khối truyền thông RS232.

4.1.1. Khối điều khiển trung tâm

Khối điều khiển trung tâm là khối có chức năng điều khiển chính trong khối phần cứng bao gồm điều khiển động cơ và giao tiếp RS232. PIC16F877A được lựa chọn sử dụng trong đồ án đảm nhận chức năng khối điều khiển này.

Hình 24: Sơ đồ khối điều khiển trung tâm

Page 45: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

35

Trong khối phần cứng dùng PIC16F877A để điều khiển động cơ. Cờ ngắt dùng trong việc truyền nhận dữ liệu giữa PC và PIC16F877A.

4.1.2. Khối nguồn

Hình 25: Sơ đồ khối nguồn

Khối nguồn có chức năng lấy điện áp 12V từ Acqui điện áp này được đưa qua IC7805 để chuyển đổi thành điện áp 5V cung cấp nguồn cho PIC16F877A.

4.1.3. Khối truyền thông RS232

Hình 26: Sơ đồ khối truyền thông RS232

Khối này có nhiệm vụ nhận tín hiệu điều khiển từ cổng RS232 của laptop truyền xuống cho PIC16F877A điều khiển hoạt động của rô bốt.

Page 46: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

36

4.1.4. Khối điều khiển động cơ

Khối này có thành phần chính là một mạch cầu L298N có chức năng điều khiển hoạt động của các động cơ rô bốt. Nguyên tắc hoạt động của L298N như đã trình bày ở phần trên.

Hình 27: Sơ đồ nguyên lý mạch cầu điều khiển động cơ

Sau khi hoàn thiện các khối điều khiển ta xây dựng được mạch điều khiển phần cứng hoàn thiện như sau.

4.1.5. Phần cứng hoàn chỉnh

Hình 28: Sơ đồ phần cứng hoàn chỉnh

112233445566778 89910 10111112 12131314 141515

U1

L298

D1

DIODE

D2

DIODE

D3

DIODE

D4

DIODE

D5

DIODE

D6

DIODE

D7

DIODE

D8

DIODE

12

J1

CON2V+

R1RESISTOR

D9

LED

D10DIODE

12

J3

CON2

12

J4

CON2

C2CAP NP

C3CAP NP

V+V+V+V+V+V+

V-

R2

Resistor

R3Resistor

V+

V-

IN1_Motor1EN_motor1IN2_Motor1

+5VIN1_motor2EN_motor2IN2_motor2

12345678

J5

CON8

+5VV-

IN2_motor2EN_motor2IN1_motor2IN2_Motor1EN_motor1IN1_Motor1

Page 47: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

37

4.2. Tập lệnh điều khiển rô bốt

Bảng 3: Tập lệnh điều khiển rô bốt

Lệnh Động cơ 1 Động cơ 2 Rô bốt

1 Tiến

2 Lùi

3 Dừng lại

4 Tiến

5 Lùi

6 Dừng lại

f Tiến Tiến Đi thẳng

b Lùi Lùi Đi lùi

s Dừng Dừng Dừng lại

r Tiến Lùi Rẽ phải

l Lùi Tiến Rẽ trái

Page 48: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

38

CHƯƠNG 5

KẾT QUẢ THỰC HIỆN

Kết quả được thử nghiệm trong môi trường sau:

- Operating System: Window7 Ultimate. - Processor: Intel® Core™2 CPU T5500 @ 1.66GHz 1.67 GHz. - Installed memory (RAM): 2.00 GB. - System type: 32-bit Operating System. - Webcam: sony visual communication camera VGP-VCC4.

Môi trường tĩnh: rô bốt đứng yên đối tượng di chuyển phía trước rô bốt, môi trường tĩnh dùng để kiểm tra độ chính xác, tốc độ đáp ứng và độ tin cậy của thuật toán đã xây dựng.

Môi trường động: rô bốt di chuyển bám theo đối tượng, qua đó sẽ kiểm tra được khả năng đáp ứng và độ tin cậy của toàn hệ thống để đưa ra các điều chỉnh phù hợp với bài toán thực tế.

Thử nghiệm trong môi trường tĩnh và môi trường động được đặt dưới những điều kiện ánh sáng nhất định, Webcam được điều chỉnh ở những độ phân giải khác nhau qua đó ta sẽ có rút ra được đánh giá toàn diện hơn cho toàn hệ thống.

Đối tượng thử nghiệm là theo dõi vật tròn màu đỏ có tốc độ tăng dần và liên tục thay đổi em sử dụng tay để di chuyển vật này.

Biểu đồ giá trị X,Y là biểu đồ thay đổi giá trị của tâm đối tượng dò tìm được qua thuật toán đã xây dựng ở trên.

Dùng một biến “đếm” trong thuật toán để kiểm tra có bao nhiêu lần bị mất đối tượng do đối tượng di chuyển quá nhanh, hoặc kích thước quá nhỏ. Số lần mất đối tượng này trên biểu đồ giá trị X,Y là các đoạn thẳng nằm song song với trục nằm ngang.

Page 49: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

39

Hình 29: Hình ảnh robot hoàn chỉnh

Page 50: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

40

5.1. Kết quả thử nghiệm với môi trường tĩnh

Cùng một điều kiện môi trường nhưng bức ảnh có độ phân giải khác nhau sẽ cho ta kết quả khác nhau.

Môi trường tĩnh độ phân giải (160x120) kết quả cho thấy có tổng cộng 34 lần bị mất đối tượng do đối tượng di chuyển quá nhanh.

Biểu đồ 1: Giá trị toạ độ tâm đối tượng môi trường tĩnh (160x120).

Môi trường tĩnh webcam độ phân giải (176x144) kết quả cho thấy có tổng cộng 20 lần bị mất đối tượng do đối tượng di chuyển quá nhanh.

Biểu đồ 2: Giá trị toạ độ tâm đối tượng môi trường tĩnh (176x144).

0

50

100

150

200

250

300

350

113

326

539

752

966

179

392

510

5711

8913

2114

5315

8517

1718

4919

8121

1322

4523

7725

0926

4127

7329

0530

3731

6933

0134

33

X

Y

0

50

100

150

200

250

300

350

112

124

136

148

160

172

184

196

110

8112

0113

2114

4115

6116

8118

0119

2120

4121

6122

8124

0125

2126

4127

6128

8130

0131

21

X

Y

Page 51: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

41

Môi trường tĩnh webcam có độ phân giải (320x240) kết quả có 16 lần bị mất đối tượng do đối tượng di chuyển quá nhanh.

Biểu đồ 3: Giá trị toạ độ tâm đối tượng môi trường tĩnh (320x240)

Môi trường tĩnh webcam có độ phân giải (640x480) kết quả 17 lần bị mất đối tượng.

0

50

100

150

200

250

3001

128

255

382

509

636

763

890

1017

1144

1271

1398

1525

1652

1779

1906

2033

2160

2287

2414

2541

2668

2795

2922

3049

3176

X

Y

Page 52: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

42

Biểu đồ 4: Giá trị toạ độ tâm đối tượng môi trường tĩnh (640x480).

5.2. Kết quả thử nghiệm với môi môi trường động

Môi trường động webcam có độ phân giải (160x120) kết quả có 116 lần bị mất đối tượng.

Biểu đồ 5: Giá trị toạ độ tâm đối tượng môi trường động (160x120).

Môi trường động webcam có độ phân giải (176x144) kết quả có 97 lần mất đối tượng.

0

50

100

150

200

250

300

350

110

821

532

242

953

664

375

085

796

410

7111

7812

8513

9214

9916

0617

1318

2019

2720

3421

4122

4823

5524

6225

6926

7627

83

X

Y

0

50

100

150

200

250

300

350

118

236

354

472

590

610

8712

6814

4916

3018

1119

9221

7323

5425

3527

1628

9730

7832

5934

4036

2138

0239

8341

6443

4545

2647

07

X

Y

Page 53: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

43

Biểu đồ 6: Giá trị toạ độ tâm đối tượng môi trường động (176x144).

Môi trường động webcam có độ phân giải (320x240) kết quả có 91 lần bị mất đối tượng.

Biểu đồ 7: Giá trị toạ độ tâm đối tượng môi trường động (320x240).

Môi trường động webcam có độ phân giải (640x480) kết quả 89 lần bị mất đối

tượng.

0

50

100

150

200

250

300

350

118

236

354

472

590

610

8712

6814

4916

3018

1119

9221

7323

5425

3527

1628

9730

7832

5934

4036

2138

0239

8341

6443

4545

26

X

Y

0

50

100

150

200

250

300

350

119

037

956

875

794

611

3513

2415

1317

0218

9120

8022

6924

5826

4728

3630

2532

1434

0335

9237

8139

7041

5943

4845

3747

26

X

Y

Page 54: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

44

Biểu đồ 8: Giá trị toạ độ tâm đối tượng môi trường động (640x480).

Môi trường động đối tượng di chuyển ở tốc độ vừa phải phù hợp với tốc độ động cơ số lần mất đối tượng là 10.

Biểu đồ 9: Giá trị toạ độ tâm đối tượng môi trường động tốc độ không đổi

Nhận xét: Số lần mất đối tượng biểu hiện rõ nhất trên biểu đồ của của môi trường động, giống như nhận xét tổng quan lúc đầu các thuật toán trong môi trường tĩnh thực

0

50

100

150

200

250

300

350

113

627

140

654

167

681

194

610

8112

1613

5114

8616

2117

5618

9120

2621

6122

9624

3125

6627

0128

3629

7131

0632

4133

76

X

Y

0

50

100

150

200

250

300

110

921

732

543

354

164

975

786

597

310

8111

8912

9714

0515

1316

2117

2918

3719

4520

5321

6122

6923

7724

8525

9327

01

X

Y

Page 55: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

45

sự đã bỏ khá xa trong môi trường động. Biểu hiện cụ thể trong các thử nghiệm trên (ví dụ: webcam có độ phân giải (640x480) trong môi trường tĩnh có 17 lần bị mất đối tượng, trong môi trường động là 89 lần).

Có nhiều nguyên nhân, tuy nhiên trong trường hợp này phần lớn là do tốc độ động cơ 1 chiều được chọn quá chậm không đáp ứng kịp yêu cầu của phần mềm điều khiển. Cụ thể lúc theo dõi đối tượng ở tốc độ đối tượng ở mức độ phù hợp với tốc độ động cơ thì hệ thống làm việc rất tốt, số lần mất đối tượng trong môi trương động lúc này chỉ là 9.

Hệ thống đã được thử nghiệm ở nhiều trường hợp, trong hầu hết các tình huống khi điều kiện ánh sáng phù hợp, rô bốt có thể theo dõi đối tượng trên đường thẳng và các ngã rẽ, nếu đối tượng dừng lại rô bốt luôn điều chỉnh được đối tượng nằm ở vị trí mong muốn trên mặt phẳng ảnh. Tuy nhiên nếu trường hợp đối tượng di chuyển quá nhanh thì hệ thống gặp một ít vấn đề do tốc độ hệ thống không đáp ứng kịp.

Do tầm nhìn và tốc độ của webcam còn hạn chế, tốc độ đáp ứng của hệ thống không cao, do đó nếu đối tượng chuyển động quá nhanh hoặc hướng di chuyển thay đổi quá nhanh thì hệ thống sẽ bị mất đối tượng.

Hệ thống làm việc tốt dưới điều kiện ánh sáng vừa phải, nếu môi trường có độ sáng quá cao như ánh sáng mặt trời thì hệ làm việc rất kém do màu và độ sáng của đối tượng luôn thay đổi khi đối tượng thay đổi hướng

Page 56: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

46

KẾT LUẬN

Đánh giá kết quả đạt được

Báo cáo này mô tả hệ thống rô bốt di động bám đối tượng sử dụng thư viện xử lý ảnh OpenCV của Intel. Thuật toán sử dụng để nhận hình ảnh từ webcam tiến hành khử nhiễu, histogram, sử dụng thuật toán CamShift, tính toán tọa độ tâm, kích cỡ, góc, thiết kế khối giao tiếp RS232 sử dụng Microsoft Communication Version 6.0. Thiết kế mạch điều khiển động cơ sử dụng PIC16F877A. Dưới những điều kiện ánh sáng nhất định đối tượng có thể được tìm ra nhanh chóng chính xác mà ít bị ảnh hưởng của nhiễu.

Hoàn chỉnh được cả phần cứng và phần mềm của rô bốt, tiến hành chạy thử trên nhiều dạng môi trường khác nhau, ban đêm, ban ngày, ánh sáng mạnh, ánh sáng yếu, đường thẳng, đường vòng…kết quả, rô bốt luôn bám theo giữ đối tượng nằm ở trên một phần của mặt phẳng ảnh mà ta chọn.

Tuy nhiên chương trình còn hạn chế trong thiết kế phần cứng (khung xe), phần này còn yếu nên gây khó khăn trong việc di chuyển và động cơ của rô bốt di chuyển tốc độ chậm do đó không đáp ứng được tốc độ của webcam của rô bốt. Xử lý ảnh phụ thuộc rất nhiều vào chất lượng hình ảnh và tốc độ chụp hình của webcam. Tốc độ của rô bốt là cố định do chưa xây dựng thuật toán điều khiển tốc độ rô bốt phù hợp tốc độ dịch chuyển của đối tượng đang theo dõi.

Chương trình có thể được cải thiện bằng cách thêm một số hàm liên quan đến xử lý ảnh như đã trình bày ở trên. Tốc độ theo dõi đối tượng của thuật toán CamShift là tương đối thấp và dễ bị mất đối tượng ở một số điều kiện nhất định như đối tượng quá nhỏ hoặc di chuyển quá nhanh. Nhược điểm của thuật toán CamShift có thể được cải thiện bằng thuật toán lọc Kalman. Điều này chưa được nghiên cứu do thời gian có hạn.

Chương trình điều khiển mới được thử nghiệm trên một số môi trường nhất định kết quả đạt được là tương đối tốt. Tuy nhiên trong xử lý ảnh vấn đề nhiễu trong môi trường rất quan trọng do đó cần có thêm nhiều thử nghiệm nữa mới có thể đánh giá được độ tin cậy của kết quả đạt được.

Webcam đang sử dụng có khả năng lọc nhiễu tương đối tốt. Tuy nhiên thời gian tính toán của rô bốt sẽ tăng lên nếu độ tương phản của webcam tăng lên. Trong ứng dụng này em sử dụng webcam có độ phân giải có thể điều chỉnh được cụ thể như sau

Page 57: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

47

(160x120, 176x144, 320x240, 640x480). Kết quả thực hiện cho thấy việc xử lý nhiễu khó khăn hơn với các webcam có độ phân giải tăng dần do nhiễu ảnh không cần thiết tăng lên, gần như không có thay đổi nhiều. Tuy nhiên với webcam có độ phân giải cao hơn thì chưa được kiểm nghiệm.

Các hàm lọc nhiễu có thể loại bỏ nhiễu gần như hoàn toàn, nhưng nó phải quét bức ảnh quá nhiều lần, do đó nó sẽ làm tăng thời gian tính toán của chương trình, các hàm này cần được cải thiện và tối ưu hơn.

Rô bốt được xây dựng để di chuyển trong trường hợp webcam đặt ở vị trí cao hơn so với đối tượng.

Hướng phát triển của đồ án.

Rô bốt chỉ được thử nghiệm trên hệ thống có tốc độ thay đổi chậm, cần phải được thử nghiệm với hệ thống có tốc độ nhanh hơn.

Qua thử nghiệm cho thấy rô bốt hoạt động tốt. Thay vì dò tìm một vùng đặc biệt trên đối tượng như đường tròn màu đỏ, màu xanh v..v. Hệ thống cần được cải thiện để dò tìm đối tượng trực tiếp dựa vào các vùng đặc biệt trên đối tượng. Không chỉ màu sắc của đối tượng được sử dụng mà cần quan tâm đến các đặc điểm của cạnh, góc, như vậy sẽ tăng được độ tin cậy cho việc dò tìm đối tượng.

Phần xử lý ảnh nên bổ sung thêm bộ lọc Kalman để theo dõi những đối tượng chuyển động nhanh, kích thước bé sẽ khắc phục được nhược điểm của thuật toán CamShift.

Phần cứng cần bổ sung thêm thuật toán tăng, giảm tốc độ theo sự thay đổi tốc độ của đối tượng.

Kết quả thử nghiệm còn mang tính trực quan do đó cần xây dựng được khối phục vụ riêng cho việc thử nghiệm kết quả trong xử lý ảnh.

Page 58: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

48

PHỤ LỤC A

CHƯƠNG TRÌNH XỬ LÝ ẢNH

//----------------------------------------------------------------------------------------------------

// Chương trình xử lý ảnh sử dụng trong đồ án

// Nguyễn Xuân Đức K51H-CDT

// ngày 8.12.2010

// Ngôn ngữ C++

//-----------------------------------------------------------------------------------------------------

#include "stdafx.h"

#include "afx.h"

#include "cv.h"

#include "highgui.h"

#include "stdio.h"

#include "cxcore.h"

#include <windows.h>

#include <tchar.h>

#include <stdarg.h>

#include <iostream>

#include <fstream>

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

CvHistogram *hist = 0;

int backproject_mode = 0;

int select_object = 0;

Page 59: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

49

int track_object = 0;

int show_hist = 1;

CvPoint origin;

CvRect selection;

CvRect track_window;

CvBox2D track_box;

CvConnectedComp track_comp;

int hdims = 16;

float hranges_arr[] = {0,180};

float* hranges = hranges_arr;

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

CvPoint boxcenter,h;

int d2, d3,count1=0, dem=0;

int high_switch_value = 256;

int highInt = 0;

int low_switch_value = 0;

int lowInt = 0;

int d0=0;

CvPoint seed_point = cvPoint(305,195);

CvScalar color = CV_RGB(250,255,255);

int g_switch_value = 0;

int filterInt = 0;

int lastfilterInt = -1;

//int position;

void switch_callback( int position ){

if( position == 0 ){

Page 60: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

50

cvSmooth( backproject, backproject, CV_GAUSSIAN,3,3 );

}else if(position==1){

cvSmooth( backproject, backproject, CV_GAUSSIAN,5,5 );

}else if(position==2){

cvSmooth( backproject, backproject, CV_GAUSSIAN, 7, 7 );

}else if(position==3){

cvSmooth(backproject,backproject,CV_BLUR,7,7);

}else if (position==4){

cvSmooth(backproject,backproject,CV_MEDIAN,7,7);

}

}

IplConvKernel* element = 0;

int element_shape = CV_SHAPE_RECT;

//the address of variable which receives trackbar position update

int open_pos=0, close_pos=0, erode_pos=0, dilate_pos=0;

CString data_send_RS232;

COleVariant tmp(data_send_RS232);

void Opening(int pos)

{

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

cvErode(backproject,backproject,element,1);

cvDilate(backproject,backproject,element,1);

cvReleaseStructuringElement(&element);

}

void Closing(int pos)

{

Page 61: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

51

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

cvDilate(backproject,backproject,element,1);

cvErode(backproject,backproject,element,1);

cvReleaseStructuringElement(&element);

}

void Erosion(int pos)

{

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

cvErode(backproject,backproject,element,1);

cvReleaseStructuringElement(&element);

}

void Dilation(int pos)

{

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

cvDilate(backproject,backproject,element,1);

cvReleaseStructuringElement(&element);

}

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

{

if( !image )

return;

if( image->origin )

y = image->height - y;

if( select_object )

Page 62: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

52

{

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

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

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

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

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

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

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

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

selection.width -= selection.x;

selection.height -= selection.y;

}

switch( event )

{

case CV_EVENT_LBUTTONDOWN:

origin = cvPoint(x,y);

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

select_object = 1;

break;

case CV_EVENT_LBUTTONUP:

select_object = 0;

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

track_object = -1;

break;

}

Page 63: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

53

}

// Chuyen doi tu khoang gian mau HSV den RGB

CvScalar hsv2rgb( float hue )

{

int rgb[3], p, sector;

static const int sector_data[][3]=

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

hue *= 0.033333333333333333333333333333333f;

sector = cvFloor(hue);

p = cvRound(255*(hue - sector));

p ^= sector & 1 ? 255 : 0;

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

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

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

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

}

void CTUBODlg::OnBnClickedButtonAuto()

{

FILE * xFile;

FILE * yFile;

FILE * demFile;

fopen_s (&demFile,"dem.txt","w");

fopen_s (&xFile,"X.txt","w");

fopen_s (&yFile,"Y.txt","w");

UpdateData(true);

Setting();

Page 64: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

54

CvCapture* capture = 0;

capture = cvCaptureFromCAM(0);

if( !capture )

{

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

// return -1;

}

printf( "Hot keys: \n"

"\tESC - quit the program\n"

"\tc - stop the tracking\n"

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

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

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

// Tao track_bar.

cvNamedWindow( "Histogram", 1 );

cvNamedWindow( "MobileRobot", 1 );

cvSetMouseCallback( "MobileRobot", on_mouse, 0 );

cvCreateTrackbar( "Vmin", "MobileRobot", &vmin, 256, 0 );

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

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

cvCreateTrackbar("Dilate","MobileRobot",&dilate_pos,10,Dilation);

cvCreateTrackbar("Erode","MobileRobot",&erode_pos,10,Erosion);

cvCreateTrackbar("Filter","MobileRobot", &g_switch_value, 5, switch_callback );

//start:

for(;;)

{

Page 65: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

55

IplImage* frame = 0;

int i, bin_w, c;

frame = cvQueryFrame( capture );

if( !frame )

break;

if( !image )

{

/* allocate all the buffers */

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

image->origin = frame->origin;

cvFloodFill( image, seed_point, color, cvScalarAll(5.0), cvScalarAll(5.0), NULL, 4, NULL );

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

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

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

gray = cvCreateImage( cvSize(320,240), 8, 1 );

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

//cvThreshHist(hist,0);

hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );

histimg = cvCreateImage( cvSize(320,200), 8, 3 );

cvThreshold(histimg,histimg,low_switch_value,high_switch_value,CV_THRESH_BINARY);

cvZero( histimg );

}

cvCopy( frame, image, 0 );

cvCvtColor( image, hsv, CV_BGR2HSV );

if( track_object )

Page 66: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

56

{

int _vmin = vmin, _vmax = vmax;

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

cvScalar(180,256,MAX(_vmin,_vmax),0), mask );

cvSplit( hsv, hue, 0, 0, 0 );

if( track_object < 0 )

{

float max_val = 0.f;

cvSetImageROI( hue, selection );

cvSetImageROI( mask, selection );

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

cvNormalizeHist(hist,20*255);

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

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

cvResetImageROI( hue );

cvResetImageROI( mask );

track_window = selection;

track_object = 1;

cvZero( histimg );

bin_w = histimg->width / hdims;

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

{

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

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

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

Page 67: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

57

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

color, -1, 8, 0 );

}

}

cvCalcBackProject( &hue, backproject, hist );

cvFloodFill( backproject, seed_point, color, cvScalarAll(5.0), cvScalarAll(5.0), NULL, 4, NULL );

cvNormalizeHist(hist,20*255);

cvEqualizeHist( backproject, backproject );

switch_callback(g_switch_value);

Erosion(erode_pos);

Dilation(dilate_pos);

//Closing(close_pos);

cvAnd( backproject, mask, backproject, 0 );

cvCamShift( backproject, track_window,

cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),

&track_comp, &track_box );

track_window = track_comp.rect;

if( backproject_mode )

cvCvtColor( backproject, image, CV_GRAY2BGR );

if(!image->origin)

track_box.angle = -track_box.angle;

cvCircle( image, boxcenter, 50, CV_RGB(255,0,0), 1, 8,0);\

track_box.angle = -track_box.angle;

Page 68: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

58

CvPoint2D32f dcenter=track_box.center;

boxcenter=cvPointFrom32f(dcenter);

m_IntX=boxcenter.x;

m_IntY=boxcenter.y;

fprintf (xFile, " %4d\n",m_IntX);

fprintf (yFile, " %4d\n",m_IntY);

float h=track_box.size.height;

float w=track_box.size.width;

float s=h*w;

m_floatkichthuoc=s;

m_floatGoc=track_box.angle;

cvCircle( image, boxcenter, 3, CV_RGB(0,255,0), -1, 8,0);

}

int d=(boxcenter.x);

int d1=(boxcenter.y);

count1 +=1;

if(count1==5){

if ((d!=d2)||(d1!=d3)){

d2=d;

d3=d1;

if ((115<=d)&& (d<=185)&&(150<=d1)&& (d1<=200))

{

data_send_RS232= "s";

m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput));

}

Page 69: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

59

else if(d1>200)

{

data_send_RS232= "b";

m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput));

}

else if((d1>0)&&(d1<150)&&(115<=d)&&(d<=185))

{

data_send_RS232= "f";

m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput));

}

else if((d>185)&&(d1>0)&&(d1<=200))

{

data_send_RS232= "r";

m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput));

}

else if((d>0)&&(d<115)&&(d1>0)&&(d1<=200))

{

data_send_RS232= "l";

m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput));

}

}

else if (((d==d2)&&(d1==d3)&&(d!=0)&&(d1!=0))&&((d1<100)||(d1>200)||(d<115)||(d>185))){

dem= dem+1;

data_send_RS232= "s";

Page 70: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

60

m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput));

}

count1=0;

}

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

{

cvSetImageROI( image,selection );

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

cvResetImageROI( image );

}

cvSaveImage("image.jpg",image);

cvSaveImage("histimg.jpg",histimg);

cvSaveImage("backproject.jpg",backproject);

cvShowImage( "MobileRobot", image );

cvShowImage( "Histogram", histimg );

cvShowImage( "backproject",backproject);

c = cvWaitKey(10);

if( (char) c == 27 )

break;

switch( (char) c )

{

case 'b':

backproject_mode ^= 1;

break;

case 'c':

track_object = 0;

Page 71: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

61

cvZero( histimg );

break;

case 'h':

show_hist ^= 1;

if( !show_hist )

cvDestroyWindow( "Histogram" );

else

cvNamedWindow( "Histogram", 1 );

break;

default:

;

}

}

cvDestroyWindow("backproject");

cvDestroyWindow("Histogram");

cvDestroyWindow("MobileRobot");

cvReleaseImage(&image);

cvReleaseImage(&histimg);

cvReleaseCapture( &capture );

cvReleaseImage( &backproject);

fprintf(demFile," %4d\n",dem);

fclose (xFile);

fclose (yFile);

fclose (demFile)

Page 72: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

62

PHỤ LỤC B

CHƯƠNG TRÌNH ĐIỀU KHIỂN ROBOT

//----------------------------------------------------------------------------------------------------

// Khối điều khiển Robot sử dụng PIC16F877A và L298N

// Nguyễn Xuân Đức K51H-CDT

// Ngày 8.12.2010

// Ngôn ngữ: CCS C complier

//-----------------------------------------------------------------------------------------------------

#include <16F877A.h>

#include <defs_16f877a.h>

#device *=16 adc=10

#fuses nowdt,hs,noput,noprotect,nodebug,nobrownout,nolvp, nocpd,nowrt

#use delay(clock=20000000,RESTART_WDT) // Sets crystal oscillator at 20 megahertz

#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) //Sets up serial port output pin & baud rate

char value;

void forward(){

rb4=1;

rb5=0;

rb6=0;

rb7=1;

}

void backward(){

rb4=0;

rb5=1;

rb6=1;

Page 73: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

63

rb7=0;

}

void right(){

rb4=1;

rb5=0;

rb6=1;

rb7=0;

}

void left(){

rb4=0;

rb5=1;

rb6=0;

rb7=1;

}

void full_stop(){

rb4=0;

rb5=0;

rb6=0;

rb7=0;

}

void M2_forward(){

rb4=1;

rb5=0;

}

void M2_stop(){

rb4=0;

Page 74: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

64

rb5=0;

}

void M2_backward(){

rb4=0;

rb5=1;

}

void M1_forward(){

rb6=0;

rb7=1;

}

void M1_stop(){

rb6=0;

rb7=0;

}

void M1_backward(){

rb6=1;

rb7=0;

}

#INT_RDA

void RDA_interrupt(){

value = getc();

delay_ms(10);

putc(value);

switch(value)

{

Page 75: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

65

case 'f': forward(); break; // neu ky tu nhan duoc la '0' di thang.

case 'l': left(); break;

case 'r': right(); break;

case 'b': backward(); break;

case '1': M1_forward(); break;

case '2': M1_backward(); break;

case '3': M1_stop(); break;

case '4': M2_forward(); break;

case '5': M2_backward(); break;

case '6': M2_stop(); break;

default: full_stop();break;

}

}

void main(){

ENABLE_INTERRUPTS(INT_RDA);

enable_interrupts(global);

SET_TRIS_B(0X00);

RB3=1;

RB2=1;

RB0=1;

while(true)

{

}

}

//-----------------------------------------------------------------------------------------

Page 76: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

66

PHỤ LỤC C

CHƯƠNG TRÌNH TRUYỀN THÔNG RS232

//----------------------------------------------------------------------------------------------------

// Khối truyền thông RS232 sử dụng công cụ Microsoft Communication version 6.0

// Nguyễn Xuân Đức K51H-CDT

// Ngày: 8.12.2010

// Ngôn ngữ : C++ 2008 (MFC Aplication).

//-----------------------------------------------------------------------------------------------------

void CTUBODlg::InitComboBox(void)

{

// ComboBox ComPort

m_cboComPort.ResetContent();

m_cboComPort.AddString(L"COM1");

m_cboComPort.AddString(L"COM2");

m_cboComPort.AddString(L"COM3");

m_cboComPort.AddString(L"COM4");

m_cboComPort.AddString(L"COM5");

m_cboComPort.AddString(L"COM6");

m_cboComPort.AddString(L"COM7");

m_cboComPort.AddString(L"COM8");

m_cboComPort.AddString(L"COM9");

m_cboComPort.SetCurSel(2);

// ComboBox BitRate

m_cboBitRate.ResetContent();

m_cboBitRate.InsertString(0,L"600");

m_cboBitRate.InsertString(1,L"1200");

Page 77: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

67

m_cboBitRate.InsertString(2,L"2400");

m_cboBitRate.InsertString(3,L"4800");

m_cboBitRate.InsertString(4,L"9600");

m_cboBitRate.InsertString(5,L"14400");

m_cboBitRate.InsertString(6,L"19200");

m_cboBitRate.InsertString(7,L"28800");

m_cboBitRate.InsertString(8,L"38400");

m_cboBitRate.InsertString(9,L"56000");

m_cboBitRate.InsertString(10,L"57600");

m_cboBitRate.InsertString(11,L"115200");

m_cboBitRate.InsertString(12,L"128000");

m_cboBitRate.InsertString(13,L"256000");

m_cboBitRate.SetCurSel(6);

// ComboBox Data Bits

m_cboDataBit.ResetContent();

m_cboDataBit.AddString(L"5");

m_cboDataBit.AddString(L"6");

m_cboDataBit.AddString(L"7");

m_cboDataBit.AddString(L"8");

m_cboDataBit.SetCurSel(3);

// ComboBox Stop Bit

m_cboStopBit.ResetContent();

m_cboStopBit.AddString(L"1");

m_cboStopBit.AddString(L"1.5");

m_cboStopBit.AddString(L"2");

m_cboStopBit.SetCurSel(0);

Page 78: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

68

// ComboBox parity bit

m_cboParityBit.ResetContent();

m_cboParityBit.InsertString(0,L"None");

m_cboParityBit.InsertString(1,L"Old");

m_cboParityBit.InsertString(2,L"Even");

m_cboParityBit.InsertString(3,L"Mark");

m_cboParityBit.InsertString(4,L"Space");

m_cboParityBit.SetCurSel(0);

// ComboBox handshaking

m_cboHandshaking.ResetContent();

m_cboHandshaking.AddString(L"None");

m_cboHandshaking.AddString(L"XON/XOFF");

m_cboHandshaking.AddString(L"RTS");

m_cboHandshaking.AddString(L"RTS/CTS+XON/XOFF");

m_cboHandshaking.SetCurSel(0);

}

void CTUBODlg::Setting(void)

{

if (m_mscomm1.get_PortOpen())

m_mscomm1.put_PortOpen(false);

// Thiet lap ten cong

m_mscomm1.put_CommPort(m_cboComPort.GetCurSel()+1);

// Thiet lap bat tay

m_mscomm1.put_Handshaking(m_cboHandshaking.GetCurSel());

// Thiet lap tan so bit du lieu bit stop

CString strBitRate=getCurStrInCombobox(m_cboBitRate);

Page 79: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

69

CString strParity=getCurStrInCombobox(m_cboParityBit);

CString strDataBit=getCurStrInCombobox(m_cboDataBit);

CString strStopBit=getCurStrInCombobox(m_cboStopBit);

CString strSetting;

strSetting.Format(_T("%s,%c,%s,%s"),strBitRate,strParity[1],strDataBit,strStopBit);

m_mscomm1.put_Settings(strSetting);

// Thiet lap khac

m_mscomm1.put_RThreshold(1);

m_mscomm1.put_InputLen(1); // Moi lan doc mot ky tu

m_mscomm1.put_InBufferSize(1024);

m_mscomm1.put_InputMode(0); // 0- text mode, 1- binary mode

m_mscomm1.put_OutBufferSize(1024);

m_mscomm1.put_PortOpen(true); // mo cong

}

void CTUBODlg::OnBnClickedButtonSend()

{

UpdateData(TRUE);

Setting();

m_mscomm1.put_Output(COleVariant(m_strTransfer));//strOutput));

UpdateData(false);

}

void CTUBODlg::OnBnClickedButtonClear()

{

Page 80: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

70

UpdateData();

m_strReceive="";

UpdateData(false);

}

void CTUBODlg::OnCommMscomm1()

{

count+=1;

VARIANT data;

switch (m_mscomm1.get_CommEvent()){

case 1: // comEvSend

break;

case 2: // comEvReceive

data =m_mscomm1.get_Input();

m_strReceive += (CString)data.bstrVal;

if (count==500){

m_strReceive="";

count=0;

}

// UpdateData(FALSE);

break;

case 3: // comEvCTS

break;

case 4: // ComEvDSR

break;

case 5: // comEvCD

break;

Page 81: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

71

case 6: // comEvRing

break;

case 7: // comEvEOF

break;

default: break;

};

UpdateData(false);

}

Page 82: mobile robot OpenCV.pdf

Yahoo:thoi_chao_em_12325 Email:[email protected]

72

TÀI LIỆU THAM KHẢO

[1] Gary Bradski & Adrian Kaehler. Learning OpenCV.

[2] Ivor Horton's. Beginning Visual C++ 2008.

[3] Microchip, Datasheet PIC 16F87XA.

[4] http://blog.gmane.org/gmane.comp.lib.opencv/month=20090401

[5] http://extremeelectronics.co.in/avr-tutorials/rs232-communication-the-level-conversion/

[6] http://homepages.inf.ed.ac.uk/rbf/CVonline/

[7] http://www.instructables.com/id/Control-your-motors-with-L293D

[8] http://nashruddin.com/opencv-examples-for-operation-on-images.html

[9] http://www.pages.drexel.edu/~nk752/distanceTut.html

[10] http://www.sourcecodeonline.com/list?q=object_tracking_using_opencv