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

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

image2

Код, который я использую thiscode ->

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.

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


person ankit    schedule 21.04.2012    source источник


Ответы (4)


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

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

#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);
}
person erikreed    schedule 21.04.2012
comment
Я не хочу использовать класс сшивки_деталей или сшивателя. Я хочу закодировать его, так как это часть проекта, который я делаю. Кстати, спасибо :) - person ankit; 21.04.2012
comment
Я получаю сообщение об ошибке - Не удается открыть включаемый файл: 'opencv2/stitching/stitcher.hpp': Нет такого файла или каталога. Как удалить эту ошибку. В моей папке opencv нет файла с именем Stitcher.hpp. Я использую opencv2.3.1. - person ankit; 26.04.2012
comment
В вашем каталоге opencv/modules есть подкаталог сшивания? Если нет, вам придется проверить репозиторий svn, чтобы получить более позднюю версию (заголовок присутствует в svn trunk). - person erikreed; 27.04.2012
comment
Когда я использовал приведенный выше код, я получаю следующее: ошибка C2248: 'cv::Stitcher::Stitcher': невозможно получить доступ к частному члену, объявленному в классе 'cv::Stitcher'. Как получить доступ к функции стежка? - person Vinshi; 20.12.2012
comment
Stitcher::Stitch является общедоступным, поэтому вы должны иметь в виду что-то другое. Возможно, вы вызываете частный конструктор. - person erikreed; 23.12.2012
comment
Сшиватель OpenCV предполагает чистое вращение (камера вращается вокруг своей оси), и если вы введете перевод в свои изображения, результаты в большинстве случаев будут плохими. Однако вы можете использовать сшивание в OpenCV в качестве руководства для того, что вам нужно делать - регистрация ваших изображений (обнаружение функций, сопоставление функций, извлечение параметров камеры для каждого изображения и т. д.) и после этого компоновка (деформация, удаление шва и смешивание). Проверьте конвейер сшивания в документации, в которой есть хороший обзор всего этого, а также прочитайте Автоматическое сшивание панорамных изображений с использованием инвариантных функций (см. ссылку) - person rbaleksandar; 05.05.2014
comment
@rbaleksandar Это неверно (говорят, что OpenCV еще этого не делает, или предположение о чистом вращении). Посмотрите на источник. github.com/Itseez/opencv/blob/master/samples/ cpp/ - person erikreed; 06.05.2014
comment
Я просмотрел это, источник класса сшивки, а также документацию, и я утверждаю, что мой комментарий верен. Мало того, что вы можете увидеть сшиватель изображений модели вращения в функции printUsage в этом образце, на который вы дали мне ссылку (пожалуйста, НЕ путайте термины модель вращения (то есть модель движения, использующая вращение) с поверхностью деформации, поскольку это два разных вещи), но также если вы попытаетесь протестировать его (как это сделал я), вы увидите следующее: применение чистого вращения на камере дает отличные результаты, но применение перемещения на камере дает очень плохие. - person rbaleksandar; 13.05.2014

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

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

person 0x90    schedule 21.04.2012
comment
То, что вы предлагаете, является следующим шагом. Во-первых, я должен убедиться, что на конечном изображении не отображаются две горные вершины вместо одной. Спасибо за ваши усилия. - person ankit; 21.04.2012
comment
Смешивание изображений вы можете использовать, если это одна и та же часть горы, если нет, используйте маркер создания панорамы. - person 0x90; 21.04.2012

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

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

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

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

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

Это маска для alphablend:

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

Это альфа-смешанный:

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


Мы можем легко найти призрака в смешанном изображении. Это потому, что warpPerspective и perspectiveTransform не могут найти уравнение проекции камеры real. В основном потому, что панель изображений представляет собой panel, но 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 );
}

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

  1. Сшивание OpenCV: https://docs.opencv.org/3.3.0/d8/d19/tutorial_stitcher.html

  2. Альфа-смешивание в OpenCV С++: Объединение 2 изображений с прозрачной маской в opencv

  3. Альфа-смешивание в OpenCV Python: Смешение градиентной маски в opencv python

person Kinght 金    schedule 16.01.2018

Вы можете легко смешать два изображения, используя функцию 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

person Md. Hanif Ali Sohag    schedule 25.06.2016