Comment fusionner deux images dans opencv?

j'ai calculé l'homographie ,sorti perspective de transformation .Je suis capable d'afficher deux images dans une fenêtre mais incapable de les fusionner.Voici mon exemple images -> image1

image2

le code que j'utilise ce code ->

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_Projectsoutputimage.jpg",imgResult);
cvWaitKey(0);

je pense que le problème est dans les coordonnées que je donne roiImgResult_right.

et L'Image de sortie est -> Output images Comme vous pouvez le voir les images ne sont pas correctement fusionner et il y a de zone noire sur le côté droit.comment supprimer cela aussi?

18
demandé sur ankit 2012-04-21 10:23:56

4 réponses

OpenCV a déjà mis en place la couture d'image. Si vous compilez avec "- d BUILD_EXAMPLES", vous pouvez utiliser le binaire stitching_detailed. L'utilisation est simple: ./stitching_detailed img1 img2 ...

Or, vous pouvez simplement utiliser la classe stitcher (exemple de ici):

#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);
}
17
répondu erikreed 2012-04-21 06:53:34
  • Image De Fusion: Vous pouvez utiliser une pyramide laplacienne fusion. voir un exemple de code ici en utilisant opencv. Vous pouvez utiliser n'importe quel masque que vous aimez (qui est un masque binaire).

  • créer un Panorama si vous voulez faire un panorama, vous pouvez utiliser la couture Min-Cut. Je j'ai trouvé ce code qui fait le panorama traitement.

7
répondu 0x90 2017-07-14 12:04:30

vous pouvez facilement mélanger deux images en utilisant le addWeighted() fonction. Mais l'exigence est que vous devez faire les images de la même taille.

Si les images ne sont pas de même taille redimensionner les deux images. Puis d'appeler la fonction suivante.

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

déclarez les deux Mat fichiers

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

déclarez aussi alpha et beta puis sauvegardez le résultat à Mat dst.

Vous pouvez également obtenir les détails ici mélange d'Images en utilisant Opencv

1
répondu Md. Hanif Ali Sohag 2018-01-15 05:39:57

si vous faites plus attention, comme ne pas recadrer et empiler, mais utiliser alphaBlend, alors vous trouverez quelque chose d'étrange.

C'est la correspondance de l'image:

enter image description here

C'est le enveloppés img2:

enter image description here

C'est le masque à faire alphablend:

enter image description here

C'est la alphaBlended:

enter image description here


nous pouvons facilement trouver le fantôme dans l'image mélangée. C'est parce que le warpPerspective et perspectiveTransform Je ne trouve pas vraiment le real équation de projection de la caméra. Surtout parce que le panneau d'image est un panel, mais cylindrical surface ou spherical surface ou plus complexe. Le travail que nous avons accompli n'est donc pas suffisant.

Alors que la bonne nouvelle est OpenCV offre High level stiching API, Nous pouvons faire la couture facilement par OpenCV Stitching API. Voici le résultat.

enter image description here

Code:

//! 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 );
}

Quelques liens utiles:

  1. Couture OpenCV:https://docs.opencv.org/3.3.0/d8/d19/tutorial_stitcher.html

  2. Alpha Blending in OpenCV C++ : Combinaison de 2 images avec masque transparent en opencv

  3. mélange Alpha dans OpenCV Python: masque en Dégradé mélangeant dans opencv python

0
répondu Silencer 2018-01-16 09:37:49