C++ 有没有一种方法可以在保留图像参考的同时从两个图像创建一个垫子

C++ 有没有一种方法可以在保留图像参考的同时从两个图像创建一个垫子,c++,opencv,C++,Opencv,我试图创建一个由另外两个Mat B和C组成的Mat a,这样更改B或C也会更改a的一部分 下面是一个包含一些代码的示例: // not important, i am only using it to change the Mat void someFunction(Mat & image) { for (int y = 0; y < image.rows; y++) { for (int x = 0; x < image.cols; x++)

我试图创建一个由另外两个Mat B和C组成的Mat a,这样更改B或C也会更改a的一部分

下面是一个包含一些代码的示例:

// not important, i am only using it to change the Mat
void someFunction(Mat & image)
{
    for (int y = 0; y < image.rows; y++)
    {
        for (int x = 0; x < image.cols; x++)
        {
            image.at<Vec3b>(Point(x, y)) = image.at<Vec3b>(Point(x, y)) * 2;
        }
    }
}

// I am taking image and image2, and putting them poth in outputImage
// It does the same thing then hconcat.
void merge(Mat & image, Mat& image2, Mat & outputImage)
{
    for (int y = 0; y < image.rows; y++)
    {
        for (int x = 0; x < image.cols; x++)
        {
            outputImage.at<Vec3b>(Point(x, y)) = image.at<Vec3b>(Point(x, y));
            outputImage.at<Vec3b>(Point(x + image.cols, y)) = image2.at<Vec3b>(Point(x, y));
        }
    }
}

void mainFunction()
{
    // Reading image from file path
    Mat myImage = imread("img/left.jpeg");
    Mat myImageCopy = myImage;

    // Creating the Mat to hold the two other
    Mat concat(myImage.rows, myImage.cols*2, CV_8UC3,Scalar(0,0,0));

    // This is where i am doing something wrong
    // I want concat to keep a reference or a pointer with myImage
    // So that if myImage is changed, concat is also changed
    merge(myImage, myImage.clone(), concat);

    // showing the 3 Mat
    imshow("myImage", myImage);
    imshow("myImageCopy", myImageCopy);
    imshow("concat", concat);

    // I change the value of some pixel at myImage
    someFunction(myImage);

    // showing the 3 mat again, myImage and myImageCopy are both changed but concat is the same 
    imshow("myImageAfter", myImage);
    imshow("myImageCopyAfter", myImageCopy);
    imshow("concatAfter", concat);
    waitKey(0);
}
//不重要,我只是用它来换垫子
无效功能(材料和图像)
{
对于(int y=0;y
我想创建一个Mat concat,它将存储Mat myImage的值及其引用副本,但hconcat不适用于此,我尝试创建自己的函数并调用它merge,但它似乎也不起作用

我希望在声明变量concat之后,只需更改myImage即可更改它


我找不到任何其他类似的帖子,如果我的问题不清楚,我很抱歉。

当您
合并时,您正在复制数据,因此更改两个输入图像不会更改
concat

您需要使两个输入图像指向
concat
数据:

...
merge(myImage, myImage.clone(), concat);

myImage = concat(cv::Rect(0, 0, myImage.cols, myImage.rows)); 
myImageCopy = concat(cv::Rect(myImage.cols, 0, myImage.cols, myImage.rows));

因此,更改
myImage
myImageCopy
也将更改
concat

,您不能这样做。你可以编写一个自定义结构来保存和更新结果图像。你也可以使用两个“copyTo”来简化你的“merge”函数,参见@Miki it worked谢谢,我想用错误的方法解决它