1

플라스틱 부품의 직선 표면의 단일 이미지에서 많은 이미지 (25)를 스티치합니다. 이미지는 다음과 같다 : 나는 Stitcher은 클래스 형식을 OpenCV를 사용하는 것을 시도하고있다opencv에서 Stitcher 클래스를 사용하여 많은 이미지를 스티칭 할 수 없습니다. C++

enter image description hereenter image description hereenter image description hereenter image description here

. 내 코드는 여기에 있습니다 :

#include <iostream> 
#include <fstream> 
#include "opencv2/highgui/highgui.hpp" 
#include <opencv2/stitching.hpp> 

using namespace std; 
using namespace cv; 

bool try_use_gpu = false; 
vector<Mat> imgs; 
string result_name = "result.jpg"; 
Mat img1, img2,img3,img4,img5,img6,img7, pano; 

void printUsage(); 
//int parseCmdArgs(int argc, char** argv); 

int main(int argc, char* argv[]) 
{ 
    // Load images from HD. 
    img1 = imread("1.bmp"); 
    img2 = imread("2.bmp"); 
    img3 = imread("3.bmp"); 
    img4 = imread("4.bmp"); 

    // Put images into vector of images "imgs". 
    imgs.push_back(img1); 
    imgs.push_back(img2); 
    imgs.push_back(img3); 
    imgs.push_back(img4); 

    // Create stitcher instance and use stitch method with imgs. 
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu); 
    stitcher.setPanoConfidenceThresh(0.8); 
    Stitcher::Status status = stitcher.stitch(imgs, pano); 

    if (status != Stitcher::OK) 
    { 
     cout << "Can't stitch images, error code = " << status << endl; 
     return -1; 
    } 

    imwrite(result_name, pano); 

    return 0; 
} 

내가 항상 말하는 오류 : 시스템이 더 많은 이미지를 필요로한다는되도록 "= 1 이미지, 오류 코드 스티치 할 수 없습니다." 디버깅 할 때 이미지가 제대로로드 된 다음 벡터 img가 올바르게 생성 된 것을 확인합니다. 그 이유는 무엇일까요? 내 계산은 또한 꽤 오래 지속됩니다 ...

+0

이미지의 크기를 알려주시겠습니까? –

+1

IMHO Stitcher는 당신의 의견을 과소 평가합니다. 이미지가 순서대로 있다고 가정하고, 그들은 왜곡되지 않고 카메라가 한 축을 따라 일정한 방향으로 움직이고 있다면, 이것을 활용할 수 있습니다. 템플릿 매칭을 사용하여 인접한 이미지의 겹치는 부분을 찾고이를 사용하여 합성 이미지를 만들 수 있습니다. 가장 간단한 방법은 중첩되지 않은 부분을 연결하는 것입니다. 교대로 겹치는 부분에 일부 블렌딩을 수행하십시오. | 그러나 이상적인 접근 방식은 이것을 모두 수행 할 필요를 없애는 것입니다 - 라인 카메라 + 일부 엔코더. –

+1

@ skoda23 [이 결과] (http://i.imgur.com/2bSw2dj.png)를 생성하는 매우 간단한 [Python의 프로토 타입] (http://pastebin.com/dMfGfyJ1). 슬라이스가 분명히 합성 예제처럼 잘 정렬되지 않는 경우에 대비하여 수직 "흔들기 공간"을 추가 할 수 있습니다. 또한, 겹치는 부분의 블렌딩을'addWeighted'를 사용하여 절반 만 반올림하거나 가중치에 그라디언트를 사용하여 추가하십시오. –

답변

2

OpenCV의 스티 처 모듈은 이미지 정렬 기능을 사용하여 정확한 정렬을 만듭니다.

엄지 손가락 규칙으로는 두 이미지 사이에 약 20-30 %의 겹침이 있어야합니다. 카메라 필드 사이에 큰 겹침이 없으면 이미지 교차점 사이에 충분한 피처가 없을 것입니다. 당신이 준 이미지는 stitcher 모듈이 이미지 교차점에서 충분한 피쳐를 찾을 수 있도록 상당히 균일 한 배경을 가지고 있습니다. 이미지를 정렬하려면 이미지 교차점의 피쳐를 확대해야합니다.

+0

무엇을 피할 수없는 경우? 내 지역의 합성 이미지를 만드는 비평적인 접근 방식은 무엇 일 수 있습니까? 템플릿 일치를 사용해야합니까?나는 템플릿 매칭에 대한 많은 경험이 없다는 것에 주목하자. – jok23

+0

카메라 각도를 변경하여 이미지 간의 겹침을 늘리거나 흰색 부분의 배경을 변경하는 것이 좋습니다. 템플릿 매칭 기능의 수를 늘릴 수 없기 때문에 좋은 결과를 얻지 못할 것입니다. –