Как объединить два изображения в opencv?
Я вычислил гомографию, вытащил перспективное преобразование. Я могу два отображения двух изображений в одном окне, но не смог их слить. Вот мои примеры images- > ![image1]()
![image2]()
Код, который я использую этот код →
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.
И выходное изображение →
Как вы можете видеть, изображения не сливаются должным образом, а с правой стороны есть черная область. Как удалить это тоже?
Ответы
Ответ 1
В OpenCV уже реализована сшивка изображений. Если вы скомпилируете с помощью "-D BUILD_EXAMPLES", вы можете использовать двоичный строчный_черк. Использование прост: ./stitching_detailed img1 img2 ...
Или вы можете просто использовать класс stitcher (пример из здесь):
#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);
}
Ответ 2
-
Смешение изображений: Вы можете использовать пирамиду лапласа blending. см. пример кода здесь, используя opencv. Вы можете использовать любую маску, которая вам нравится (которая представляет собой двоичную маску).
-
создать панораму. Если вы хотите сделать панораму, вы можете использовать Min-Cut Stitching. я
нашел этот код, который делает панораму обработка.
Ответ 3
Вы можете легко смешивать два изображения с помощью функции 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
Ответ 4
Если вы делаете более тщательно, например, не обрезаете и не складываете, а используете alphaBlend, то вы найдете что-то странное.
Это совпадающее изображение:
![введите описание изображения здесь]()
Это завернутый img2:
![введите описание изображения здесь]()
Это маска, чтобы сделать alphablend:
![введите описание изображения здесь]()
Это alphaBlended:
![введите описание изображения здесь]()
Мы можем легко найти призрак в смешанном изображении. Это связано с тем, что warpPerspective
и perspectiveTransform
не могут действительно найти проекционное уравнение камеры real
. Главным образом, поскольку панель изображения представляет собой panel
, но a 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 );
}
Некоторые полезные ссылки: