1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xe tự động di chuyển dựa vào vật mốc dùng xử lý ảnh

105 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

MỤC LỤC Trang bìa i Nhiệm vụ đồ án ii Lịch trình iv Cam đoan v Lời cảm ơn vi Mục lục vii Liệt kê hình vẽ ix Liệt kê bảng vẽ xii Tóm tắt xiii CHƯƠNG TỔNG QUAN 1.1 Đặt vấn đề 1.2 Mục tiêu 1.3 Nội dung nghiên cứu 1.4 Giới hạn 1.5 Bố cục CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 Tổng quan Robot 2.2 Tổng quan ROS (Robot Operating System) 2.2.1 Giới thiệu hệ điều hành ROS 2.2.2 Mơ hình ROS 2.3 Giới thiệu xử lý ảnh 10 2.3.1 Hệ thống xử lý ảnh 10 2.3.2 Những vấn đề xử lý ảnh 11 2.3.3 Tổng quan thư viện OpenCV 14 2.3.4 Phép biến đổi đặc trưng bất biến tỉ lệ – SIFT xử lý ảnh 17 2.4 Thuật toán PID điều khiển tốc độ động 24 2.4.1 Điều khiển khâu vi tích phân tỉ lệ PID 24 2.4.2 Đặc tính điều khiển P, I, D 25 2.5 Thuật toán điều khiển hướng robot 27 CHƯƠNG TÍNH TỐN VÀ THIẾT KẾ 30 vii 3.1 Giới thiệu 30 3.2 Thiết kế sơ đồ khối 30 3.2.1 Khối nguồn 30 3.2.2 Khối camera 32 3.2.3 Khối PC xử lý liệu ảnh 32 3.2.4 Khối xử lý trung tâm 34 3.2.5 Khối chấp hành 36 3.3 Sơ đồ nguyên lý mạch điện hệ thống 43 CHƯƠNG THI CÔNG HỆ THỐNG 44 4.1 Thi công phần mạch điện 44 4.2 Thi công phần khung robot 45 4.2.1 Khung robot 45 4.2.2 Các phận nhựa 46 4.2.3 Linh kiện khí 47 4.2.4 Bố trí phận robot 48 4.3 Lập trình hệ thống 48 4.3.1 Lưu đồ giải thuật 48 4.3.2 Phần mềm lập trình Arduino 61 4.4 Hướng dẫn vận hành mơ hình robot 68 CHƯƠNG KẾT QUẢ_NHẬN XÉT_ĐÁNH GIÁ 72 5.1 Kết 72 5.1.1 Mơ hình Robot 72 5.1.2 Hoạt động Robot 72 5.2 Nhận xét, đánh giá 74 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 77 6.1 Kết luận 77 6.2 Hướng phát triển 77 TÀI LIỆU THAM KHẢO 78 PHỤ LỤC 80 viii LIỆT KÊ HÌNH VẼ Hình Trang Hình 2.1: Ứng dụng hệ điều hành ROS Hình 2.2: Tầng ROS Filesystem Hình 2.3: Tầng ROS Computation Graph Hình 2.4: Mô tả phương thức hoạt động service Hình 2.5: Sơ đồ khối hệ thống xử lý ảnh 10 Hình 2.6: Minh họa không gian màu RGB 11 Hình 2.7: Giá trị mức xám điểm ảnh 13 Hình 2.8: Ảnh xám ảnh nhị phân 14 Hình 2.9: Xây dựng khơng gian tỷ lệ 20 Hình 2.10: Quá trình lựa chọn điểm đặc trưng 21 Hình 2.11: Bộ mô tả điểm đặc trưng 23 Hình 2.12: Sơ đồ điều khiển sử dụng điều khiển PID 24 Hình 2.13: Ảnh hưởng KP tới đáp ứng hệ thống 25 Hình 2.14: Ảnh hưởng KI tới đáp ứng hệ thống 25 Hình 2.15: Ảnh hưởng KD tới đáp ứng hệ thống 26 Hình 2.16: Mơ hình điều khiển robot hiệu vận tốc 27 Hình 3.1: Sơ đồ khối toàn hệ thống 30 Hình 3.2: Nguồn Acquy RL1212 cấp cho khối chấp hành 31 Hình 3.3: Webcam Logitech C270 31 Hình 3.4: Xác định vùng line 33 Hình 3.5: Hình ảnh vật mẫu thu từ camera 33 Hình 3.6: Khối xử lý trung tâm sử dụng Kit Arduino loại Due 34 Hình 3.7: Sơ đồ chân Kit Arduino loại Due 34 Hình 3.8: Động DC giảm tốc servo Faulhaber 12V 36 Hình 3.9: Điều chỉnh độ rộng xung PWM 37 Hình 3.10: Optical encoder 38 Hình 3.11: Hai kênh A B lệch pha encoder 39 Hình 3.12: Module L298N điều khiển động 40 Hình 3.13: Sơ đồ nguyên lý module L298N 41 Hình 3.14: Sơ đồ nguyên lý mạch điện hệ thống 43 ix Hình 4.1: Sơ đồ mạch điện tồn hệ thống 44 Hình 4.2: Bản vẽ chi tiết khung robot 45 Hình 4.3: Các phận nhựa robot 46 Hình 4.4: Các phận khí robot 47 Hình 4.5: Vị trí phận bên robot 48 Hình 4.6: Sơ đồ khối hoạt động hệ thống robot 48 Hình 4.7: Sơ đồ khối truyền nhận liệu ROS 49 Hình 4.8: Lưu đồ chương trình máy tính 50 Hình 4.9: Lưu đồ chương trình dị line dùng xử lý ảnh 51 Hình 4.10: Sơ đồ khối xử lý ảnh dò line 52 Hình 4.11: Vùng xác định line 52 Hình 4.12: Nhị phân hóa ngược vùng cần quan tâm 53 Hình 4.13: Đường bao quanh đối tượng 53 Hình 4.14: Vùng line xác định 54 Hình 4.15: Lưu đồ chương trình nhận dạng vật mốc 54 Hình 4.16: Sơ đồ khối xử lý ảnh vật mốc 55 Hình 4.17: Ảnh vật mẫu thu thập 55 Hình 4.18: Ảnh thu nhận từ camera 56 Hình 4.19: Điểm đặc trưng vật mẫu 57 Hình 4.20: Điểm đặc trưng ảnh thu nhận 57 Hình 4.21: Vật mẫu hình ảnh thu nhận từ camera 58 Hình 4.22: Lưu đồ chương trình Arduino 59 Hình 4.23: Lưu đồ chương trình ngắt timer 3, timer 60 Hình 4.24: Lưu đồ chương trình ngắt timer 61 Hình 4.25: Lưu đồ chương trình xử lý di chuyển cho robot 62 Hình 4.26: Di chuyển đến thư mục Downloads 63 Hình 4.27: Giải nén kho lưu trữ tải 63 Hình 4.28: Di chuyển thư mục kết /opt/ 63 Hình 4.29: Chạy chmod install sh 64 Hình 4.30: Arduino IDE 64 Hình 4.31: Arduino Toolbar 64 Hình 4.32: Arduino IDE Menu 64 Hình 4.33: File menu 65 x Hình 4.34: Examples 65 Hình 4.35: Edit menu 66 Hình 4.36: Sketch menu 66 Hình 4.37: Tool menu 67 Hình 4.38: Chọn Board 67 Hình 4.39: Cổng usb camera bên trái Arduino bên phải 69 Hình 4.40: Quá trình nạp code xuống Kit Arduino 69 Hình 4.41: Chạy roscore 70 Hình 4.42: Chạy rosrun ObjectLocationUsing2DFeature detects_end 70 Hình 4.43: Chạy rosrun rosserial_python serial_node.py /dev/ttACM0 71 Hình 4.44: Cơng tắc để cấp nguồn cho hệ thống 71 Hình 5.1: Mơ hình robot sau lắp ráp hoàn chỉnh 72 Hình 5.2: Robot nhận dạng đường line 73 Hình 5.3: Robot nhận dạng ba đường line ngã tư 73 Hình 5.4: Robot nhận dạng vật mẫu dựa thuật toán SIFT 74 Hình 5.5: Nhận thấy đường line điều kiện ánh sáng yếu 75 Hình 5.6: Nhận thấy vật mốc nhiều góc độ 75 Hình 5.7: Số khung hình camera thu nhận 1s 76 xi LIỆT KÊ BẢNG Bảng Trang Bảng 3.1: Thông số kỹ thuật nguồn acquy RL1212 31 Bảng 3.2: Thông số kỹ thuật webcam Logitech 32 Bảng 3.3: Thông số PC 32 Bảng 3.4: Thông số kỹ thuật kit Arduino Due 35 Bảng 3.5: Thông số kỹ thuật động giảm tốc servo Faulhaber 12V 40 Bảng 3.6: Thông số kỹ thuật module L298N 41 Bảng 3.7: Chức chân điều khiển module L298N 41 xii TÓM TẮT Ngày nay, thời kì Cơng nghiệp hóa Hiện đại hóa đất nước, ngành cơng nghiệp robot phát triển nhanh chóng mạnh mẽ, robot dần thay người làm việc môi trường độc hại nặng nhọc cơng việc địi hỏi xác cao Trong robot di động (xe tự hành) trọng phát triển tính linh hoạt, thơng minh ứng dụng Cơng nghệ robotic phát triển địi hỏi khơng cấu chân tay mà cấu cảm nhận, đặc biệt xử lý ảnh coi công nghệ tiên tiến hàng đầu Luận văn đề cập đến vấn đề xây dựng mơ hình xe tự động di chuyển dùng cơng nghệ xử lý ảnh để dị line nhận dạng vật mốc Luận văn tìm hiểu sở lý thuyết xử lý ảnh để thực việc phát định vị đưịng line Bên cạnh tập trung nghiên cứu vấn đề phép biến đổi đặc trưng bất biến tỷ lệ – SIFT cho trình thực nhận dạng vật mốc định hướng cho robot Đề tài ứng dụng hệ điều hành ROS (Robot Operation System) giúp cho robot hoạt động linh hoạt tối ưu Mơ hình bao gồm Camera Logitech, khung robot, máy tính, phần mềm Ubuntu thư viện xử lý ảnh OpenCV Với vấn đề nghiên cứu tiến hành trên, đề tài thực xe có khả di chuyển theo line nhận dạng vật mốc xiii CHƯƠNG TỔNG QUAN Chương TỔNG QUAN 1.1 ĐẶT VẤN ĐỀ Ngày nay, điều khiển tự động trở thành nhu cầu thiếu người xuất học thuyết ứng dụng cụ thể đời sống ngày Con người cố gắng sáng tạo robot có khả làm việc thay cho người, thường bắt gặp robot dây chuyền công nghiệp sản xuất tự động hay robot giúp việc gia đình Trong đó, xe tự hành (robot di động) lĩnh vực quan tâm Được định nghĩa loại xe tự động di chuyển điều khiển tự động nhiều môi trường khác nhau: đất, nước, không khí để thực nhiệm vụ giao Tính tự động hóa có nghĩa robot phải dựa vào khả qua liệu vận hành có ích từ phận cảm biến, camera tự đưa định Xe tự hành (robot di động) hướng phát triển tốt tương lai với ứng dụng truyền thống robot công nghiệp, y tế, số lĩnh vực khác hứa hẹn đáp ứng nhu cầu lớn xã hội Vì thế, nhóm chọn đề tài “Xe tự động di chuyển dựa vào vật mốc dùng xử lý ảnh” để nghiên cứu Hiện nay, có số đề tài liên quan đến nội dung nhóm nghiên cứu Chẳng hạn, đề tài “Robot Tự Hành Tránh Vật Cản Sử Dụng Thiết Bị Kinect” [1]: chương trình xử lý ảnh khơi phục khơng gian phía trước robot dạng 3D, cung cấp đầy đủ thông tin mơi trường cho robot Hồn thành kế hoạch di chuyển đến đích có vật cản với sai số chấp nhận môi trường nhà Cũng như, đề tài “Triển Khai Thuật Toán Định Hướng Trên Ros Cho Robot Tự Hành Trong Nhà” [2]: ứng dụng giải thuật điều khiển định hướng hệ điều hành ROS [3][4] Ứng dụng camera Kinect việc quét đồ phát vật cản giúp robot xử lý hoạch định đường môi trường nhà Hay là, nội dung nghiên cứu “Ứng Dụng OpenCV Và Kinect Hỗ Trợ Dò Đường Đi Cho Robot” [5]: thực việc xử lý ảnh dùng thư viện OpenCV thuật toán SIFT (Scale - Invariant Feature Transform) [6][7][8]định vị đối tượng khung hình điều khiển hướng robot bắt lấy đối tượng khoảng cách phù hợp cánh tay robot BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP CHƯƠNG TỔNG QUAN Kế thừa số tính từ đề tài lấy làm tài liệu nghiên cứu, nhóm tiến hành thực đề tài với số chức bật: robot dị line dựa vào q trình xử lý ảnh sử dụng thư viện OpenCV, sử dụng SIFT thuật toán hiệu nhận dạng đối tượng vật mốc kể khung hình có bị mờ di chuyển robot hay ảnh hưởng ánh sáng để định hướng robot Đề tài sử dụng camera Logitech thay Kinect giao tiếp máy tính để mở rộng tầm quan sát giúp cho việc dò line nhận dạng đối tượng dễ dàng Việc xử lý liệu thực hệ điều hành ROS giảm lượng đáng kể cơng việc lập trình, thiết lập hệ thống 1.2 MỤC TIÊU Đề tài thực thiết kế thi cơng mơ hình xe tự động di chuyển chạy theo đường line, kết hợp nhận dạng vật mốc để định hướng xe Trong đó, q trình xử lý liệu máy tính dựa vào xử lý ảnh nhận tín hiệu điều khiển di chuyển xe Kit Arduino Due 1.3 NỘI DUNG NGHIÊN CỨU Trong q trình nghiên cứu, nhóm thực nội dung sau: - Gia công khung xe - Thiết kế mạch cơng suất - Kết nối tồn hệ thống camera, máy tính, Arduino, mạch cơng suất - Tìm hiểu hệ điều hành ROS - Tìm hiểu thuật tốn PID, thuật tốn hướng rẽ - Lập trình Arduino điều khiển động dùng PID - Tìm hiểu lý thuyết xử lý ảnh, thư viện OpenCV - Tìm hiểu, viết chạy thử nghiệm chương trình dị line dùng xử lý ảnh - Tìm hiểu, viết chạy thử nghiệm chương trình nhận dạng vật mốc - Kết hợp dị line nhận dạng vật mốc gởi tín hiệu điều khiển cho Arduino định hướng xe - Chạy thử nghiệm, cân chỉnh hệ thống - Viết báo cáo luận văn - Báo cáo đề tài tốt nghiệp BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP CHƯƠNG TỔNG QUAN 1.4 GIỚI HẠN - Khung xe có kích thước dài 39cm, rộng 36cm, cao 38cm - Sử dụng module Driver L298 công suất 20W, động DC servo giảm tốc 12VDC công suất 17W điều khiển hệ thống bánh xe - Hai bánh xe robot đường kính 0.95cm - Camera Logitech C270 kết nối máy tính đặt xe thực xử lý ảnh - Sử dụng Kit Arduino Due điều khiển động giảm tốc - Mơ hình sử dụng địa hình tương đối phẳng, môi trường nhà để giảm ảnh hưởng ánh sáng đến trình nhận dạng vật mốc dò line, bề mặt dán line cần chênh lệch rõ ràng mức xám đường line vùng xung quanh, kết hợp dò line nhận dạng vật mốc làm cho tầm quan sát camera hạn chế nên cần đặt vật mốc khoảng cách phù hợp 1.5 BỐ CỤC Chương 1: Tổng Quan Chương trình bày đặt vấn đề dẫn nhập lý chọn đề tài, mục tiêu, nội dung nghiên cứu, giới hạn thông số bố cục đồ án Chương 2: Cơ Sở Lý Thuyết Chương tìm hiểu tổng quan Robot Operating System thuật toán điều khiển, xử lý ảnh Chương 3: Tính Tốn Và Thiết Kế Chương giới thiệu khối xử lý cần thiết sơ đồ nguyên lý Chương 4: Thi Công Hệ Thống Chương tập trung thi cơng mơ hình phần cứng bao gồm phần thi công mạch điện thi cơng khung robot giải thuật dị line, nhận dạng vật mốc cho máy tính, điều khiển động cho Arduino Chương 5: Kết Quả_Nhận Xét_Đánh Giá Trình bày kết chạy thực tế, đánh giá kết thực nghiệm Chương 6: Kết Luận Và Hướng Phát Triển Trình bày kết đạt luận văn, mặt hạn chế hướng phát triển mở rộng ứng dụng đề tài thực tế BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP PHỤ LỤC /**********************************PIDLeft ***************************/ void timer_3_interrupt_for_left_motor () { //thoi gian lay mau la 100ms neu so khac phai set tso PID newLeft = leftEncoder.read (); diffLeft = newLeft - oldLeft; leftVelocity = double(diffLeft)/(4*12*64)*10; oldLeft = newLeft; PID_leftMotor.Compute (); return; } /***************************** PIDRight *******************************/ void timer_4_interrupt_for_right_motor () { newRight = rightEncoder.read (); diffRight = newRight - oldRight; rightVelocity = double (diffRight)/(4*12*64)*10; oldRight = newRight; PID_rightMotor.Compute(); return; } /********************************************************************/ void timer_5_interrupt_for_turn_corner() { count++; //sec_itr = 2; if (count == ||count == 3) { //sec_itr = 2; // giam toc quay core dump turn_angle = pre_turn_angle; BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 82 PHỤ LỤC set_turn_angle(); } if (count > 3) { mode = ; } return; } /********************************************************************/ void setup () { // setup the pwm input reader pinMode(PWM_l_a, OUTPUT); pinMode(PWM_l_b, OUTPUT); pinMode(PWM_r_a, OUTPUT); pinMode(PWM_r_b, OUTPUT); //Setup parameter for timer for left motor Timer3.attachInterrupt (timer_3_interrupt_for_left_motor); Timer3.start (100000); //100ms //Setup parameter for timer for right motor Timer4.attachInterrupt (timer_4_interrupt_for_right_motor); Timer4.start (100000); //100ms //Setup parameter for timer Timer5.attachInterrupt (timer_5_interrupt_for_turn_corner); Timer5.start (1000000); //1000ms = 1s //Setup PID parameters PID_leftMotor.SetMode (AUTOMATIC); PID_rightMotor.SetMode (AUTOMATIC); PID_leftMotor.SetTunings (consKp, consKi, consKd); PID_leftMotor.SetOutputLimits (-255,255); PID_rightMotor.SetTunings (consKp, consKi, consKd); PID_rightMotor.SetOutputLimits (-255,255); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 83 PHỤ LỤC nh.initNode(); nh.subscribe(receive_data1); nh.subscribe(receive_data2); nh.advertise(send_data); } /********************************************************************/ void loop () { //Function for following line DataSend = 0; if (mode == 0) { selectMover(); } //Update the PID value //Update the value of the current setpoint of the left and right motor // For left motor if (leftPIDOutput < 0) { digitalWrite(PWM_l_b,LOW); analogWrite(PWM_l_a, abs(leftPIDOutput)); } else { if (leftPIDOutput > 0) { digitalWrite(PWM_l_a,LOW); analogWrite(PWM_l_b, leftPIDOutput); } else { digitalWrite(PWM_l_a,LOW); digitalWrite(PWM_l_b,LOW); } } //For right motor BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 84 PHỤ LỤC if (rightPIDOutput < 0) { digitalWrite(PWM_r_b,LOW); analogWrite(PWM_r_a, abs(rightPIDOutput)); } else { if (rightPIDOutput > 0) { digitalWrite(PWM_r_a,LOW); analogWrite(PWM_r_b, rightPIDOutput); } else { digitalWrite(PWM_r_a,LOW); digitalWrite(PWM_r_b,LOW); } } //Spin ROS for updating system data_send.data = DataSend; send_data.publish(&data_send); nh.spinOnce(); } /*****************************Followingline****************************/ void selectMover() { if (status_robot == 1) robotMover( ); // TH lech line else if (status_robot == -1) robotMover( ); else if (status_robot == 0) robotMover( ); // TH line giua else if (status_robot == 2) { // TH dung nga robotMover( ); mode = 1; } else robotMover( ); // TH dung ko line DataSend = 1; // cho phep doc vat mau BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 85 PHỤ LỤC } void robotMover (int action) { switch (action) { case 0:// không di chuyển motorControlSpeed(0, 0); break; case 1:// thẳng motorControlSpeed(1, 1); break; case 2:// lùi lại motorControlSpeed(-1,-1); break; case 3:// rẽ trái motorControlSpeed(1.0,0.5); break; case 4:// rẽ phải motorControlSpeed(0.5,1.0 ); break; default: action = 0; } } void motorControlSpeed(double speedR, double speedL) { leftSetPoint = speedL; rightSetPoint = speedR; } void set_turn_angle() BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 86 PHỤ LỤC { double vr, vl, v, L = 44, R = 4.5; //centimet double radian_angle; sec_itr = 2; radian_angle = (turn_angle * pi) / 180; radian_angle = radian_angle / sec_itr; if (radian_angle > 3) vr = vl = 0; else if (radian_angle > 0) { vl = 0; v = radian_angle * L / 2; vr = (2 * v + radian_angle * L) / ((2 * R) * (2 * pi)); } else if (radian_angle < 0) { vr = 0; v = - radian_angle * L / 2; vl = (2 * v - radian_angle * L) / ((2 * R) * (2 * pi)); } else { v = 18; vr = (2 * v + radian_angle * L) / ((2 * R) * (2 * pi)); vl = (2 * v - radian_angle * L) / ((2 * R) * (2 * pi)); } rightSetPoint = vr; leftSetPoint = vl; } - Code chương trình xử lý máy tính: #include #include #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 87 PHỤ LỤC #include #include #include #include #include #include #include #include #include using namespace cv; using namespace std; float pos_objx, angleData = 360; SiftFeatureDetector detector; SiftDescriptorExtractor extractor; FlannBasedMatcher matcher; Mat img_obj, img_sceneObj, img_sceneLine; Mat img_sceneObj_g; Mat img_object1, img_object_g1; Mat img_object2, img_object_g2; Mat img_object3, img_object_g3; vector keypoints_object1; vector keypoints_object2; vector keypoints_object3; vector keypoints_scene; Mat descriptors_object1; Mat descriptors_object2; Mat descriptors_object3; Mat descriptors_scene; Mat img_chose; vector keypoints_chose; std::vector< DMatch > good_matchesChose; void detectObject() { BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 88 PHỤ LỤC cvtColor (img_sceneObj, img_sceneObj_g, CV_BGR2GRAY); detector.detect (img_sceneObj_g, keypoints_scene); extractor.compute (img_sceneObj_g, keypoints_scene, descriptors_scene); drawKeypoints(img_sceneObj,keypoints_scene,img_sceneObj,Scalar::all(1),DrawMatchesFlags::DRAW_RICH_KEYPOINTS); std::vector< DMatch > matches1; std::vector< DMatch > matches2; std::vector< DMatch > matches3; matcher.match( descriptors_object1, descriptors_scene, matches1 ); matcher.match( descriptors_object2, descriptors_scene, matches2 ); matcher.match( descriptors_object3, descriptors_scene, matches3 ); double min_dist1 = 70; for( int i = 0; i < descriptors_object1.rows; i++ ) { double dist = matches1[i].distance; if( dist < min_dist1 ) min_dist1 = dist; } std::vector< DMatch > good_matches1; for( int i = 0; i < descriptors_object1.rows; i++ ) { if( matches1[i].distance < 3.0*min_dist1 ) { good_matches1.push_back( matches1[i]); } } double min_dist2 = 60; for( int i = 0; i < descriptors_object2.rows; i++ ) { double dist = matches2[i].distance; if( dist < min_dist2 ) min_dist2 = dist; } std::vector< DMatch > good_matches2; for( int i = 0; i < descriptors_object2.rows; i++ ) { if( matches2[i].distance < 3.0*min_dist2 ) { good_matches2.push_back( matches2[i]); } } double min_dist3 = 60; for( int i = 0; i < descriptors_object3.rows; i++ ) { double dist = matches3[i].distance; BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP 89 PHỤ LỤC if( dist < min_dist3 ) min_dist3 = dist; } std::vector< DMatch > good_matches3; for( int i = 0; i < descriptors_object3.rows; i++ ) { if( matches3[i].distance < 3.0*min_dist3 ) { good_matches3.push_back( matches3[i]); } } Mat img_displayed; Mat img_chose; vector keypoints_chose; std::vector< DMatch > good_matchesChose; // tim max good_match good_matchesChose = good_matches1; if (good_matches2.size() > good_matchesChose.size()) { good_matchesChose = good_matches2; } else if (good_matches3.size() > good_matchesChose.size()) { good_matchesChose = good_matches3; } // ve cac duong thang va xoa cac diem khong tot if (good_matchesChose.size() == good_matches1.size()) { img_chose = img_object1; keypoints_chose = keypoints_object1; } else if (good_matchesChose.size() == good_matches2.size()) { img_chose = img_object2; keypoints_chose = keypoints_object2; } else { img_chose = img_object3; keypoints_chose = keypoints_object3; } drawMatches( img_chose, keypoints_chose, img_sceneObj, keypoints_scene, good_matchesChose, img_displayed, Scalar::all(-1), Scalar::all(-1), vector(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS ); cout

Ngày đăng: 31/10/2022, 16:56

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w