Подтвердить что ты не робот

Как объединить два изображения в opencv?

Я вычислил гомографию, вытащил перспективное преобразование. Я могу два отображения двух изображений в одном окне, но не смог их слить. Вот мои примеры images- > image1

image2

Код, который я использую этот код →

cv::warpPerspective(image2,warpresult2,homography,cv::Size(2*image2.cols,image2.rows));


Mat imgResult(image1.rows,2*image1.cols,image1.type());

Mat roiImgResult_Left = imgResult(Rect(0,0,image1.cols,image1.rows)); 
Mat roiImgResult_Right = imgResult(Rect(image1.cols,0,image2.cols,image2.rows)); 

Mat roiImg1 = image1(Rect(0,0,image1.cols,image1.rows));
Mat roiImg2 = warpresult2(Rect(0,0,image2.cols,image2.rows));

roiImg1.copyTo(roiImgResult_Left); //Img1 will be on the left of imgResult
roiImg2.copyTo(roiImgResult_Right); //Img2 will be on the right of imgResult

imshow("Finalimg",imgResult);
imwrite("C:\\OpenCv_Projects\\outputimage.jpg",imgResult);
cvWaitKey(0);

Я думаю, проблема в координатах, которые я даю roiImgResult_right.

И выходное изображение → Output images Как вы можете видеть, изображения не сливаются должным образом, а с правой стороны есть черная область. Как удалить это тоже?

4b9b3361

Ответ 1

В OpenCV уже реализована сшивка изображений. Если вы скомпилируете с помощью "-D BUILD_EXAMPLES", вы можете использовать двоичный строчный_черк. Использование прост: ./stitching_detailed img1 img2 ...

Или вы можете просто использовать класс stitcher (пример из здесь):

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/stitching/stitcher.hpp"

using namespace std;
using namespace cv;

bool try_use_gpu = false;
string result_name = "result.jpg";

int main(int argc, char* argv[])
{
    vector<Mat> imgs;
    // add images...

    Mat pano;
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
    stitcher.stitch(imgs, pano);
    imwrite(result_name, pano);
}

Ответ 2

  • Смешение изображений: Вы можете использовать пирамиду лапласа blending. см. пример кода здесь, используя opencv. Вы можете использовать любую маску, которая вам нравится (которая представляет собой двоичную маску).

  • создать панораму. Если вы хотите сделать панораму, вы можете использовать Min-Cut Stitching. я нашел этот код, который делает панораму обработка.

Ответ 3

Вы можете легко смешивать два изображения с помощью функции addWeighted(). Но необходимо, чтобы вы делали изображения одного размера.

Если изображения не имеют одинакового размера, сначала измените размер двух изображений. Затем вызовите следующую функцию.

addWeighted(src1, alpha, src2, beta, 0.0, dst);

Объявить два Mat файла

src1 = imread("c://test//blend1.jpg");
src2 = imread("c://test//blend2.jpg");

Также объявите alpha и beta, затем сохраните результат в Mat dst.

Вы также можете получить информацию здесь Смешивание изображений с использованием Opencv

Ответ 4

Если вы делаете более тщательно, например, не обрезаете и не складываете, а используете alphaBlend, то вы найдете что-то странное.

Это совпадающее изображение:

введите описание изображения здесь

Это завернутый img2:

введите описание изображения здесь

Это маска, чтобы сделать alphablend:

введите описание изображения здесь

Это alphaBlended:

введите описание изображения здесь


Мы можем легко найти призрак в смешанном изображении. Это связано с тем, что warpPerspective и perspectiveTransform не могут действительно найти проекционное уравнение камеры real. Главным образом, поскольку панель изображения представляет собой panel, но a cylindrical surface или spherical surface или более сложная. Поэтому работа, которую мы сделали, недостаточна.

В то время как новое хорошее OpenCV предоставляет High level stiching API, мы можем легко сшивать на OpenCV Stitching API. Вот результат.

введите описание изображения здесь

код:

//! 2018.01.16 14:43:26 CST
//! 2018.01.16 17:32:15 CST
#include <iostream>
#include <fstream>
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/stitching.hpp"
using namespace std;
using namespace cv;

Stitcher::Status stitchImages(vector<Mat>&imgs,string fname, Stitcher::Mode mode = Stitcher::PANORAMA, bool try_gpu=false) {
    Ptr<Stitcher> stitcher = Stitcher::create(mode, try_gpu);
    Mat pano;
    Stitcher::Status status = stitcher->stitch(imgs, pano);
    if (status != Stitcher::OK){
        cout << "Can't stitch images, error code = " << int(status) << endl;
        return -1;
    }
    imwrite(fname, pano);
    return status;
}

int main(int argc, char* argv[])
{

    vector<string>fnames = {
        "img1.jpg", "img2.jpg"
    };

    vector<Mat> imgs;
    for(auto fname: fnames) {
        imgs.emplace_back(imread(fname));
    }
    stitchImages(imgs, "scans.png",Stitcher::SCANS );
    stitchImages(imgs, "pano.png",Stitcher::PANORAMA );
}

Некоторые полезные ссылки: