Soru Opencv'de iki görüntü nasıl birleştirilir?


Homografiyi hesapladım, perspektif dönüşümü aldım. İki görüntüyü bir pencerede görebiliyorum ama birleştiremiyorum.Örneğin benim resimlerim. image1

image2

Bu kodu kullanıyorum kod ->

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

Problemin roiImgResult_right verdiğim koordinatlarda olduğunu düşünüyorum.

Ve çıktı görüntüsü -> Output images Gördüğünüz gibi, görüntüler düzgün bir şekilde birleşmiyor ve sağ tarafta siyah alan var. Bunu da nasıl kaldıracaksınız?


18
2018-04-21 06:23


Menşei




Cevaplar:


OpenCV zaten uygulanan görüntü dikişi var. "-D BUILD_EXAMPLES" ile derlerseniz, ikili kullanabilirsiniz stitching_detailed. Kullanımı basit: ./stitching_detailed img1 img2 ...

Veya, yalnızca dikiş sınıfını kullanabilirsiniz ( İşte):

#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
2018-04-21 06:53



Stitching_detailed veya stitcher sınıfını kullanmak istemiyorum. Yaptığım projenin bir parçası olduğu için kod yazmak istiyorum. Teşekkür ederim :) - ankit
Bir hata alıyorum -Açıklama dosyası dahil: 'opencv2 / stitching / stitcher.hpp': Böyle bir dosya veya dizin yok. Bu hatayı nasıl kaldırabilirim. Opencv klasörümde stitcher.hpp dosyası yok. Opencv2.3.1 kullanıyorum. - ankit
Opencv / modules dizininizde bir dikiş alt dizini var mı? Değilse, daha sonraki bir sürümü almak için svn repo'yu kontrol etmeniz gerekir. svn trunk). - erikreed
Yukarıdaki kodu kullandığımda şunu elde ederim: hata C2248: 'cv :: Stitcher :: Stitcher': 'cv :: Stitcher' sınıfında bildirilen özel üyeye erişemiyor. Dikiş işlevine nasıl erişirim? - Vinshi
Stitcher :: Stitch halka açık olduğundan başka bir şeye atıfta bulunmalısınız. Belki de özel kurucuyu arıyorsun. - erikreed


  • Görüntü Harmanlama: Bir laplacian piramidi kullanabilirsin harmanlama. örnek kod görmek İşte opencv kullanarak. İstediğiniz maskeyi kullanabilirsiniz (ki bu ikili bir maske).

  • Panorama oluştur Bir panorama yapmak isterseniz, Min-Kesim Dikişini kullanabilirsiniz. ben panorama yapan bu kodu buldum işleme.


7
2018-04-21 08:21



Önerdiğiniz şey bir sonraki adımdır. İlk olarak, son resmin bir yerine iki dağ zirvesini göstermediğinden emin olmalıyım. Çabalarınız için teşekkürler. - ankit
Panorama oluşturmanın mermisini kullanmıyorsanız, dağın aynı parçasıysa kullanabileceğiniz görüntü karıştırma - 0x90


Kullanarak iki görüntüyü kolayca karıştırabilirsiniz. addWeighted() işlevi. Ama gereklilik, aynı boyuttaki görüntüleri yapmak zorunda olmanız.

Görüntüler aynı boyutta değilse, önce iki resmi yeniden boyutlandırın. Ardından aşağıdaki işlevi çağırınız.

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

İkisini ilan et Mat Dosyalar

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

Ayrıca beyan etmek alpha ve beta sonra sonucu kaydetmek Mat dst.

Ayrıntıları buradan da alabilirsiniz. Opencv kullanarak Görüntülerin Harmanlanması


1
2018-06-25 08:15





Daha dikkatli bir şekilde yaparsanız, kırpmama ve istifleme gibi, ancak alphaBlend'i kullanırsanız, garip bir şey bulacaksınız.

Bu eşleşen görüntü:

enter image description here

Bu sarılmış img2:

enter image description here

Bu alphablend yapmak için maske:

enter image description here

Bu alphaBlended'dir:

enter image description here


Hayaleti karışık görüntüde kolayca bulabiliriz. Çünkü warpPerspective ve perspectiveTransform gerçekten bulamıyorum real kamera yansıtma denklemi. Çoğunlukla görüntü paneli bir panel, ancak cylindrical surface veya spherical surface veya daha karmaşık. Yani yaptığımız iş yeterli değil.

İyi yeni iken OpenCV sağlar High level stiching API, Kolayca dikiş yapabiliriz OpenCV Stitching API. İşte sonuç.

enter image description here

Kod:

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

Bazı faydalı bağlantılar:

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

  2. OpenCV C ++ 'da Alfa Harmanlama: Opencv içinde şeffaf maskeli 2 görüntüyü birleştirmek

  3. OpenCV Python'da Alfa Harmanlaması: Opencv python'da karıştırma gradyan maskesi


0
2018-01-16 09:37