如何在opencv中合并两个图像?

时间:2012-04-21 06:23:57

标签: visual-c++ image-processing opencv computer-vision image-stitching

我已经计算出单应性,取出透视变换。我能够在一个窗口中显示两个图像但是无法合并它们。这是我的示例图像 - > image1

image2

我使用此代码的代码 - >

cv::warpPerspective(image2,warpresult2,homography,cv::Size(2*image2.cols,image2.rows));


Mat imgResult(image1.rows,2*image1.cols,image1.type());

Mat roiImgResult_Left = imgResult(Rect(0,0,image1.cols,image1.rows)); 
Mat roiImgResult_Right = imgResult(Rect(image1.cols,0,image2.cols,image2.rows)); 

Mat roiImg1 = image1(Rect(0,0,image1.cols,image1.rows));
Mat roiImg2 = warpresult2(Rect(0,0,image2.cols,image2.rows));

roiImg1.copyTo(roiImgResult_Left); //Img1 will be on the left of imgResult
roiImg2.copyTo(roiImgResult_Right); //Img2 will be on the right of imgResult

imshow("Finalimg",imgResult);
imwrite("C:\\OpenCv_Projects\\outputimage.jpg",imgResult);
cvWaitKey(0);

我认为问题出在我给予roiImgResult_right的坐标中。

输出图像是 - > Output images 如你所见,图像没有正确合并,右侧有黑色区域。如何删除它?

4 个答案:

答案 0 :(得分:17)

OpenCV已经实现了图像拼接。如果使用“-D BUILD_EXAMPLES”进行编译,则可以使用二进制 stitching_detailed 。用法很简单:./stitching_detailed img1 img2 ...

或者,您可以使用拼接器类(来自here的示例):

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/stitching/stitcher.hpp"

using namespace std;
using namespace cv;

bool try_use_gpu = false;
string result_name = "result.jpg";

int main(int argc, char* argv[])
{
    vector<Mat> imgs;
    // add images...

    Mat pano;
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
    stitcher.stitch(imgs, pano);
    imwrite(result_name, pano);
}

答案 1 :(得分:7)

  • 图像混合: 您可以使用拉普拉斯金字塔blending。使用opencv查看示例代码here。你可以使用你喜欢的任何面具(这是一个二元面具)。

  • 创建全景 如果要制作全景照片,可以使用最小剪切拼接。一世 找到了执行全景processing

  • 的代码

答案 2 :(得分:1)

您可以使用addWeighted()功能轻松混合两个图像。 但要求是你必须制作相同尺寸的图像。

如果图像尺寸不同,请先调整两张图像的大小。 然后调用以下函数。

addWeighted(src1, alpha, src2, beta, 0.0, dst);

声明两个Mat个文件

src1 = imread("c://test//blend1.jpg");
src2 = imread("c://test//blend2.jpg");

同时声明alphabeta,然后将结果保存到Mat dst

您还可以在此处获取详细信息Blending of Images using Opencv

答案 3 :(得分:1)

如果你做得更仔细,比如不要裁剪和堆叠,但是使用alphaBlend,那么你会发现一些奇怪的东西。

这是匹配的图片:

enter image description here

这是包装的img2:

enter image description here

这是做alphablend的掩码:

enter image description here

这是alphaBlended:

enter image description here

我们可以很容易地在混合图像中找到鬼影。这是因为cwarpPerspective无法真正找到perspectiveTransform相机投影等式。主要是因为图片面板是real,但panelcylindrical surface或更复杂。所以我们所做的工作还不够。

虽然好的新spherical surface提供了OpenCV,但我们可以通过High level stiching API轻松拼接。结果如下。

enter image description here

代码:

OpenCV Stitching API

一些有用的链接:

  1. OpenCV Stitching:https://docs.opencv.org/3.3.0/d8/d19/tutorial_stitcher.html

  2. OpenCV C ++中的Alpha混合:Combining 2 images with transparent mask in opencv

  3. OpenCV Python中的Alpha混合: Gradient mask blending in opencv python