Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 48 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
48
Dung lượng
5,03 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC LẠC HỒNG *** BÁO CÁO NGHIÊN CỨU KHOA HỌC ĐỀ TÀI: NGHIÊN CỨU, ỨNG DỤNG OPENCV VÀ KINECT HỖ TRỢ DÒ ĐƯỜNG ĐI CHO ROBOT THỰC HIỆN: ThS NGUYỄN PHÁT NHỰT KS TRƯƠNG THỊ QUỲNH HƯƠNG Đồng Nai, Năm 2012 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC LẠC HỒNG *** BÁO CÁO NGHIÊN CỨU KHOA HỌC ĐỀ TÀI: NGHIÊN CỨU, ỨNG DỤNG OPENCV VÀ KINECT HỖ TRỢ DÒ ĐƯỜNG ĐI CHO ROBOT THỰC HIỆN: ThS NGUYỄN PHÁT NHỰT KS TRƯƠNG THỊ QUỲNH HƯƠNG Đồng Nai, Năm 2012 Mục lục: Trang MỞ ĐẦU Chương 1: Giới thiệu tổng quan đề tài 1.1 Tổng quan phát triển robot giới .3 1.2 Robot dịch vụ 1.3 Các tảng phần mềm cho robot .7 1.4 Hệ điều hành robot 1.4.1 ROS (www.ros.org) .9 1.4.2 Microsoft Robotics Developer Studio 10 1.4.3 URBI (www.urbiforge.com) 12 1.4.4 OROCOS 13 1.4.5 Skilligent (skilligent.com) 14 1.4.6 Robotics ERSP 14 1.4.7 LabVIEW Robotics 15 1.5 Giới thiệu thiết bị Kinect 16 1.5.1 Giới thiệu chung 16 1.5.2 Các thành phần Kinect .17 1.5.3 Tiêu cự, góc mở IR camera RGB camera: 20 1.5.4 Nguồn cung cấp công suất tiêu thụ: .20 1.5.5 Công suất tiêu thụ đo thực nghiệm: 21 1.5.6 Môi trường hoạt động 21 1.6 Thư viện OpenCV .21 1.6.1 Tổng quan thư viện OpenCV 21 1.6.2 Những khả OpenCV 21 1.6.3 Cấu tạo OpenCV 22 1.7 Thư viện hỗ trợ Kinect .23 1.7.1 Libfreenect: 23 1.7.2 Code Laboratories Kinect: 23 1.7.3 OpenNI: .23 1.7.4 Kinect SDK beta: .23 1.7.5 Point Cloud Library .24 Chương 2: Nội dung nghiên cứu 25 2.1 Tổng quan SIFT 25 2.2 Nội dung giải thuật 26 2.2.1 Dị tìm cực trị cục 26 2.2.2 Trích xuất keypoint 29 2.2.3 Gắn hướng cho keypoint 30 2.2.4 2.3 Tạo mô tả cục 31 Mơ tả xây dựng chương trình xác định vị trí đối tượng 32 2.3.1 Phương pháp thực 32 2.3.2 Mã chương trình nhận dạng đối tượng 32 Chương Kết thử nghiệm định hướng ứng dụng 41 Tài liệu tham khảo 42 Danh mục hình ảnh Hình 1.1 - robot dịch vụ cá nhân Hình 1.2 - Hệ thống robot phẫu thuật DaVinci .4 Hình 1.3 – Robot chăm sóc sức khỏe từ xa Hình 1.4 - Robot di động nhà Hình 1.5 - Kho hàng robot Hình 1.6 - Xe khơng người lái Hình 1.7 - Dexter Robot Hình 1.8 - Dịch vụ đào tạo Robot Hình1.9 - Một robot dịch vụ đào tạo tự làm công việc Hình 1.10 - Một hoạt động cá nhân Robot tele lấy ly bia Hình 1.11: Thiết bị Kinect 16 Hình 1.12 Cấu trúc thành phần Kinect 17 Hình 1.13 Động điều khiển góc ngẩng Kinect 17 Hình 1.14: Bên Kinect: RGB, IR camera IR projector .17 Hình 1.15: Quá trình thu đồ độ sâu ảnh 18 Hình 1.16: Mẫu hình chiếu projector chụp lại IR camera .18 Hinh 1.17: Tính tốn khoảng cách tới điểm chiếu từ Projector 19 Hình 1.18: Kinect adapter .21 Hình 1.19: Point cloud library logo 24 Hình 2.1: Minh họa bước giải thuật SIFT 26 Hình 2.2 Q trình tính khơng gian đo (L) hàm sai khác D .27 Hình 2.3 Quá trình tìm điểm cực trị hàm sai khác DoG 28 Hình 2.4: Mô sử dụng công thức mở rộng Taylor cho hàm DoG 29 Hình 2.5 Minh họa bước trình lựa chọn điểm keypoints 30 Hình 2.6: Mơ tả tạo mơ tả cục .31 Hình 2.7 Mơ tả việc chia hình làm phần để định vị vị trí đối tượng 32 Danh mục bảng: Trang Bảng 1.1 So sánh tính loại hệ điều robot Bảng 1.2: Góc mở tiêu cự RGB IR camera 20 Bảng 1.3: Công suất tiêu thụ Kinect 21 Danh mục từ viết tắc: SIFT: MRDS: RTT: OCL: Scale-Invarian Feature Transform Microsoft Robotics Developer Studio Orocos Real-Time Toolkit Library Orocos Components MỞ ĐẦU Xử lí ảnh số (DIP - Digital Image Processing) nói chung nhận dạng đối tượng (Object Recognition) nói riêng, ứng dụng nhiều Nó trải rộng mặt sống từ xử lí in ấn, báo, bìa tạp chí đến vấn đề lực nhìn máy học, đơi gần gũi sống hàng ngày mà nhiều người không nhận chức nhận dạng khuôn mặt, đối tượng chuyển động máy ảnh, máy quay phim hay đơn giản chức camera điện thoại động tích hợp cơng cụ xử lí ảnh nhận dạng đối tượng Đề cập sâu vào vấn đề nhận dạng đối tượng toán cụ thể nhận dạng dấu vân tay, nhận dạng khuôn mặt, nhận dạng chữ viết Các toán ứng dụng nhiều nhận dạng đối tượng hình sự, phục vụ điều tra, kiểm chứng Từ ứng dụng rộng rãi mà tổ chức, trung tâm nghiên cứu trường đại học giới, đề tài xử lí ảnh đầu tư nhiều vật chất lẫn thời gian Tuy nước, năm gần nghiên cứu xử lí ảnh nhận dạng đối tượng phát triển mạnh thông qua hội thảo quốc gia vấn đề chưa nhận nhiều kết mong đợi cần đầu tư nhiều Trong vấn đề cụ thể nhận dạng đối tượng ngày hướng nghiên cứu phổ biến giới việc sử dụng điểm bất biến (Invarian Feature) ảnh làm đặc trưng (Keypoint) để nhận dạng Tiêu biểu thuật toán đối sánh sử dụng keypoint dạng thuật toán SIFT (Scale-Invarian Feature Transform, David Lowe 1999 2004), SIFT coi thuật tốn tiền đề cho ứng dụng giải thuật khác biến đổi đặc trưng bất biến ảnh Các giải thuật ứng dụng thực tế khác dựa hay phát triển theo nhánh riêng SIFT Các đặc trưng SIFT không phụ thuộc vào phép biến đổi ảnh xoay, thu phóng, thay đổi độ sáng nên xem tập đặc trưng ảnh thể cho nội dung ảnh Vì kết việc nhận dạng có độ xác cao chí khơi phục đối tượng bị che khuất ảnh Tuy nhiên giải thuật SIFT phức tạp cài đặt, đòi hỏi thời gian nghiên cứu am hiểu nhiều thuật toán thành phần Sự cần thiết đề tài Theo dự đốn vịng 20 năm người có nhu cầu sử dụng robot cá nhân nhu cầu máy tính PC robot tâm điểm cách mạng lớn sau Internet Với xu hướng này, ứng dụng truyền thống khác robot công nghiệp, y tế, giáo dục đào tạo, giải trí đặc biệt an ninh quốc phịng thị trường robot vơ to lớn Trước phát triển đầy triển vọng lĩnh vực robot tương lai Nhóm tác giả tập chuyên ngành công nghệ thông tin, tập trung nghiên cứu lĩnh vực Computer Vision chuyên lĩnh vực xử lý ảnh để gắn “mắt” cho robot Đây lĩnh vực thú vị, robot khối kim loại biết dị đường cơng nghệ điện tử khơng qua “xúc giác” mà nhìn giới xung quanh “đơi mắt” giống người Mục tiêu nghiên cứu Nghiên cứu xây dựng chương trình hỗ trợ dị đường cho robot kĩ thuật xử lý ảnh với chức năng: Nhận dạng đối tượng cho robot công nghệ xử lý ảnh (dựa vào đặc trưng đối tượng): SIFT (Scale-Invarian Feature Transform, David Lowe 1999 2004), OpenCV (Computer Vision) Xác định vật cản phía trước robot cách sử dụng thiết bị Kinect kết hợp OpenNI, PCL (Point Cloud Library) cvBlobs Ý nghĩa khoa học, tính thực triễn khả ứng dụng Robot có bước tiến đáng kể nửa kỷ qua Robot ứng dụng công nghiệp vào năm 60 để thay người làm công việc nặng nhọc, nguy hiểm môi trường độc hại Do nhu cầu sử dụng ngày nhiều trình sản xuất phức tạp nên robot cơng nghiệp cần có khả thích ứng linh hoạt thơng minh Ngày nay, ứng dụng sơ khai ban đầu robot chế tạo máy ứng dụng khác y tế, chăm sóc sức khỏe, nơng nghiệp, đóng tàu, xây dựng, an ninh quốc phịng động lực cho phát triển ngành cơng nghiệp robot Có thể kể đến loại robot quan tâm hiều thời gian qua là: tay máy robot (Robot anipulators), robot di động (Mobile Robots), robot sinh học (Bio Inspired Robots) robot cá nhân (Personal Robots) Robot di động nghiên cứu nhiều xe tự hành mặt đất AGV (Autonomous Guided Vehicles), robot tự hành nước AUV (Autonomous Underwater Vehicles), robot tự hành không UAV (Unmanned Arial Vehicles) robot vũ trụ (Space robots) Với robot sinh học, nghiên cứu thời gian qua tập trung vào hai loại robot (Walking robot) robot dáng người (Humanoid robot) Bên cạnh loại robot sinh học cá nước, cấu trúc chuyển động theo sinh vật biển nhiều nhóm nghiên cứu, phát triển Chương 1: Giới thiệu tổng quan đề tài 1.1 Tổng quan phát triển robot giới Thị trường robot non trẻ ngày với gần hai dự án phần mềm, hầu hết phát triển hệ điều hành Linux Bài viết mơ tả số phần mềm đó, phân tích chọn phần mềm có tảng tốt để sử dụng Điều khác biệt robot dịch vụ với robot công nghiệp? Đối với hầu hết robot công nghiệp, thiết kế để làm việc công nghiệp cài đạt kiểm soát chặt chẽ Hệ thống computer vision sử dụng cơng nghiệp khơng thể để đối phó với thay đổi chiếu sáng mà khơng cần cấu hình lại lập trình lại Mặt khác, giao tiếp với giới bên ngồi ln động ln thay đổi yêu cầu sống cho hầu hết robot dịch vụ Hình1.1 - robot dịch vụ cá nhân Các yếu tố ảnh hưởng yêu cầu robot dịch vụ phải hoạt động tốt như: thiết bị nội thất mới, người bộ, đối tượng bị thiếu robot không nhận biết, người dùng không chuyên nghiệp, trẻ em, vật nuôi, xe ô tô đường Bên cạnh đó, hầu hết robot dịch vụ điện thoại di động làm việc gần với người Do yêu cầu đặt biệt robot dịch vụ nên tạo ngành công nghiệp thiết kế đặc biệt cho ứng dụng robot dịch vụ Xây dựng robot làm việc cho phòng khách sạn, dọn dẹp nhà cửa, phục vụ bữa ăn sáng mơ ước tất robot dịch vụ Một công ty cung cấp sản phẩm mức giá hợp lý làm cho doanh số bán hàng công ty lớn Quân đội tìm kiếm cho robot sử dụng để chống lại chiến tranh, người nông dân thích robot để phát triển trồng Hình 1.2 - Hệ thống robot phẫu thuật DaVinci Gần ngành cơng nghiệp có sử dụng robot dịch vụ như: Robot chăm sóc người cao tuổi Máy quét tự động giám sát sức khỏe (chăm sóc sức khỏe) Robot phẫu thuật (chăm sóc sức khỏe) Robot giao hàng (khách sạn, bệnh viện, nhà hàng, văn phòng) Robot hái trồng (nơng nghiệp) Xe khơng người lái (phịng thủ) Xử lý bom (phòng thủ) An ninh, tuần tra Giải trí (nhà, bảo tàng, cơng viên) Làm vệ sinh Khai thác mỏ Sự chửa cháy 1.2 Robot dịch vụ Mặc dù robot dịch vụ ngành công nghiệp tương đối trẻ, trải qua trình cải tiến liên tục cơng nghệ Nhiều robot dịch vụ triển khai điều khiển từ xa nhà điều hành người.Mỗi chuyển động robot khởi động điều khiển người Hình 1.3 –Robot chăm sóc sức khỏe từ xa Các robot phẫu thuậthoàn chỉnh, telepresence robot chăm sóc y tế ví dụ tốt dịch vụ robot điều khiển từ xa Robot dịch vụ tự chuyển hướng tránh chướng ngại vật nhà chuyển, robot tự lái xe trời Nội thất nhà, tránh chướng ngại vật, định hướng học viện nghiên cứutrong nhiều năm, phát triển thành công nghệ ngày phát triển Số lượng robot thị trường Như vậy, V2G tính thơng qua việc xấp xỉ sai khác hữu hạn ỒG, dơt ạj c ác tham số đo gần kó ó: Do đó: Từ công thức này, ta thấy mà hàm sai khác DoG tính tốn tham số đo lệch số k, ta sử dụng DoG để xấp xỉ đạo hàm bậc hai Laplace Gaussian Vì hệ số (k-1) phương trình số không gian đo nên khơng ảnh hưởng đến việc tìm vị trí cực trị Sai số việc xấp xỉ đạo hàm bậc tiến k gần với Tuy nhiên, kết thử nghiệmcủa tác giả cho thấy q trình xấp xỉ đạo hàm khơng ảnh hưởng đến việc dị tìm vị trí cực trị chí chọn k xa, ví dụ Sau áp dụng hàm DoG ta thu lớp kết khác (scale) từ ảnh gốc, bước tìm cực trị lớp kết theo miền cục Cụ thể điểm lớp kết so sánh với điểm lân cận lớp điểm lân cận lớp khác (hình dưới) Hình 2.3 Quá trình tìm điểm cực trị hàm sai khác DoG Trong hình trên: điểm đánh x so sánh với 26 điểm lân cận (đánh dấu vòng tròn xanh) Điểm lấy làm điểm tiềm (điểm làm điểm đặc biệt - candidate keypoint) có giá trị lớn nh ất nhỏ so với 26 điểm lân cận Giải pháp cho việc tìm điểm tiềm sử dụng thuật toán blob detection (dị tìm điểm) Lindeberg đề xuất Vì số lượng cực trị lớn, để tăng hiệu dị tìm điểm cực trị (dò điểm cực trị tốt thay phải dị hết), ta cần xác định tần số lấy mẫu không gian đo tần số lấy mẫu không gian quan sát (không gian ảnh) Thật không may ta xác định loại tần số cách động tiến trình dị tìm Thay vậy, tần số xác định offline thông qua phương pháp thử nghiệm Sau thử nghiệm với nhiều nguồn liệu ảnh khác nhau, tác giả tần số lấy mẫu không gian đo tốt (giữ lại lớp 28 lớp), tần số lấy mẫu ó = 1.6 2.2.2 Trích xuất keypoint Sau bước thu nhiều điểm tiề m làm điểm đặc biệt, nhiên số chúng không cần thiết bước loại bỏ điểm có độ tương phản (nhạy cảm với nhiễu) tính đặc trưng cục điểm khác có xu hướng đường biên đối tượng Bước thực gồm công đoạn: a Phép nội suy lân cận cho vị trí điểm tiềm năng: Phép nội suy lân cận () sử dụng mở rộng Taylor (Taylor expansion) cho hàm Difference-of-Gaussian D(x,y,ó): Trong đó: D đạo hàm tính điểm tiềm X = (x,y,ó) khoảng cách từ điểm Vị trí điểm cực trị X xác định cách lấy đạo hàm hàm với đối số X tiến dần đến 0: Hình 2.4: Mơ sử dụng cơng thức mở rộng Taylor cho hàm DoG Nếu X > 0.5 theo chiều có số cực trị khơng gần với điểm tiềm khác, bị thay đổi phép nội suy thay vai trị điểm khác gần 29 Hình 2.5 Minh họa bước trình lựa chọn điểm keypoints (a) ảnh gốc (b) mơ tả 832 điểm keypoints tìm được, điểm keypoints vẽ dạng vector thể thông tin: vị trí, hướng độ dài (c) sau đặt ngưỡng tương phản tổi thiểu, ta giữ lại 729 điểm (d) Giữ lại 536 điểm sau áp ngưỡng hệ số độ cong b Loại trừ điểm có tính tương phản kém: Các điểm nhạy cảm với độ sáng nhiễu khơng trở thành điểm đặc biệt cần loại bỏ khỏi danh sách điểm tiềm Trong khai triển Taylor mở rộng trên, điểm tiềm có giá trị X < 0.03 điểm bị loại, ngược lại giữ lại theo vị trí (y+x) tùy biến ó, với y vị trí cũ giá trị biến ó c Loại bỏ điểm dư thừa theo biên: Sử dụng hàm DoG cho tác động mạnh đến biên vị trí biên khó xác định điểm tiềm biên không bất biến bị nhiễu Và để tăng ổn định cho điểm chọn làm điểm đặc biệt ta loại trừ điểm tiềm khó định vị (tức vị trí dễ thay đổi có nhiễu nằm biên) Sau áp dụng hàm DoG làm đường biên ảnh không rõ ràng độ cong có giá trị lớn nhiều so với độ cong dọc theo biên cần loại bỏ bớt điểm đặc biệt dọc theo biên Giải pháp cho việc sử dụng giá trị ma trận Hessian cấp 2: (2.2.3) Các giá trị riêng H tỉ lệ thuận với độ cong D, giá trị riêng â (giá trị nhỏ) (giá trị lớn) có tỉ lệ r = á/â sử dụng Các phần tử H Dxx Dyy 2.2.3 Gắn hướng cho keypoint Bằng việc gán hướng cho điểm đặc trưng keypoint dựa vào thuộc tính ảnh cục bộ, mơ tả keypoint biễu diễn tương đối so với hướng đặt tính bất biến tượng quay ảnh Cách tiếp cận ngược lại với mô tả bất biến hướng Schmid (1997) chỗ thuộc tính ảnh dựa vào độ đo bất biến hướng Nhược điểm cách tiếp cận giới hạn số lượng mơ tả sử dụng bỏ qua thông tin ảnh khơng u cầu độ đo phải dựa hướng quán Sau kỹ thuật gán hướng cục cho điểm đặc trưng Độ đo điểm đặc trưng sử dụng để tìm ảnh lọc Gaussian L với kích thước gần cho tính tốn thực cách bất biến độ đo Với mẫu ảnh L(x,y) này, gọi m(x,y) biên độ gradient, (x,y) hướng Hai giá trị cuối tính tốn sau: 30 2.2.4 Tạo mô tả cục Các phép xử lý thực dị tìm gán tọa độ, kích thước, hướng cho điểm đặc trưng keypoint Các tham số yêu cầu hệ thống tọa độ địa phương 2D lặp lại để mô tả vùng ảnh địa phương nhờ tạo bất biến tham số Bước tính tốn mô tả cho môt vùng ảnh địa phương mà có tính đặc trưng cao (bất biến với thay đổi khác độ sáng, thu - phóng ảnh, xoay) Một cách tiếp cận đơn giản lấy mẫu mật độ ảnh cục lân cận điểm đặc trưng độ đo thích hợp, đối sánh mật độ sử dụng độ đo tương quan chuẩn Tuy nhiên, số tương quan đơn giản lại nhạy cảm với thay đổi mà gây đăng ký nhầm mẫu, chẳng hạn nh biến đổi Affine, phối cảnh 3D, bóp méo mềm Cách tiếp cận tốt nhiều đưa Edelman, Intrator Poggio (1997) Cách tiếp cận dựa mơ hình thị giác sinh học, cụ thể mơ hình noron phức tạp hệ thống não Các noron tương ứng với gradient hướng tần số không gian cụ thể, ng vị trí gradient võng mạc phép trượt phạm vi nhỏ khung nhìn Dựa cách tiếp cận này, tác giả cài đặt mơ tả cho phép việc trượt vị trí sử dụng cách tính tốn khác Hình sau mơ q trình tính tốn mô tả theo cách tiếp cận [mage gradients Keypoint descriptor Hình2.6: Mơ tả tạo mơ tả cục Ảnh trái mô biên độ gradient h ướng m ỗi mẫu ảnh vùng lân cận với điểm keypoint Các giá trị tập trung cửa sổ gaussian (nằm bên vịng trịn) Các mẫu sau gom lại thành lược đồ hướng mô tả vắn tắt nội dung 4x4 vùng mô tả bên phải với độ dài hàng tương ứng với tổng biên độ gradient gần hướng bên vùng 31 2.3 Mơ tả xây dựng chương trình xác định vị trí đối tượng 2.3.1 Phương pháp thực Xây dựng chương trình phát định vị trí đối tượng cách sử dụng kĩ thuật xử lý ảnh Chương trình thực tìm đối tượng, tìm thấy lệnh điều khiển thiết bị bên thông qua cổng RS32 tiến lại gần vật Trong chương trình chúng tơi sử dụng thư viện OpenCV xử lý ảnh trích xuất keypoint đối tượng thuật tốn SIFT Sau chiết xuất trích lọc keypoint descriptor frame hình định vị Tiếp theo chương trình so sánh điểm keypoint lần cận để tìm thấy cặp keypoint phù hợp Và chúng phù hợp với trả tọa độ x,y đối tượng Với phương pháp này, chúng tơi chia hình làm phần tương ứng hình sau: Hình 2.7 Mơ tả việc chia hình làm phần để định vị vị trí đối tượng Phần điều khiển thiết bị bến sử dụng thuật toán điểu khiển thiết bị mã hóa cho robot di chuyển đến tọa độ đối tượng phát khu vực số Nếu tọa độ phát khu vực 6, robot di chuyển sang bên phải, đối tượng xuất khu vực Nếu đối tượng rơi vào khu vực 2, robot di chuyển phía trước để đưa đối tượng rơi vào khu vực Khi đối tượng lọt vào khu vực 5, robot có cách tay bắt lấy đối tượng cách tay đưa kẹp lấy đối tượng Khi đó, robot di chuyển phía trước để kẹp chặc đối tượng Trong lúc robot tiến phía trước sử dụng kinect để đo khoảng cách đến đối tượng cho khoảng cách với thiết kết cánh tay robot để bắt lấy đối tượng Các tính hiệu điều khiển từ máy tính gửi đến vi điều khiển AVR thông qua cổng USB cổng serial RS32 với thiết bị kết nối tiếp vào interface Sử dụng lệnh “echo” thông qua lời gọi hệ thống C vào cổng nối tiếp ttyUSB0 Các vi điều khiển AVR, nhận lệnh từ máy tính, động cánh tay hoạt động 2.3.2 Mã chương trình nhận dạng đối tượng #include #include #include #include #include #include "libfreenect.h" 32 #include "libfreenect_sync.h" //#include "libfreenect_cv.h" #include #include #include #include #include #include #include #include using namespace std; IplImage *image = 0; double compareSURFDescriptors( const float* d1, const float* d2, double best, int length ) { double total_cost = 0; assert( length % == ); for( int i = 0; i < length; i += ) { double t0 = d1[i] - d2[i]; double t1 = d1[i+1] - d2[i+1]; double t2 = d1[i+2] - d2[i+2]; double t3 = d1[i+3] - d2[i+3]; total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3; if( total_cost > best ) break; } return total_cost; } int naiveNearestNeighbor( const float* vec, int laplacian, const CvSeq* model_keypoints, const CvSeq* model_descriptors ) { int length = (int)(model_descriptors->elem_size/sizeof(float)); int i, neighbor = -1; double d, dist1 = 1e6, dist2 = 1e6; CvSeqReader reader, kreader; cvStartReadSeq( model_keypoints, &kreader, ); cvStartReadSeq( model_descriptors, &reader, ); 33 for( i = 0; i < model_descriptors->total; i++ ) { const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr; const float* mvec = (const float*)reader.ptr; CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader ); CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader ); if( laplacian != kp->laplacian ) continue; d = compareSURFDescriptors( vec, mvec, dist2, length ); if( d < dist1 ) { dist2 = dist1; dist1 = d; neighbor = i; } else if ( d < dist2 ) dist2 = d; } if ( dist1 < 0.6*dist2 ) return neighbor; return -1; } void findPairs( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors, const CvSeq* imageKeypoints, const CvSeq* imageDescriptors, vector& ptpairs ) { int i; CvSeqReader reader, kreader; cvStartReadSeq( objectKeypoints, &kreader ); cvStartReadSeq( objectDescriptors, &reader ); ptpairs.clear(); for( i = 0; i < objectDescriptors->total; i++ ) { const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr; const float* descriptor = (const float*)reader.ptr; CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader ); CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader ); int nearest_neighbor = naiveNearestNeighbor( descriptor, kp->laplacian, imageKeypoints, imageDescriptors ); 34 if( nearest_neighbor >= ) { ptpairs.push_back(i); ptpairs.push_back(nearest_neighbor); } } } /* a rough implementation for object location */ int locatePlanarObject( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors, const CvSeq* imageKeypoints, const CvSeq* imageDescriptors, const CvPoint src_corners[4], CvPoint dst_corners[4] ) { double h[9]; CvMat _h = cvMat(3, 3, CV_64F, h); vector ptpairs; vector pt1, pt2; CvMat _pt1, _pt2; int i, n; findPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs ); n = (int)(ptpairs.size()/2); if( n < ) return 0; pt1.resize(n); pt2.resize(n); for( i = 0; i < n; i++ ) { pt1[i] = ((CvSURFPoint*)cvGetSeqElem(objectKeypoints,ptpairs[i*2]))->pt; pt2[i] = ((CvSURFPoint*)cvGetSeqElem(imageKeypoints,ptpairs[i*2+1]))->pt; } _pt1 = cvMat(1, n, CV_32FC2, &pt1[0] ); _pt2 = cvMat(1, n, CV_32FC2, &pt2[0] ); if( !cvFindHomography( &_pt1, &_pt2, &_h, CV_RANSAC, )) return 0; for( i = 0; i < 4; i++ ) { double x = src_corners[i].x, y = src_corners[i].y; 35 double Z = 1./(h[6]*x + h[7]*y + h[8]); double X = (h[0]*x + h[1]*y + h[2])*Z; double Y = (h[3]*x + h[4]*y + h[5])*Z; dst_corners[i] = cvPoint(cvRound(X), cvRound(Y)); } return 1; } ////////// IplImage *freenect_sync_get_depth_cv(int index) { static IplImage *image = 0; static char *data = 0; if (!image) image = cvCreateImageHeader(cvSize(640,480), 16, 1); unsigned int timestamp; if (freenect_sync_get_depth((void**)&data, ×tamp, index, FREENECT_DEPTH_11BIT)) return NULL; cvSetData(image, data, 640*2); return image; } IplImage *freenect_sync_get_rgb_cv(int index) { static IplImage *image = 0; static char *data = 0; if (!image) image = cvCreateImageHeader(cvSize(640,480), 8, 3); unsigned int timestamp; if (freenect_sync_get_video((void**)&data, ×tamp, index, FREENECT_VIDEO_RGB)) return NULL; cvSetData(image, data, 640*3); return image; } int ConnectKinect(void) { while (cvWaitKey(10) < 0) { IplImage *image = freenect_sync_get_rgb_cv(0); if (!image) { printf("Error: Kinect not connected?\n"); 36 return -1; } cvCvtColor(image, image, CV_RGB2BGR); IplImage *depth = freenect_sync_get_depth_cv(0); if (!depth) { printf("Error: Kinect not connected?\n"); return -1; } cvShowImage("RGB", image); //cvShowImage("Depth", GlViewColor(depth)); } return 0; } ///////// int main(int argc, char** argv) { const char* object_filename = "a1.png"; // input image to be detected int key=0; //int sy; //sy=system("stty -F /dev/ttyUSB0 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoe -noflsh -ixon"); CvMemStorage* storage = cvCreateMemStorage(0); cvNamedWindow("Object Correspond", 1); static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}}, {{255,255,255}} }; //CvCapture* capture = cvCreateCameraCapture(0); CvMat *image = 0;//, *gray =0;//* prevgray = 0, 37 while( key != 'q' ) { int gray = 0;//firstFrame IplImage* frame = freenect_sync_get_rgb_cv(0);//cvQueryFrame(capture); //cvCvtColor(image, image, CV_RGB2BGR); if(!frame) break; if(!gray) { image = cvCreateMat(frame->height, frame->width, CV_8UC1); } cvCvtColor(frame, image, CV_BGR2GRAY); CvSeq *imageKeypoints = 0, *imageDescriptors = 0; int i; //Extract SURF points by initializing parameters CvSURFParams params = cvSURFParams(500, 1); cvExtractSURF( image, 0, &imageKeypoints, &imageDescriptors, storage, params ); IplImage* object = cvLoadImage( object_filename, CV_LOAD_IMAGE_GRAYSCALE ); IplImage* object_color = cvCreateImage(cvGetSize(object), 8, 3); cvCvtColor( object, object_color, CV_GRAY2BGR ); CvSeq *objectKeypoints = 0, *objectDescriptors = 0; cvExtractSURF( object, 0, &objectKeypoints, &objectDescriptors, storage, params ); printf("Object Descriptors: %d\n", objectDescriptors->total); printf("Image Descriptors: %d\n", imageDescriptors->total); CvPoint src_corners[4] = {{0,0}, {object->width,0}, {object->width, object->height}, {0, object->height}}; CvPoint dst_corners[4]; IplImage* correspond = cvCreateImage( cvSize(image->width, object->height+image>height), 8, ); cvSetImageROI( correspond, cvRect( 0, 0, object->width, object->height ) ); cvCopy( object, correspond ); cvSetImageROI( correspond, cvRect( 0, object->height, correspond->width, correspond->height ) ); cvCopy( image, correspond ); cvResetImageROI( correspond ); if( locatePlanarObject( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, src_corners, dst_corners )) 38 { printf("object found\n"); for( i = 0; i < 1; i++ ) { CvPoint r1 = dst_corners[i%4]; CvPoint r2 = dst_corners[(i+1)%4]; cvLine( correspond, cvPoint(r1.x, r1.y+object->height ), cvPoint(r2.x, r2.y+object->height ), colors[8] ); printf("%d,%d\n", r1.x, r1.y); if(r1.x340) { printf("MOVE LEFT\n"); //sy=system("echo -n '2' > /dev/ttyUSB0"); } if((r1.x>290)&&(r1.xpt), cvPoint(cvRound(r2->pt.x), cvRound(r2->pt.y+object->height)), colors[8] ); } cvShowImage( "Object Correspond", correspond ); for( i = 0; i < objectKeypoints->total; i++ ) { CvSURFPoint* r = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, i ); CvPoint center; int radius; center.x = cvRound(r->pt.x); 40 Chương Kết thử nghiệm định hướng ứng dụng Hình3.1 Tìm thấ y đố i tư ợ ng bên trái lệ nh robot dị ch chuyể n sang phả i Hình 3.2 Tìm thấy đối tượng bên phải lệnh robot di chuyển qua trái Hình 3.3 Tìm thấy đối tượng bên phía trước lệnh robot thẳng Tài liệu tham khảo [1].Learning computer Vision with the OpenCV Library, Gary Bradski and Adrian Kaehler, University of British Comlumbia, Mỹ [2].OpenCV Computer Vision Application Programming Cookbook, Robert Laganière, Published by Packt Publishing Ltd, 32 Lincoln Road, Olton, Birmingham, B27 6PA, UK [3].“Analysis of Kinect for Mobile Robots,” Mikkel Viager, Technical University of Denmark, p 11 [4].“A Qualitative Analysis of Two Automated Registration Algorithms In Real World Scenario Using Point Clouds from the Kinect” Jacob Kjær,June 27, 2011 [5].http://openni.org/Documentation [6].http://pointclouds.org/documentation [7].http://en.wikipedia.org/wiki/Kinect 42 ...BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC LẠC HỒNG *** BÁO CÁO NGHIÊN CỨU KHOA HỌC ĐỀ TÀI: NGHIÊN CỨU, ỨNG DỤNG OPENCV VÀ KINECT HỖ TRỢ DÒ ĐƯỜNG ĐI CHO ROBOT THỰC HIỆN:... giống người Mục tiêu nghiên cứu Nghiên cứu xây dựng chương trình hỗ trợ dị đường cho robot kĩ thuật xử lý ảnh với chức năng: Nhận dạng đối tượng cho robot công nghệ xử lý ảnh (dựa vào đặc trưng đối... Computer vision, OpenCV, Hệ thống lập kế hoạch, hệ thống quản lý máy chủ công nghệ khác sử dụng hàng chục dự án khoa học áp dụng tồn giới Nhiệm vụ ROS - khả tái sử dụng mã nguồn nghiên cứu phát triển