web-dev-qa-db-fra.com

Comment fusionner deux images à OpenCV?

J'ai calculé l'homographie, appuyé la transformée en perspective. Je suis capable deux afficher deux images dans une fenêtre, mais incapable de les fusionner. Sont mes exemples d'images-> image1

image2

Le code que j'utilise cecode ->

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);

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 se fusionnent pas correctement et il y a une zone noire sur le côté droit.Comment supprimer cela aussi?

20
ankit
  • Mélange d'images: Vous pouvez utiliser une pyramide laplacienne mélange . Voir un exemple de code ICI Utilisation de OpenCV. Vous pouvez utiliser le masque que vous aimez (qui est un masque binaire).

  • Créez Panorama Si vous souhaitez créer un panorama, vous pouvez utiliser des coutures mineures. J'ai trouvé ce code qui fait le panorama traitement .

7
0x90

Si vous faites plus avec précaution, par exemple ne pas recadrer et empiler, mais utilisez AlphaBend, alors vous trouverez quelque chose d'étrange.

Ceci est l'image correspondante:

enter image description here

Ceci est le img2 enveloppé:

enter image description here

C'est le masque à faire alphandendre:

enter image description here

C'est l'alphant:

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 ne peut pas vraiment trouver l'équation de projection real. Principalement parce que le panneau d'image est un panel, mais un cylindrical surface ou spherical surface ou plus complexe. Donc, le travail que nous avons fait n'est pas suffisant.

Tandis que le bon nouveau est OpenCV fournit High level stiching API, Nous pouvons faire des coutures 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. OpenCV Couture: https://docs.opencv.org/3.3.0/d8/d19/TorTorial_Stitcher.html

  2. Alpha mélange dans OpenCV C++: combinant 2 images avec masque transparent dans OpenCV

  3. Alpha mélange dans OpenCV Python: masque de gradient mélange dans OpenCV Python

1
Kinght 金

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

Si les images n'ont pas de même taille, redimensionnez d'abord les deux images. Appelez ensuite la fonction suivante.

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

Déclarez les deux fichiers Mat

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

Déclarez également alpha et beta puis enregistrez le résultat à Mat dst.

Vous pouvez également obtenir les détails ici mélange d'images à l'aide de OPENCV

1