Наложение нескольких изображений на базовое изображение одинакового размера с помощью OpenCV C ++ - PullRequest
0 голосов
/ 14 января 2019

enter image description here enter image description here У меня есть набор из 193 изображений (Img0, Img1, Img2, ... Imgx) того же размера (40x40), которые необходимо наложить на первое изображение в этом (то есть Img0). Я пробовал разные решения, доступные здесь, но он работает только для наложения двух изображений. Я хочу, чтобы это было сделано с использованием 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 голосов
/ 14 января 2019

Проблема здесь:

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

Вы добавляете +1 к i, которое в конце будет 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();
}

Обновление:

Вы хотели бы иметь смешанное изображение, которое сохраняет черные пятна. Для этого вы можете использовать bitwise_and из opencv следующим образом:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...