2016-08-05 26 views
11

Ich habe zwei Bilder (siehe unten). Diese Bilder stellen die Konturen eines Kabelpaares dar und wurden mittels Laser-3D-Triangulation aufgenommen. Das erste Bild wird mit der linken Kamera und das zweite mit der rechten Kamera aufgenommen. Wie man sieht, überlappen sich diese Bilder teilweise. Der linke Teil des ersten Bildes entspricht teilweise dem linken Teil des zweiten Bildes. Das Gleiche gilt für den rechten Teil. Ich möchte diese beiden Bilder zu einem Bild zusammenfügen, damit sich die entsprechenden Teile überschneiden.Richten Sie zwei Bilder in OpenCV

Neben diesen Bildern habe ich auch die folgenden Informationen zu meiner Verfügung:

  • A 3x3 Homografie Matrix H von linken und rechten Kamera
  • Intrinsic Kameraparameter K von linken und rechten Kamera
  • Verzeichnungskoeffizienten D (9 von ihnen) der linken und rechten Kamera
  • Offset O der linken und rechten Kamera

Diese Daten sind unten angegeben.

In Halcon habe ich versucht, dies mit Mosaikieren zu tun:

  • Extract charakteristischen Punkte in beiden Bildern Harris
  • eine projektive Transformationsmatrix von einem Bild zu dem anderen unter Verwendung von RANSAC verwendet.
  • Wenden Sie die gefundene projektive Transformationsmatrix an.

Dieser Ansatz war jedoch nicht erfolgreich. Ich suche nach einem ähnlichen Ansatz in OpenCV oder Halcon oder einen Ansatz (auch in OpenCV oder Halcon), der die mir zur Verfügung stehenden Kalibrierungsdaten nutzt, wie die Homographiematrix und die Kameramatrix.

Bitte geben Sie möglichst ausführliche Erklärungen, da ich erst mit Machine Vision anfange.

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

haben Sie Zugriff auf die 3D-Punktpositionen der Pixel, relativ zum Laserscanner.? ("wurden mit Laser-3D-Triangulation erfasst") – Micka

+0

Nein, ich denke nicht. Kann ich das mit den verfügbaren Daten wie Homographie oder Kameramatrix berechnen? – JNevens

+0

so werden die Bilder nicht mit einem 3D-Triangulationsgerät wie ein Laserscanner erfasst? diese Geräte erfassen in der Regel ein 3D-Punkt-Cloud-Raster – Micka

Antwort

1

Template Matching würde hier den Trick. Ich spielte mit ihm ein wenig, hoffen, Sie finden es usuful (Code unten):

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