Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Opencv-如何合并两个图像_C++_Image_Opencv - Fatal编程技术网

C++ Opencv-如何合并两个图像

C++ Opencv-如何合并两个图像,c++,image,opencv,C++,Image,Opencv,我是opencv的新手,我在互联网上搜索了如何合并两幅图像的例子,但没有找到任何好的帮助。有人能帮我一些指示或一个小代码来理解吗?提前感谢从对问题的评论中,您说: 我不想把第一幅画的一半和第二幅画的另一半混在一起。我只是想打印两张照片,一张挨着另一张 因此,从这些图像开始: 你想要这个结果吗 请注意,如果两个图像具有相同的高度,则不会看到黑色背景 代码: #包括 使用名称空间cv; int main() { //加载图像 Mat3b img1=imread(“路径到图像1”); Mat3b

我是opencv的新手,我在互联网上搜索了如何合并两幅图像的例子,但没有找到任何好的帮助。有人能帮我一些指示或一个小代码来理解吗?提前感谢

从对问题的评论中,您说:

我不想把第一幅画的一半和第二幅画的另一半混在一起。我只是想打印两张照片,一张挨着另一张

因此,从这些图像开始:

你想要这个结果吗

请注意,如果两个图像具有相同的高度,则不会看到黑色背景

代码:

#包括
使用名称空间cv;
int main()
{
//加载图像
Mat3b img1=imread(“路径到图像1”);
Mat3b img2=imread(“路径到图像2”);
//获取最终图像的尺寸
int rows=max(img1.rows,img2.rows);
int cols=img1.cols+img2.cols;
//创建一个黑色图像
Mat3b res(行、列、向量3B(0,0,0));
//将图像复制到正确的位置
copyTo(res(Rect(0,0,img1.cols,img1.rows));
copyTo(res(Rect(img1.cols,0,img2.cols,img2.rows));
//显示结果
imshow(“Img 1”,img1);
imshow(“Img 2”,img2);
imshow(“结果”,res);
waitKey();
返回0;
}

我在C#(OpenCvSharp)中垂直连接了两个图像:(图像大小可以不同)

private Mat VerticalConcat(Mat image1,Mat image2)
{
var smallImage=image1.Colsimage2.Cols?image1:image2;
Mat combine=Mat.Zeros(新的OpenCvSharp.CPlusPlus.Size(Math.Abs(image2.Cols-image1.Cols)、smallImage.Height、image2.Type());
Cv2.HConcat(smallImage,combine,combine);
Cv2.VConcat(bigImage,combine,combine);
回程联合收割机;
}

您所说的“合并”是什么意思?混合?插值从一个图像中提取对象并将其放置到另一个图像中?你需要解释你想要实现什么,因为它不是很清楚。就像这个例子中的“”,但是如果你看到,他有一个错误,在图像的右边有一个黑色区域。我希望有人能更好地解释我。通过“合并”,我的意思是我想将两个图像连接成一个,或者打印两个图像,一个靠近另一个。此任务包括两个步骤:1。计算第1个图像中必须放置第2个图像(非平凡)和第2个图像的位置信息。决定应使用第1幅图像的哪些像素以及应使用第2幅图像的哪些像素,或者如何组合(混合)使用的像素。你需要这两个步骤的信息还是第二个步骤的信息?如果你能向我解释这两个步骤那就太好了:D.正如我说的,我是opencv新手,所以有一些事情我还不清楚。正如我从上面的链接中看到的,有一些函数可以进行合并,我想问是否有一种更简单的方法可以再说一遍,也许我解释得不好,我不想将第一张图片的一半与第二张图片的另一半混合。我只是想把两张照片都打印出来,一张挨着另一张。谢谢,这正是我想要的。好的。就我而言,我发现这个答案更有用:@serw是的,但是在那里图像应该具有相同的宽度(vconcat)或高度(hconcat)
#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    // Load images
    Mat3b img1 = imread("path_to_image_1");
    Mat3b img2 = imread("path_to_image_2");

    // Get dimension of final image
    int rows = max(img1.rows, img2.rows);
    int cols = img1.cols + img2.cols;

    // Create a black image
    Mat3b res(rows, cols, Vec3b(0,0,0));

    // Copy images in correct position
    img1.copyTo(res(Rect(0, 0, img1.cols, img1.rows)));
    img2.copyTo(res(Rect(img1.cols, 0, img2.cols, img2.rows)));

    // Show result
    imshow("Img 1", img1);
    imshow("Img 2", img2);
    imshow("Result", res);
    waitKey();

    return 0;
}
    private Mat VerticalConcat(Mat image1, Mat image2)
    {
        var smallImage = image1.Cols < image2.Cols ? image1 : image2;
        var bigImage = image1.Cols > image2.Cols ? image1 : image2;
        Mat combine = Mat.Zeros(new OpenCvSharp.CPlusPlus.Size(Math.Abs(image2.Cols - image1.Cols), smallImage.Height), image2.Type());
        Cv2.HConcat(smallImage, combine, combine);
        Cv2.VConcat(bigImage, combine, combine);
        return combine;
    }