在OpenCV中对齐两张图片

12

我有两张图片(如下所示),它们代表一对电缆的轮廓,并使用基于激光的3D三角测量捕获。第一张图片是用左侧相机捕获的,而第二张是用右侧相机捕获的。可以看到,这些图像部分重叠。第一张图像上的左侧部分部分对应于第二张图像上的左侧部分。同样适用于右边部分。我想将这两个图像合并成一个图像,使相应的部分重叠。

除了这些图像之外,我还有以下信息:

  • 左右相机的3x3单应性矩阵H
  • 左右相机的内参矩阵K
  • 左右相机的畸变系数D(9个)
  • 左右相机的偏移量O

此数据如下所示。

在Halcon中,我尝试使用镶嵌来完成此操作:

  • 使用哈里斯在两个图像中提取特征点
  • 使用Ransac从一个图像计算出投影变换矩阵到另一个图像。
  • 应用找到的投影变换矩阵。

但是这种方法并不成功。我正在寻找一种类似的方法在OpenCV或Halcon中,或者一种利用我拥有的校准数据(如单应性矩阵和相机矩阵)的方法,也可以在OpenCV或Halcon中。

如果可能,请提供充分的解释,因为我刚刚开始使用机器视觉。

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]

你能够访问相对于激光扫描仪的像素的3D点位置吗?(“使用基于激光的三角测量法进行捕获”) - Micka
不,我不这么认为。我能否使用可用的数据(如单应性或相机矩阵)计算这个? - JNevens
那么这些图像不是通过三维三角测量设备(如激光扫描仪)捕获的吗?这些设备通常会捕获一个三维点云网格。 - Micka
@Micka 我不是完全确定,但是Hl矩阵和Ol矩阵组合起来是否形成了左相机的外参(其中Hl是3x3旋转矩阵,Ol是平移矩阵)? - JNevens
看起来不太对劲...你能否尝试使用cv::warpPerspective和这些单应性矩阵? - Micka
显示剩余4条评论
1个回答

1

在这里,模板匹配会解决问题。我稍微尝试了一下,希望您会发现它有用(以下是代码):

enter image description here

MAX_DISPARITY = 100;
imgL=double(imread('https://istack.dev59.com/y5tOJ.webp'));
imgR=double(imread('https://istack.dev59.com/L1EQy.webp'));
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接