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 ->
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 -> 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?
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);
}
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.
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
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:
C'est le enveloppés img2:
C'est le masque à faire alphablend:
C'est la alphaBlended:
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.
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:
Couture OpenCV:https://docs.opencv.org/3.3.0/d8/d19/tutorial_stitcher.html
Alpha Blending in OpenCV C++ : Combinaison de 2 images avec masque transparent en opencv
mélange Alpha dans OpenCV Python: masque en Dégradé mélangeant dans opencv python