Luận án Nghiên cứu sử dụng phương pháp ánh sáng cấu trúc để nâng cao chất lượng đo chi tiết cơ khí
Chương này trình bày tổng quan về phương pháp đo biên dạng bề mặt 3D sử
dụng ánh sáng cấu trúc với phương pháp PSGC, làm rõ các ưu nhược điểm của phương
pháp khi đo các chi tiết cơ khí. Các yếu tố ảnh hưởng đến độ chính xác hệ thống cũng
được đề cập đến nhằm phân tích các vấn đề đã được giải quyết và các vấn đề còn tồn
tại. Khảo sát các yếu tố ảnh hưởng đến độ chính xác của phương pháp này như: thông
số hình học của hệ thống, đặc tính bề mặt, vật liệu của chi tiết đo, phương pháp xử lý
dữ liệu 3D, thông số kĩ thuật của thiết bị. Khảo sát tình hình nghiên cứu trong và ngoài
nước, đặc biệt tập trung hai yếu tố ảnh hưởng đến độ chính xác là độ chính xác hiệu
chuẩn và đặc tính phản xạ bề mặt chi tiết đo. Thông qua việc trình bày tình hình nghiên
cứu, phần kết luận chương 1 tổng quát hóa về các vấn đề được trình bày và đề xuất
phương án nghiên cứu
Tóm tắt nội dung tài liệu: Luận án Nghiên cứu sử dụng phương pháp ánh sáng cấu trúc để nâng cao chất lượng đo chi tiết cơ khí
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI NGUYỄN THỊ KIM CÚC NGHIÊN CỨU SỬ DỤNG PHƯƠNG PHÁP ÁNH SÁNG CẤU TRÚC ĐỂ NÂNG CAO CHẤT LƯỢNG ĐO CHI TIẾT CƠ KHÍ LUẬN ÁN TIẾN SĨ KỸ THUẬT CƠ KHÍ Hà nội - 2018 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI NGUYỄN THỊ KIM CÚC NGHIÊN CỨU SỬ DỤNG PHƯƠNG PHÁP ÁNH SÁNG CẤU TRÚC ĐỂ NÂNG CAO CHẤT LƯỢNG ĐO CHI TIẾT CƠ KHÍ Ngành: Kỹ thuật cơ khí Mã số: 9520103 LUẬN ÁN TIẾN SĨ KỸ THUẬT CƠ KHÍ NGƯỜI HƯỚNG DẪN KHOA HỌC: 1. PGS. TS. Nguyễn Văn Vinh 2. TS. Phạm Xuân Khải Hà Nội – 2018 LỜI CAM ĐOAN Tôi xin cam đoan tất cả những nội dung trong luận án “Nghiên cứu sử dụng phương pháp ánh sáng cấu trúc để nâng cao chất lượng đo chi tiết cơ khí” là công trình nghiên cứu của riêng tôi, thực hiện dưới sự hướng dẫn của tập thể cán bộ hướng dẫn. Các số liệu, kết quả trong luận án là trung thực, trích dẫn đầy đủ và chưa từng được ai công bố trong bất kỳ công trình nào khác. TM. Tập thể hướng dẫn Hà nội, ngày tháng năm 2018 Tác giả luận án LỜI CẢM ƠN Trong quá trình học tập, nghiên cứu và hoàn thành luận án, tôi đã nhận được rất nhiều sự giúp đỡ, góp ý, động viên và chia sẻ của mọi người. Lời đầu tiên tôi xin được bày tỏ lòng biết ơn tới Ban Giám hiệu, Phòng Đào tạo, Viện Cơ khí, Bộ môn Cơ Khí Chính Xác & Quang học – Trường Đại học Bách khoa Hà Nội. Tôi đặc biệt cảm ơn PGS.TS Nguyễn Văn Vinh, PGS.TS Nguyễn Thị Phương Mai, TS. Phạm Xuân Khải đã hướng dẫn, chỉ bảo cho tôi những ý kiến vô cùng quý báu và tạo điều kiện thuận lợi cho tôi về mặt chuyên môn trong suốt quá trình học tập và thực hiện luận án. Tôi xin trân trọng cảm ơn các thầy cô trong Bộ môn Cơ khí chính xác & Quang học – Trường Đại học Bách khoa Hà Nội đã đóng góp cho tôi những ý kiến bổ ích cũng như tạo điều kiện thuận lợi về thời gian cho tôi trong suốt quá trình làm luận án. Tôi xin chân thành cảm ơn Phòng thí nghiệm Quang - Cơ Điện Tử 307 C4-5 Bộ môn Cơ Khí Chính Xác & Quang học – Trường Đại học Bách khoa Hà Nội đã tạo mọi điều kiện tốt nhất về cơ sở vật chất thí nghiệm, nhiệt tình giúp đỡ tôi trong quá trình làm luận án. Cuối cùng, tôi xin gửi lời cảm ơn sâu sắc nhất đến gia đình, bố mẹ, chồng và các con gái, anh chị em, bạn bè đã động viên, giúp đỡ, chia sẻ những khó khăn trong suốt quá trình nghiên cứu và hoàn thành luận án này. Tác giả luận án Nguyễn Thị Kim Cúc MỤC LỤC LỜI CAM ĐOAN ................................................................................................................... i DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT ............................................................ v DANH MỤC CÁC BẢNG ................................................................................................... xi DANH MỤC HÌNH ẢNH VÀ ĐỒ THỊ .............................................................................. xii MỞ ĐẦU ............................................................................................................................... 1 1. Lý do lựa chọn đề tài luận án ......................................................................................... 1 2. Mục đích, đối tượng và phạm vi nghiên cứu của luận án .............................................. 3 3. Ý nghĩa khoa học và thực tiễn của luận án ..................................................................... 3 4. Phương pháp nghiên cứu ................................................................................................ 4 5. Kết cấu của luận án ........................................................................................................ 4 6. Các kết quả mới .............................................................................................................. 5 Chương 1 TỔNG QUAN VỀ ĐO LƯỜNG CHI TIẾT CƠ KHÍ SỬ DỤNG ÁNH SÁNG CẤU TRÚC ........................................................................................................................... 6 1.1 Phương pháp đo sử dụng ánh sáng cấu trúc ................................................................. 6 1.2 Phương pháp đo sử dụng ánh sáng mã dịch pha kết hợp Gray .................................. 11 1.2.1 Phương pháp dịch pha ......................................................................................... 11 1.2.2 Phương pháp mã Gray ......................................................................................... 13 1.2.3 Phương pháp dịch pha kết hợp Gray ................................................................... 14 1.3 Các yếu tố ảnh hưởng đến độ chính xác khi đo chi tiết cơ khí .................................. 20 1.3.1 Độ chính xác hiệu chuẩn hệ thống. ..................................................................... 23 1.3.2 Ảnh hưởng của phản xạ bề mặt đến độ chính xác khi đo chi tiết cơ khí ............. 31 1.3.2.1 Mô hình phản xạ bề mặt ................................................................................. 31 1.3.2.2 Các nghiên cứu làm giảm ảnh hưởng của phản xạ bề mặt ............................. 37 1.3.3 Đánh giá độ chính xác hệ thống PSGC ............................................................... 41 1.4 Kết luận chương 1 ...................................................................................................... 48 1.5 Hướng nghiên cứu của luận án .................................................................................. 48 Chương 2 NÂNG CAO ĐỘ CHÍNH XÁC HIỆU CHUẨN SỬ DỤNG PHƯƠNG PHÁP ĐO PSGC ............................................................................................................................ 49 2.1 Cơ sở phương pháp đo sử dụng dịch pha kết hợp mã Gray (PSGC) ......................... 49 2.2 Nâng cao độ chính xác hiệu chuẩn ô vuông bàn cờ ................................................... 53 2.2.1 Lựa chọn kích thước ô vuông bàn cờ tối ưu ........................................................ 58 2.2.2 Ảnh hưởng của góc bảng hiệu chuẩn .................................................................. 59 2.2.3 Chuyển đổi từ pha sang tọa độ thực .................................................................... 59 2.2.4 Xác định giới hạn vùng đo (w h d) ............................................................... 62 2.3 Xây dựng hệ thống thiết bị thực nghiệm ................................................................... 66 2.4 Khảo sát nâng cao độ chính xác hiệu chuẩn ô vuông bàn cờ .................................... 72 2.4.1 Ảnh hưởng của kích thước ô vuông bàn cờ ......................................................... 72 2.4.2 Khảo sát ảnh hưởng của góc bảng hiệu chuẩn .................................................... 77 2.4.3 Ảnh hưởng của ánh sáng môi trường đến độ chính xác hiệu chuẩn .................... 82 2.5 Kết luận chương 2 .................................................................................................. 86 Chương 3 PHƯƠNG PHÁP GIẢM ẢNH HƯỞNG CỦA PHẢN XẠ BỀ MẶT ............... 87 3.1 Các thông số ảnh hưởng đến độ bão hòa của CCD máy ảnh ................................. 87 3.2 Phương pháp ghép đám mây điểm với các thời gian phơi sáng phù hợp .................. 91 3.3 Phương pháp ghép đám mây điểm bù vùng phản xạ ................................................. 96 3.4 Khảo sát đánh giá hiệu quả giảm ảnh hưởng phản xạ bề mặt .................................. 100 3.4.1 Khảo sát ghép đám mây điểm với các thời gian phơi sáng phù hợp ................. 103 3.4.1.1 Khảo sát với mẫu khuôn nhôm .................................................................... 103 3.4.1.2 Khảo sát với mẫu nhôm bậc M1 .................................................................. 108 3.4.2 Khảo sát ghép đám mây điểm bù vùng phản xạ lớn .......................................... 113 3.4.2.1 Khảo sát với chi tiết nhôm bề mặt phức tạp ................................................. 113 3.4.2.2 Khảo sát với chi tiết nhôm bề mặt bậc ......................................................... 115 3.5 Kết luận chương 3 .................................................................................................... 117 Chương 4 XÂY DỰNG QUY TRÌNH ĐÁNH GIÁ ĐỘ CHÍNH XÁC HỆ THỐNG ĐO PSGC ................................................................................................................................. 118 4.1 Xây dựng tiêu chuẩn đánh giá độ chính xác ............................................................ 118 4.1.1 Xây dựng thuật toán cho chuẩn đo kiểu A1 ...................................................... 118 4.1.2 Xây dựng thuật toán xác định chuẩn kiểu E1 .................................................... 122 4.1.3 Đánh giá độ chính xác theo mặt phẳng chuẩn ................................................... 125 4.2 Khảo sát độ chính xác hệ thống ............................................................................... 126 4.2.1 Đo biên dạng bề mặt của mẫu bước chuẩn ........................................................ 126 4.2.2 Đo biên dạng mặt cầu ........................................................................................ 130 4.2.3 Khảo sát độ chính xác theo mặt phẳng chuẩn ................................................... 131 4.3 Đo các chi tiết máy và khuôn cơ khí. ................................................................... 131 4.4 Kết luận chương 4 .................................................................................................... 134 KẾT LUẬN CHUNG CỦA LUẬN ÁN ............................................................................ 135 HƯỚNG NGHIÊN CỨU TIẾP THEO ............................................................................. 136 TÀI LIỆU THAM KHẢO ................................................................................................. 137 DANH MỤC CÁC CÔNG TRÌNH ĐÃ CÔNG BỐ CỦA LUẬN ÁN ............................. 143 PHỤ LỤC .............................................................................................................................. 1 DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT Danh mục các chữ viết tắt Viết tắt Tên tiếng Anh Nghĩa tiếng Việt 2D 2 Dimension Không gian 2 chiều 3D 3 Dimension Không gian 3 chiều CNC Computer numerical control Điều khiển số bằng máy tính CMM Coordinate measuring machine Máy đo tọa độ DMD Digital micromirror device Thiết bị vi gương kỹ thuật số DLP Digital light processing Xử lí ánh sáng kỹ thuật số LCD Liquid crystal display Màn hình tinh thể lỏng PSGC Phase shift combined with Gray code Phương pháp đo sử dụng ánh sáng cấu trúc dịch pha kết hợp mã Gray DOF Depth of field Độ sâu trường ảnh HDR High dynamic range Dải tương phản động mở rộng RP Reference phase Bản đồ pha mặt phẳng chiếu OP Object phase Bản đồ pha khi có vật DFP Digital fringe projection Chiếu vân kỹ thuật số SNR Signal-to-Noise ratio Tỉ số tín hiệu trên nhiễu BRDF Bidirectional reflectance distribution function chức năng phân bố phản xạ hai chiều khác nhau MIGL Maximum input graylevel Mức xám đầu vào tối đa ICP Iterative Closest Points Các điểm lặp gần nhất RANSAC RANdom SAmple Consensus Phương pháp đồng nhất mẫu ngẫu nhiên. SVD Singular value decomposition STD Standar deviation Độ lệch chuẩn Danh mục các ký hiệu Ký hiệu Đơn vị Tên tiếng Anh Nghĩa tiếng Việt t rad Unwrapped phase or absolute phase Pha tuyệt đối w rad Wrapped phase Pha tương đối Gk - Gray code value Giá trị mã Gray w( ; , , )w w wO x y z - World-coordinate system Hệ tọa độ hệ thống ( ; , , )c c c cO x y z - Camera-coordinate system Hệ tọa độ máy ảnh ( ; , , )p p p pO x y z - Projector coordinate system Hệ tọa độ máy chiếu (O; u, v) - Image-coordinate system Tọa độ mặt phẳng ảnh sc - Camera scale ratio Hệ số tỉ lệ máy ảnh sp - Projector scale ratio Hệ số tỉ lệ máy chiếu R - Rotation matrix Ma trận quay t mm Translation vector Véc-tơ tịnh tiến Pc m Pixel size Kích thước điểm ảnh Np Mp Điểm ảnh Projector resolution Độ phân giải máy chiếu Nc Mc Điểm ảnh Camera resolution Độ phân giải máy ảnh Cu Cv m CCD size Kích thước thực cảm biến CCD máy ảnh ,c cu vf f Điểm ảnh Tiêu cự máy ảnh theo hai trục u, v của cảm biến ảnh ,p pu vf f Điểm ảnh Tiêu cự máy chiếu theo hai trục u, v của cảm biến ảnh A Điểm ảnh Ma trận nội thông số k1, k2, k3 - Radial distortion coefficients Các hệ số méo hướng tâm p1, p2, p3 - Tangential distortion coefficients Các hệ số méo tiếp tuyến 0 0, c cu v - Tọa độ điểm gốc (giao điểm trục quang và mặt phảng ảnh) ,u vT T Điểm ảnh Chu kỳ vân chiếu theo phương ngang và phương dọc nTu, nTv - Số chu kỳ vân Gray theo phương ngang và phương dọc wh d mm Height Width Depth Kích thước vùng đo theo chiều cao rộng sâu D mm Aperture diameter Đường kính khẩu độ ống kính N f D= - The number f Số f f mm Focal langth Tiêu cự thấu kính Độ ( ) Góc giữa trục quang của máy ảnh và máy chiếu 0R - Reference plane Mặt phẳng tham chiếu S mm Checker size Kích thước ô vuông bàn cờ B B mm Checkboard size Kích thước bảng hiệu chuẩn Độ ( ) Góc mở của máy chiếu theo phương ngang Độ ( ) Góc mở của máy chiếu theo phương dọc O O b = mm Base line Đường cơ sở (Khoảng cách giữa quang tâm của máy ảnh và máy chiếu) L mm Khoảng cách từ đường cơ sở đến mặt phẳng tham chiếu R0 ( , )cI u v Mức xám Cường độ ánh sáng thu được từ máy ảnh ( , )pI u v Mức xám Cường độ ánh sáng chiếu từ máy chiếu mI Mức xám Cường độ ánh sáng môi trường xung quanh AR - Hệ số phản xạ bề mặt tại điểm A tc ms Exposure time Thời gian phơi sáng của máy ảnh tp ms Wait time Thời gan trễ của máy chiếu - Độ nhạy của máy ảnh nI - Nhiễu của máy ảnh c µm Circle of confusion Kích thước vòng tán xạ n - Số điểm ảnh trong đám mây điểm Si - Các vùng mức xám l - Thứ tự mức xám trên thang độ xám từ 0 đến 255 mức Ik Mức xám Giá trị mức xám thứ k p(Si ) % Tỉ lệ tổng số điểm ảnh có cùng mức xám trong vùng Si - threso Ngưỡng sai số cho phép k - Số lần lặp m - Inlier Số điểm trong tập p % The probability of a successful detection Xác xuất thành công của thuật toán DANH MỤC CÁC BẢNG Bảng 1.1 Tính chất của vật liệu màu sắc đặc trưng với các hệ số phản xạ bề mặt ......... 33 Bảng 1.2 Các loại tiêu chuẩn đo ..................................................................................... 42 Bảng 2.1 Kết quả hiệu chuẩn trong hai trường hợp (a) và (b) ........................................ 82 Bảng 4.1 Dữ liệu đo chiều cao bậc ở các vị trí cắt khác nhau .................................... 1289 Bảng 4.2 Kết quả đo chi tiết bậc131 Bảng 4.3 Dữ liệu đo phù hợp mặt phẳng ở các vị trí và hướng khác nhau ................... 131 DANH MỤC HÌNH ẢNH VÀ ĐỒ THỊ Hình 1.1 Sơ đồ khối hệ thống đo bằng ánh sáng cấu trúc ........................................ ... ); Y = reshape(Y,1,[]); Z = sin(X).*cos(Y); % Tao du lieu ma tran D = [X; Y; Z]; %chuyen đoi cac gia tri(a.u.): T = [Tx; Ty; Tz]; % Vec to tinh tien Rx = [1 0 0; % Ma tran quay (rad.): 0 cos(rx) -sin(rx); 0 sin(rx) cos(rx)]; Ry = [cos(ry) 0 sin(ry); 0 1 0; -sin(ry) 0 cos(ry)]; Rz = [cos(rz) -sin(rz) 0; sin(rz) cos(rz) 0; 0 0 1]; R = Rx*Ry*Rz; % Chuyen đoi du lieu ma tran M = R * D + repmat(T, 1, n); % them mo hinh và du lieu rng(2912673); M = M + 0.01*randn(3,n); D = D + 0.01*randn(3,n); %% Chay thuan toan ICP (standard settings) [Ricp Ticp ER t] = icp(M, D, n); Dicp = Ricp * D + repmat(Ticp, 1, n); . %% Chay thuan toan ICP (fast kDtree matching and extrapolation) function [TR, TT, ER, t] = icp(q,p,varargin) [Ricp Ticp ER t] = icp(M, D, 15, 'Matching', 'kDtree', 'Extrapolation', true); % Chuyen doi du lieu ma tran su dung ket qua ICP Dicp = Ricp * D + repmat(Ticp, 1, n); figure; subplot(2,2,1); plot3(M(1,:),M(2,:),M(3,:),'bo',D(1,:),D(2,:),D(3,:),'r.'); axis equal; 28 xlabel('x'); ylabel('y'); zlabel('z'); title('Red: z=sin(x)*cos(y), blue: transformed point cloud'); .. %% Chay thuan toan ICP (partial data) Mp = M(:,Y>=0); b = (abs(X(Y>=0)) == 2) | (Y(Y>=0) == min(Y(Y>=0))) | (Y(Y>=0) == max(Y(Y>=0))); bound = find(b); Dp = D(:,X>=0); [Ricp Ticp ER t] = icp(Mp, Dp, 50, 'EdgeRejection', true, 'Boundary', bound, 'Matching', 'kDtree'); Dicp = Ricp * Dp + repmat(Ticp, 1, size(Dp,2)); if arg.Extrapolation % khoi tao cac vec to truyen doi (quaternion ; translation vec.) qq = [ones(1,arg.iter+1);zeros(6,arg.iter+1)]; % Phan bo cac vector de thay doi huong va goc dq = zeros(7,arg.iter+1); theta = zeros(1,arg.iter+1); end t(1) = toc; % Tro lai vong lap chinh for k=1:arg.iter % Thuc hien ghep switch arg.Matching case 'bruteForce' [match mindist] = match_bruteForce(q,pt); case 'Delaunay' [match mindist] = match_Delaunay(q,pt,DT); case 'kDtree' [match mindist] = match_kDtree(q,pt,kdOBJ); end weights = arg.Weight(match); ` % Xac dinh vector weight [R,T] = eq_point(q(:,q_idx),pt(:,p_idx), weights(p_idx)); case 'plane' weights = arg.Weight(match); [R,T] = eq_plane(q(:,q_idx),pt(:,p_idx),arg.Normals(:,q_idx),weights(p_idx)); case 'lmaPoint' [R,T] = eq_lmaPoint(q(:,q_idx),pt(:,p_idx)); end TR(:,:,k+1) = R*TR(:,:,k); % Add to the total transformation TT(:,:,k+1) = R*TT(:,:,k)+T; pt = TR(:,:,k+1) * p + repmat(TT(:,:,k+1), 1, Np); % Apply last transformation ER(k+1) = rms_error(q(:,q_idx), pt(:,p_idx)); % Root mean of objective function mindist = sqrt(mindist); function [R,T] = eq_point(q,p,weights) m = size(p,2); n = size(q,2); % tim vector trong tam weights = weights ./ sum(weights); % find data centroid and deviations from centroid q_bar = q * transpose(weights); q_mark = q - repmat(q_bar, 1, n); % Apply weights q_mark = q_mark .* repmat(weights, 3, 1);% find data centroid and deviations from centroid p_bar = p * transpose(weights); p_mark = p - repmat(p_bar, 1, m); % Apply weights %p_mark = p_mark .* repmat(weights, 3, 1); 29 N = p_mark*transpose(q_mark); % taking points of q in matched order function [R,T] = eq_lmaPoint(q,p) Rx = @(a)[1 0 0; 0 cos(a) -sin(a); 0 sin(a) cos(a)]; Ry = @(b)[cos(b) 0 sin(b); 0 1 0; -sin(b) 0 cos(b)]; Rz = @(g)[cos(g) -sin(g) 0; sin(g) cos(g) 0; 0 0 1]; Rot = @(x)Rx(x(1))*Ry(x(2))*Rz(x(3)); myfun = @(x,xdata)Rot(x(1:3))*xdata+repmat(x(4:6),1,length(xdata)); options = optimset('Algorithm', 'levenberg-marquardt'); function R = quat2rmat(quaternion) q0(1,1,:) = quaternion(1,:); qx(1,1,:) = quaternion(2,:); qy(1,1,:) = quaternion(3,:); qz(1,1,:) = quaternion(4,:); R = [q0.^2+qx.^2-qy.^2-qz.^2 2*qx.*qy-2*q0.*qz 2*qx.*qz+2*q0.*qy; 2*qx.*qy+2*q0.*qz q0.^2-qx.^2+qy.^2-qz.^2 2*qy.*qz-2*q0.*qx; 2*qx.*qz-2*q0.*qy 2*qy.*qz+2*q0.*qx q0.^2-qx.^2-qy.^2+qz.^2]; P = (x - repmat(p_bar,1,k)) * transpose(x - repmat(p_bar,1,k)); % [~, idx] = min(diag(D)); % Chon tri rieng nho nhat n(:,i) = V(:,idx); % Tro ve tri rieng tuong ung end function [neighborIds neighborDistances] = k_nearest_neighbors(dataMatrix, queryMatrix, k) numDataPoints = size(dataMatrix,2); numQueryPoints = size(queryMatrix,2); neighborIds = zeros(k,numQueryPoints); neighborDistances = zeros(k,numQueryPoints); D = size(dataMatrix, 1); % Kich thuoc cua cac diem pts = double(pts); %Calculating freeboundary points: TR = TriRep(poly, pts(1,:)', pts(2,:)', pts(3,:)'); FF = freeBoundary(TR);%Output bound = FF(:,1); 4. Tóm lược chương trình phù hợp mặt phẳng myRANSACLinear.cpp #include "myRANSACLinear.h" using namespace my_line; bestLine.SetOrigin_1(point); bestLine.SetOrigin_2(point); } void CopyLine(myLine &line, myLine &output) { 30 double *o_1, *o_2, *n; o_1 = line.GetOrigin_1(); o_2 = line.GetOrigin_2(); n = line.GetNormal(); output.SetNormal(n); output.SetOrigin_1(o_1); output.SetOrigin_2(o_2); } double CalcDist(cv::Point point, myLine &line) { double *n, *o; double dis, A, B, C; n = line.GetNormal(); o = line.GetOrigin_1(); A = n[0] / 10; B = n[1] / 10; C = -n[0] / 10 * o[0] / 10 - n[1] / 10 * o[1] / 10; dis = (abs(A*point.x / 10 + B*point.y / 10 + C)) / (sqrt(pow(A, 2) + pow(B, 2))); return dis; myRANSACPlane.cpp #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkPolyData.h" #include "vtksys\stl\set" #include "MyRANSACPlane.h" myRANSACPlane::myRANSACPlane(void) { this->InlierThreshold = 1.0; this->MaxIterations = 1000; this->NumPointsToFit = 3; this->GoodEnough = 1.0; return this->GoodEnough; void myRANSACPlane::getPlane(vtkSmartPointer inputPoints, double *normal, double *origin) //track best model this->BestPlane = vtkSmartPointer::New(); //truck number of inliers of best model unsigned int maxInliers = 0; for (unsigned int iter = 0; iter MaxIterations; iter++) { //pick NumPointsToFit random indices vtkstd::vector randomIndices = UniqueRandomIndices(inputPoints->GetNumberOfPoints(), NumPointsToFit); vtkSmartPointer points = vtkSmartPointer::New(); ExtractPoints(inputPoints, randomIndices, points); //find the best plane through these random points vtkSmartPointer plane = vtkSmartPointer::New(); BestFitPlane(points, plane); 31 vtkstd::vector inlierIndices = this- >DetermineInliers(inputPoints, plane); if (inlierIndices.size() > maxInliers) { maxInliers = inlierIndices.size(); CopyPlane(plane, this->BestPlane); } if (inlierIndices.size() > inputPoints->GetNumberOfPoints()*this- >GoodEnough) //if GoodEnough % of the points fit the model, we can stop the search break; } //end RANSAC loop double n[3], o[3]; this->BestPlane->GetNormal(n); this->BestPlane->GetOrigin(o); if (!(numIndices <= maxIndex + 1)) { return indices; } vtkstd::set S; while (S.size() < numIndices) { S.insert(vtkMath::Random(0, maxIndex)); } for (std::set::iterator iter = S.begin(); iter != S.end(); iter++) { indices.push_back(*iter); } return indices; } void ExtractPoints(vtkPoints* points, vtkstd::vector indices, vtkPoints* output) { for (unsigned int i = 0; i < indices.size(); i++) { double p[3]; points->GetPoint(indices[i], p); output->InsertNextPoint(p[0], p[1], p[2]); } double **a = create_matrix(3, 3); a[0][0] = 0; a[0][1] = 0; a[0][2] = 0; a[1][0] = 0; a[1][1] = 0; a[1][2] = 0; a[2][0] = 0; a[2][1] = 0; a[2][2] = 0; for (int pointId = 0; pointId < NumPoints; pointId++) { double x[3]; double xp[3]; points->GetPoint(pointId, x); 32 xp[0] = x[0] - Center[0]; xp[1] = x[1] - Center[1]; xp[2] = x[2] - Center[2]; for (int i = 0; i < 3; i++) { a[0][i] += xp[0] * xp[i]; a[1][i] += xp[1] * xp[i]; a[2][i] += xp[2] * xp[i]; for (int i = 0; i < 3; i++) //divide by N-1 { a[0][i] /= dNumPoints - 1; a[1][i] /= dNumPoints - 1; a[2][i] /= dNumPoints - 1; } // Extract eigenvectors from covariance matrix double **eigvec = create_matrix(3, 3); double eigval[3]; vtkMath::Jacobi(a, eigval, eigvec); //cleanup free_matrix(eigvec); free_matrix(a); //Set the plane origin to the center of mass BestPlane->SetOrigin(Center[0], Center[1], Center[2]); } void CopyPlane(vtkPlane* plane, vtkPlane* output) { double n[3]; plane->GetNormal(n); double o[3]; plane->GetOrigin(o); output->SetNormal(n); output->SetOrigin(o); } void CenterOfMass(vtkPoints* points, double* center) { center[0] = 0.0; center[1] = 0.0; center[2] = 0.0; for (vtkIdType i = 0; i GetNumberOfPoints(); i++) { double point[3]; points->GetPoint(i, point); center[0] += point[0]; center[1] += point[1]; center[2] += point[2]; double numberOfPoints = static_cast(points->GetNumberOfPoints()); center[0] = center[0] / numberOfPoints; center[1] = center[1] / numberOfPoints; center[2] = center[2] / numberOfPoints; } 33 char* filename, vtkSmartPointer &PointClouds) { VTK_CREATE(vtkPLYReader, reader); reader->SetFileName(filename); reader->Update(); PointClouds = reader->GetOutput(); } void myReadData::ReadOBJFile(const char* filename, vtkSmartPointer &PointClouds) { VTK_CREATE(vtkOBJReader, reader); reader->SetFileName(filename); reader->Update(); PointClouds = reader->GetOutput(); } #include "myRANSACLinear.h" using namespace my_line; myRANSACLinear::myRANSACLinear() void myRANSACLinear::setGoodEnough(double mGoodEnough) double *o_1, *o_2, *n; o_1 = BestLine.GetOrigin_1(); o_2 = BestLine.GetOrigin_2(); n = BestLine.GetNormal(); for (int i = 0; i < 2; i++) { origin_1[i] = o_1[i]; origin_2[i] = o_2[i]; normal[i] = n[i]; std::vector inlierIndices; for (uint i = 0; i < (uint)points.size(); i++) { dis = CalcDist(points[i], line); //std::cout << dis << std::endl; if (dis InlierThreshold) inlierIndices.push_back(i); } return inlierIndices; } namespace my_line std::vector UniqueRandomIndices(const uint maxIndex, const uint numIndices) { std::vector indices; temp_1 = rand() % (maxIndex + 1); if ((temp_1 + 10 0)) temp_2 = rand() % ((temp_1 + 10 - (temp_1 - 10) + 1) + temp_1 - 10); else if (temp_1 + 10 > maxIndex) temp_2 = rand() % ((maxIndex - (temp_1 - 10) + 1) + temp_1 - 10); else if (temp_1 - 10 < 0) temp_2 = rand() % (temp_1 + 10 + 1); 34 S.insert(temp_1); S.insert(temp_2); for (std::set::iterator iter = S.begin(); iter != S.end(); iter++) { indices.push_back(*iter); } return indices colors->SetNumberOfComponents(3); colors->SetName("Colors"); VTK_CREATE(vtkPolyDataMapper, mapper); mapper->SetInputConnection(polydata->GetProducerPort()); mapper->Update(); VTK_CREATE(vtkActor, actor); actor->SetMapper(mapper); actor->GetProperty()->SetPointSize(point_size); for (int i = 0; i GetNumberOfPoints(); i++) {//double pt[3]; double rColor = color[0], gColor = color[1], bColor = color[2]; //polydata->GetPoint(i, pt); colors->InsertNextTuple3(rColor * 255, gColor * 255, bColor * 255); } polydata->GetPointData()->SetScalars(colors); if (clear_window) { renDisplay->RemoveAllViewProps(); } renDisplay->AddActor(actor); public: myPCLProcessing(); ~myPCLProcessing(); void FittingPlane(vtkSmartPointer points, double double *origin, double &average_err); void Calc_standard_deviation(vtkPoints *points, double *normal, double *origin, double average_err, double &standard_deviation); void FittingSphere(vtkSmartPointer points, double InlierThreshold, double MaxIterations, double* center, double *radius); void Calc_average_err(vtkSmartPointer points, double *center, double radius, double &average_err); void Calc_standard_deviation(vtkPoints *points, double *center, double radius, double average_err, double &standard_deviation); }; 5. Tóm lược chương trình phù hợp mặt cầu #include "stdafx.h" #include "vtkCellArray.h" using namespace my_sphere; 35 myRANSACSphere::myRANSACSphere(void) { this->InlierThreshold = 1.0; this->MaxIterations = 1000; this->NumPointsToFit = 4; this->GoodEnough = 1.0; } myRANSACSphere::~myRANSACSphere(void) { void myRANSACSphere::setInlierThreshold(double mInlierThreshold) { this->InlierThreshold = mInlierThreshold; } void myRANSACSphere::setMaxIterations(unsigned int mMaxIterations) { this->MaxIterations = mMaxIterations; } void myRANSACSphere::setGoodEnough(double mGoodEnough) { this->GoodEnough = mGoodEnough; } double myRANSACSphere::getInlierThreshold() for (unsigned int iter = 0; iter MaxIterations; iter++) //find the best sphere through these random points vtkSmartPointer sphere = vtkSmartPointer::New(); BestFitSphere(points, sphere); } } //end RANSAC loop double c[3], r; this->BestSphere->GetCenter(c); r = this->BestSphere->GetRadius(); for (unsigned int i = 0; i < 3; i++) { .. vtkstd::set S; while (S.size() < numIndices) for (std::set::iterator iter = S.begin(); iter != S.end(); iter++) } double p1[3], p2[3], p3[3], p4[3]; double radius; points->GetPoint(0, p1); points->GetPoint(1, p2); points->GetPoint(2, p3); points->GetPoint(3, p4); A[0][0] = 2 * (p1[0] - p2[0]); A[0][1] = 2 * (p1[1] - p2[1]); A[0][2] = 2 * (p1[2] - p2[2]); A[0][3] = pow(p1[0], 2) + pow(p1[1], 2) + pow(p1[2], 2) - pow(p2[0], 2) - pow(p2[1], 2) - pow(p2[2], 2); A[1][0] = 2 * (p1[0] - p3[0]); 36 A[1][1] = 2 * (p1[1] - p3[1]); A[1][2] = 2 * (p1[2] - p3[2]); A[1][3] = pow(p1[0], 2) + pow(p1[1], 2) + pow(p1[2], 2) - pow(p3[0], 2) - pow(p3[1], 2) - pow(p3[2], 2); A[2][0] = 2 * (p1[0] - p4[0]); A[2][1] = 2 * (p1[1] - p4[1]); A[2][2] = 2 * (p1[2] - p4[2]); A[2][3] = pow(p1[0], 2) + pow(p1[1], 2) + pow(p1[2], 2) - pow(p4[0], 2) - pow(p4[1], 2) - pow(p4[2], 2); // Giai hpt bang Gauss void CopySphere(vtkSphere* sphere, vtkSphere* output) double c[3]; sphere->GetCenter(c); double r; r = sphere->GetRadius(); output->SetCenter(c); output->SetRadius(r); double CalcDist(double *point, vtkSphere *sphere) { //Get center and radius double center[3]; double radius = sphere->GetRadius(); double distance; sphere->GetCenter(center); distance = radius - sqrt(pow(point[0] - center[0], 2) + pow(point[1] - center[1], 2) + pow(point[2] - center[2], 2)); return abs(distance);
File đính kèm:
- luan_an_nghien_cuu_su_dung_phuong_phap_anh_sang_cau_truc_de.pdf
- Bia Quyen tom tat.pdf
- thong tin dua len mang AV.pdf
- tomtatluanan.pdf