我正在尝试从不同的图像构建全景 View 。
最初,我尝试将两幅图像缝合在一起,作为全景构造的一部分。
我要拼接的两个输入图像是:
c++ - 全景影像制作-LMLPHP
c++ - 全景影像制作-LMLPHP

我使用ORB特征描述符在图像中找到特征,然后找出这两个图像之间的同形矩阵。
我的代码是:

int main(int argc, char **argv){

Mat img1 = imread(argv[1],1);
Mat img2 = imread(argv[2],1);
//-- Step 1: Detect the keypoints using orb Detector
std::vector<KeyPoint> kp2,kp1;

// Default parameters of ORB
int nfeatures=500;
float scaleFactor=1.2f;
int nlevels=8;
int edgeThreshold=15; // Changed default (31);
int firstLevel=0;
int WTA_K=2;
int scoreType=ORB::HARRIS_SCORE;
int patchSize=31;
int fastThreshold=20;

Ptr<ORB> detector = ORB::create(
        nfeatures,
        scaleFactor,
        nlevels,
        edgeThreshold,
        firstLevel,
        WTA_K,
        scoreType,
        patchSize,
        fastThreshold );
Mat descriptors_img1, descriptors_img2;


//-- Step 2: Calculate descriptors (feature vectors)
detector->detect(img1, kp1,descriptors_img1);
detector->detect(img2, kp2,descriptors_img2);


Ptr<DescriptorExtractor> extractor = ORB::create();
extractor->compute(img1, kp1, descriptors_img1 );
extractor->compute(img2, kp2, descriptors_img2 );
//-- Step 3: Matching descriptor vectors using FLANN matcher
if ( descriptors_img1.empty() )
    cvError(0,"MatchFinder","1st descriptor empty",__FILE__,__LINE__);
if ( descriptors_img2.empty() )
    cvError(0,"MatchFinder","2nd descriptor empty",__FILE__,__LINE__);
descriptors_img1.convertTo(descriptors_img1, CV_32F);
descriptors_img2.convertTo(descriptors_img2, CV_32F);
FlannBasedMatcher matcher;
std::vector<DMatch> matches;
matcher.match(descriptors_img1,descriptors_img2,matches);
double max_dist = 0; double min_dist = 100;

//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors_img1.rows; i++ )
{
    double dist = matches[i].distance;
    if( dist < min_dist )
        min_dist = dist;
    if( dist > max_dist )
        max_dist = dist;
}

printf("-- Max dist : %f \n", max_dist );
printf("-- Min dist : %f \n", min_dist );

//-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
std::vector< DMatch > good_matches;

for( int i = 0; i < descriptors_img1.rows; i++ )
{
    if( matches[i].distance < 3*min_dist )
    {
        good_matches.push_back( matches[i]);
    }
}
Mat img_matches;
drawMatches(img1,kp1,img2,kp2,good_matches,img_matches,Scalar::all(-1),
        Scalar::all(-1),vector<char>(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
std::vector<Point2f> obj;
std::vector<Point2f> scene;
for( int i = 0; i < good_matches.size(); i++ )
{
    //-- Get the keypoints from the good matches
    obj.push_back( kp1[ good_matches[i].queryIdx ].pt );
    scene.push_back( kp2[ good_matches[i].trainIdx ].pt );
}

Mat H = findHomography( obj, scene, CV_RANSAC );

在病房之后,有人告诉我包括以下代码
cv::Mat result;

warpPerspective( img1, result, H, cv::Size( img1.cols+img2.cols, img1.rows) );
cv::Mat half(result, cv::Rect(0, 0, img2.cols, img2.rows) );
img2.copyTo(half);
imshow("result",result);

我得到的结果是
c&#43;&#43; - 全景影像制作-LMLPHP

我也尝试使用内置的opencv缝合功能。我得到了结果
c&#43;&#43; - 全景影像制作-LMLPHP

我正在尝试实现绣功能,所以我不想使用内置的opencv绣功能。
谁能告诉我我哪里出了错并更正我的代码。在此先感谢

最佳答案

图像拼接包括以下步骤:

  • 特征查找
  • 查找相机参数
  • 变形
  • 曝光补偿
  • Seam查找
  • 混合

  • 您必须执行所有这些步骤才能获得理想的结果。
    在您的代码中,您仅完成了第一部分,即功能查找。

    您可以在Learn OpenCV中找到有关图像拼接如何工作的详细说明。

    我也有Github上的代码

    希望这可以帮助。

    关于c++ - 全景影像制作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45114967/

    10-11 23:19