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->
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 -> 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?
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 .
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:
Ceci est le img2 enveloppé:
C'est le masque à faire alphandendre:
C'est l'alphant:
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.
//! 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:
OpenCV Couture: https://docs.opencv.org/3.3.0/d8/d19/TorTorial_Stitcher.html
Alpha mélange dans OpenCV C++: combinant 2 images avec masque transparent dans OpenCV
Alpha mélange dans OpenCV Python: masque de gradient mélange dans OpenCV Python
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