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

