我有一组大小相同(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;
}
}
我无法弄清楚我在做什么错。有人可以帮忙吗?非常感谢!
我的内存不足错误,断言失败等。
答案 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)
}