2016-08-05 14 views
11

Mam dwa obrazy (patrz poniżej). Obrazy te przedstawiają kontury pary kabli i zostały uchwycone za pomocą laserowej triangulacji 3D. Pierwsze zdjęcie zostaje zrobione lewym aparatem, a drugie prawym aparatem. Jak widać, obrazy te częściowo się nakładają. Lewa część na pierwszym obrazie częściowo odpowiada lewej części na drugim obrazie. To samo dotyczy prawej części. Chcę połączyć te dwa obrazy w jeden obraz, aby odpowiednie części zachodziły na siebie.Wyrównaj dwa obrazy w OpenCV

Obok tych obrazów, ja też mam następujące informacje do mojej dyspozycji:

  • Macierz 3x3 homography H z lewej i prawej kamery
  • wewnętrzne parametry aparatu K z lewej i prawej kamery
  • Współczynniki zniekształceń D (9 z nich) z lewej i prawej kamery
  • Przesunięcie O lewej i prawej kamery

Dane te podano poniżej.

W Halcon, próbowałem to zrobić przy użyciu mozaikowania:

  • ekstrakcji punktów charakterystycznych w obu obrazów za pomocą Harris
  • obliczyć rzutowe macierz transformacji z jednego obrazu do drugiego, używając Ransac.
  • Zastosuj znalezioną macierz transformacji rzutowej.

Podejście to jednak nie powiodło się. Szukam podobnego podejścia w OpenCV lub Halcon lub podejścia (także w OpenCV lub Halcon), które wykorzystuje dane kalibracyjne, które mam do dyspozycji, takie jak macierz homografii i matryca kamery.

Proszę podać objaśnienia, jeśli to możliwe, ponieważ dopiero zaczynam od Machine Vision.

enter image description here enter image description here

Hl := [0.00175186, 4.73083e-05, -0.00108921, 
     0.000780817, -0.00145615, 0.00118631, 
     0.0534139, -0.030823,  1.0  ] 
Kl := [4578.21, -5.05144, 759.766, 
     0.0,  4576.87, 568.223, 
     0.0,  0.0,  1.0 ] 
Dl := [-0.12573, 0.0533453, -0.575361, -0.0130272, 0.00348033, 0.00852617, -0.0271142, 0.0176706, -0.00575124] 
Ol := [0.0, 150.0] 

Hr := [0.00173883, -2.94597e-05, 0.00109873, 
     -0.00077676, -0.0014687, 0.00121393, 
     -0.0653829, -0.0443924, 1.0  ] 
Kr := [4591.96, -4.55317, 1284.74, 
     0.0, 4591.19,  534.317, 
     0.0,  0.0,  1.0 ] 
Dr := [-0.110751, -0.349716, 3.86535, 0.017393, -0.00364957, -0.00633656, 0.0338833, -0.0212222, 0.00543694] 
Or := [0.0, 100.0] 
+0

masz dostęp do 3d pozycjach punkcie pikseli, w stosunku do skanera laserowego.? ("zostały przechwycone za pomocą laserowej triangulacji 3D") – Micka

+0

Nie, nie sądzę. Czy mogę to obliczyć za pomocą dostępnych danych, takich jak homografia lub matryca aparatu? – JNevens

+0

, więc zdjęcia nie zostały uchwycone za pomocą trójwymiarowego urządzenia do triangulacji, takiego jak skaner laserowy? te urządzenia zazwyczaj przechwytują trójwymiarową siatkę chmur punktów – Micka

Odpowiedz

1

szablon pasujący by rade tutaj. Grałem z nim trochę, nadzieję, że to usuful (kod poniżej):

enter image description here

MAX_DISPARITY = 100; 
imgL=double(imread('https://i.stack.imgur.com/y5tOJ.png')); 
imgR=double(imread('https://i.stack.imgur.com/L1EQy.png')); 
imgRfused = imgR; 
minmax = @(v) [min(v) max(v)]; 
[imgLbw,n]=bwlabel(imgL); 
nBlobs=2; 
a=arrayfun(@(i) sum(imgLbw(:)==i),1:n); 
[~,indx]=sort(a,'descend'); 
imgLbwC=bsxfun(@eq,imgLbw,permute(indx(1:nBlobs),[3 1 2])); 
imgLbwC =bsxfun(@times,imgLbwC,2.^permute(0:nBlobs-1,[3 1 2])); 
imgLbwC = sum(imgLbwC ,3); 

src = zeros(nBlobs,4); 
dst = zeros(nBlobs,4); 

for i=1:nBlobs 
    [y,x]=find(imgLbwC==i); 
    mmx = minmax(x); 
    mmy = minmax(y); 
    ker = imgL(mmy(1):mmy(2),mmx(1):mmx(2)); 

    [yg,xg]=ndgrid(mmy(1):mmy(2),mmx(1):mmx(2)); 
    src(i,:)=[mmx(1) mmy(1) fliplr(size(ker))]; 


    imgR_ = imgR(:,mmx(1)-MAX_DISPARITY:mmx(2)+MAX_DISPARITY); 
    c=conv2(imgR_ ,rot90(double(ker),2),'valid')./sqrt(conv2(imgR_.^2,ones(size(ker)),'valid')); 
    [yy,xx]=find(c==max(c(:)),1); 
    dst(i,:)=[src(i,1:2)+[xx yy-mmy(1)]+[-MAX_DISPARITY,0] fliplr(size(ker))]; 

    imgRfused(dst(i,2):dst(i,2)+dst(i,4),dst(i,1):dst(i,1)+dst(i,3)) = max(imgRfused(dst(i,2):dst(i,2)+dst(i,4),dst(i,1):dst(i,1)+dst(i,3)),imgL(src(i,2):src(i,2)+src(i,4),src(i,1):src(i,1)+src(i,3))); 
end 
imagesc(imgRfused); 
axis image 
colormap gray