• opencv2.3.1学习笔记(1)


    今天开始学习opencv,将前一段时间maltab仿真的结果在c++下实现,这样一来可以学习c++,或者学习opencv这种开源工具的代码习惯。

    我主要做的是图像的配准,我计划最终实现基于视频的全景图像拼接,慢慢来,现在只做图像配准。

    今天一个代码很有意义,现在记录下来。

      1 #include <opencv2/opencv.hpp> 
      2 #include <stdio.h>
      3 
      4 using namespace std; 
      5 using namespace cv; 
      6 
      7 
      8 
      9 int main(int argc, char* argv[]) 
     10 { 
     11     Mat img1=imread("bird1.jpg");
     12     Mat img2=imread("bird2.jpg");
     13     cvtColor(img1,img1,CV_RGB2GRAY);
     14     cvtColor(img2,img2,CV_RGB2GRAY);
     15 
     16     //-- Step 1: Detect the keypoints using SURF Detector
     17     int minHessian=400;
     18     SurfFeatureDetector detector( minHessian );
     19     std::vector<KeyPoint> keypoints_1, keypoints_2;
     20     detector.detect( img1, keypoints_1 );
     21     detector.detect( img2, keypoints_2 );
     22 
     23     //-- Step 2: Calculate descriptors (feature vectors)
     24     SurfDescriptorExtractor extractor;
     25     Mat descriptors_1, descriptors_2;
     26     extractor.compute( img1, keypoints_1, descriptors_1 );
     27     extractor.compute( img2, keypoints_2, descriptors_2 );
     28 
     29     //-- Step 3: Matching descriptor vectors using FLANN matcher
     30     FlannBasedMatcher matcher;
     31 //    BruteForceMatcher<L2<float>> matcher;
     32     std::vector< DMatch > matches;
     33     matcher.match( descriptors_1, descriptors_2, matches );
     34 
     35     double max_dist = 0; 
     36     double min_dist = 100;
     37     //-- Quick calculation of max and min distances between keypoints
     38     for( int i = 0; i < descriptors_1.rows; i++ )
     39     { 
     40         double dist = matches[i].distance;
     41         if( dist < min_dist ) min_dist = dist;
     42         if( dist > max_dist ) max_dist = dist;
     43     }
     44 
     45     printf("-- Max dist : %f \n", max_dist );
     46     printf("-- Min dist : %f \n", min_dist );
     47 
     48     //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )
     49     //-- PS.- radiusMatch can also be used here.
     50     std::vector< DMatch > good_matches;
     51 
     52     for( int i = 0; i < descriptors_1.rows; i++ )
     53     {
     54         if( matches[i].distance < 2*min_dist )
     55         { 
     56             good_matches.push_back( matches[i]);
     57         }
     58     }
     59 
     60     //-- Draw only "good" matches
     61     Mat img_matches;
     62     drawMatches( img1, keypoints_1, img2, keypoints_2,
     63                 good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
     64                 vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
     65 
     66 
     67     //-- Localize the object
     68     std::vector<Point2f> obj;
     69     std::vector<Point2f> scene;
     70 
     71     for( int i = 0; i < good_matches.size(); i++ )
     72     {
     73         //-- Get the keypoints from the good matches
     74         obj.push_back( keypoints_1[ good_matches[i].queryIdx ].pt );
     75         scene.push_back( keypoints_2[ good_matches[i].trainIdx ].pt );
     76     }
     77 
     78     Mat H = findHomography( obj, scene, CV_RANSAC );
     79 
     80     //-- Get the corners from the image_1 ( the object to be "detected" )
     81     std::vector<Point2f> obj_corners(4);
     82     obj_corners[0] = cvPoint(0,0); 
     83     obj_corners[1] = cvPoint( img1.cols, 0 );
     84     obj_corners[2] = cvPoint( img1.cols, img1.rows ); 
     85     obj_corners[3] = cvPoint( 0, img1.rows );
     86     std::vector<Point2f> scene_corners(4);
     87     perspectiveTransform( obj_corners, scene_corners, H);
     88 
     89     //-- register the imahe using perspective transform
     90     //-- get the size of the registerd image
     91     Mat imageturn=Mat::zeros(max(scene_corners[1].x,scene_corners[2].x),
     92         max(scene_corners[2].y,scene_corners[3].y),img1.type());
     93     warpPerspective(img1,imageturn,H,cv::Size(imageturn.rows,imageturn.cols));
     94 
     95     //-- register the image using affine transform
     96     vector<Point2f> img1corners(3);
     97     img1corners[0]=obj[0];
     98     img1corners[1]=obj[1];
     99     img1corners[2]=obj[2];
    100     vector<Point2f> img2corners(3);
    101     img2corners[0]=scene[0];
    102     img2corners[1]=scene[1];
    103     img2corners[2]=scene[2];
    104     Mat affineMat=getAffineTransform(img1corners,img2corners);
    105     Mat imageAffine=Mat::zeros(max(scene_corners[1].x,scene_corners[2].x),
    106         max(scene_corners[2].y,scene_corners[3].y),img1.type());
    107     warpAffine(img1,imageAffine,affineMat,cv::Size(imageAffine.rows,imageAffine.cols));
    108 
    109     //-- Draw lines between the corners (the mapped object in the scene - image_2 )
    110     line( img_matches, scene_corners[0] + Point2f( img1.cols, 0), scene_corners[1] + Point2f( img1.cols, 0), Scalar( 0, 255, 0), 4 );
    111     line( img_matches, scene_corners[1] + Point2f( img1.cols, 0), scene_corners[2] + Point2f( img1.cols, 0), Scalar( 0, 255, 0), 4 );
    112     line( img_matches, scene_corners[2] + Point2f( img1.cols, 0), scene_corners[3] + Point2f( img1.cols, 0), Scalar( 0, 255, 0), 4 );
    113     line( img_matches, scene_corners[3] + Point2f( img1.cols, 0), scene_corners[0] + Point2f( img1.cols, 0), Scalar( 0, 255, 0), 4 );
    114 
    115     //-- Show detected matches
    116     imshow( "Good Matches & Object detection", img_matches );
    117     imshow("perspective image",imageturn);
    118     imshow("affine image",imageAffine);
    119     //-- Show detected matches
    120     //imshow( "Good Matches", img_matches );
    121 
    122     //for( int i = 0; i < good_matches.size(); i++ )
    123     //{ 
    124     //    printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); 
    125     //}
    126     waitKey();
    127     return 0;
    128 } 
  • 相关阅读:
    DELETE和DELETE FROM有什么区别
    [转]DBA,SYSDBA,SYSOPER三者的区别
    DML语言练习,数据增删改查,复制清空表
    Oracle数据库sys为什么只能以sysdba登录
    Oracle添加数据文件创建表空间,创建用户代码
    ORACLE建表练习
    全局唯一标识符(GUID)
    [转]Java总结篇系列:Java泛型
    Strategy模式
    Android 第三方应用广告拦截实现
  • 原文地址:https://www.cnblogs.com/lscheng/p/2719058.html
Copyright © 2020-2023  润新知