使用OpenCV C ++将多张图片叠加到相同尺寸的基本图片上

时间:2019-01-14 14:10:02

标签: c++ opencv image-processing

enter image description here enter image description here 我有一组大小相同(40x40)的193张图像(Img0,Img1,Img2,... Imgx),需要将此图像叠加到该图像的第一张图像(即Img0)上。我尝试了这里提供的其他解决方案,但仅适用于覆盖2张图像。我希望使用OpenCV&C ++完成此操作。我正在粘贴下面的代码。

#include <opencv2\highgui\highgui.hpp>
#include <iostream>
#include <stdio.h>using namespace cv;
using namespace std;
int main(int argc, char **argv)
{    

    string arrOfimages[193];
    stringstream str;
    int a = 1;

    for (int index = 0; index < 193 ; index++)
    {
        str << "C:/<path>/Img" << a << ".bmp";
        arrOfimages[index] = str.str();
        str.str("");
        a++;
    }

    Mat src1;
    Mat srcOut;
    src1 = imread(arrOfimages[0]);
    imshow("base", src1);

    for(int i = 0; i < 193; i++)
    {
        addWeighted(src1, 0.5, imread(arrOfimages[i+1]), 0.5, 0.0, srcOut, -1);
    }

    imshow("summation", srcOut);
    waitKey(0);
    return 0;

}

    }

我无法弄清楚我在做什么错。有人可以帮忙吗?非常感谢!

我的内存不足错误,断言失败等。

1 个答案:

答案 0 :(得分:2)

问题在这里:

for(int i = 0; i < 193; i++)
{
    addWeighted(src1, 0.5, imread(arrOfimages[i+1]), 0.5, 0.0, srcOut, -1);
}

您要为i加+1,最后将是193,并且超出范围。您应该只使用int i = 1来代替,像这样:

for(int i = 1; i < 193; i++)
{
    addWeighted(src1, 0.5, imread(arrOfimages[i]), 0.5, 0.0, srcOut, -1);
}

此外,您添加src1和一个新图像并将输出复制到srcOut ...在下一个迭代中,您将执行此操作,但是使用下一个图像,最后,您将仅在srcOut中添加添加第一个图像的结果和最后一张图片。如果要覆盖所有这些,则应该更像是:

for(int i = 1; i < 193; i++)
{
    addWeighted(src1, 0.5, imread(arrOfimages[i]), 0.5, 0.0, srcOut, -1);
    src1 = srcOut;
}

请注意,上一个循环:

stringstream str;
int a = 1;

for (int index = 0; index < 193 ; index++)
{
    str << "C:/<path>/KCF" << a << ".bmp";
    arrOfimages[index] = str.str();
    str.str("");
    a++;
}

可以这样写:

for (int index = 0; index < 193 ; index++)
{
    stringstream str;
    str << R"(C:\<path>\KCF)" << (a+1) << ".bmp";
    arrOfimages[index] = str.str();
}

更新:

您想要的是保留了黑点的混合图像。为此,您可以像这样从opencv使用bitwise_and

cv::Mat srcOut = cv::imread(arrOfImages[0], cv::IMREAD_GRAYSCALE);
for(int i = 1; i < 193; i++)
{
    cv::bitwise_and(srcOut, cv::imread(arrOfImages[1], cv::IMREAD_GRAYSCALE), srcOut)
}