zoukankan      html  css  js  c++  java
  • find object

    #include "stdafx.h"
    #include "cv.h"
    #include "highgui.h"

    using namespace cv;

    int _tmain(int argc, _TCHAR* argv[])
    {
        //const cv::Mat object = cv::imread("lenaface.JPG", 0); //Load as grayscale
        
    //const cv::Mat image = cv::imread("lena.jpg", 0);
        const cv::Mat object = cv::imread("box.png"0); //Load as grayscale
        const cv::Mat image = cv::imread("box_in_scene.png"0);
        //1.detect keypoints of object and image using SIFT
        cv::SiftFeatureDetector *detector;
        detector = new SiftFeatureDetector(0.04/5/2.0,0.5);
        //SurfFeatureDetector detector;
        std::vector<cv::KeyPoint> objectKeypoints;
        std::vector<cv::KeyPoint> imageKeypoints;
        detector->detect(object, objectKeypoints);
        //show
        
    //cv::Mat output_object;
        
    //cv::drawKeypoints(object, objectKeypoints, output_object);
        ////cv::imwrite("output_object.jpg", output_object);
        //cv::namedWindow("object", CV_WINDOW_AUTOSIZE);
        
    //cv::imshow("object", output_object);
        
    //
        detector->detect(image,imageKeypoints);
        //show
        
    //cv::Mat output_image;
        
    //cv::drawKeypoints(image, imageKeypoints, output_image);
        ////cv::imwrite("output_image.jpg", output_image);
        //cv::namedWindow("image", CV_WINDOW_AUTOSIZE);
        
    //cv::imshow("image", output_image);

        
    //2.get Descriptors
        Mat objectDescriptor,imageDescriptor;
        cv::SiftDescriptorExtractor descriptorExtractor;
        //cv::SurfDescriptorExtractor descriptorExtractor;
        descriptorExtractor.compute(object,  objectKeypoints, objectDescriptor);
        descriptorExtractor.compute(image , imageKeypoints, imageDescriptor );

        //3.
        
    // Match descriptors of 2 images (find pairs of corresponding points)
        BruteForceMatcher<L2<float>> matcher;// Use FlannBasedMatcher matcher. It is better
        vector<DMatch> matches;
        matcher.match(objectDescriptor, imageDescriptor, matches);


        // Extract pairs of points
        vector<int> pairOfsrcKP(matches.size()), pairOfdstKP(matches.size());
        for( size_t i = 0; i < matches.size(); i++ ){
            pairOfsrcKP[i] = matches[i].queryIdx;
            pairOfdstKP[i] = matches[i].trainIdx;
        }

        vector<Point2f> sPoints; KeyPoint::convert(objectKeypoints, sPoints,pairOfsrcKP);
        vector<Point2f> dPoints; KeyPoint::convert(imageKeypoints, dPoints,pairOfdstKP);

        // Matched pairs of 2D points. Those pairs will be used to calculate homography
        Mat src2Dfeatures;
        Mat dst2Dfeatures;
        Mat(sPoints).copyTo(src2Dfeatures);
        Mat(dPoints).copyTo(dst2Dfeatures);

        // Calculate homography
        vector<uchar> outlierMask;
        
           double h[9];
        //CvMat H = cvMat(3, 3, CV_64F, h);
        Mat H;
        H = findHomography( src2Dfeatures, dst2Dfeatures, outlierMask, RANSAC, 3);
        Mat outimg;
        drawMatches(object, objectKeypoints,image, imageKeypoints, matches, outimg, Scalar::all(-1), Scalar::all(-1),
            reinterpret_cast<const vector<char>&> (outlierMask));
        //imshow("Matches: Src image (left) to dst (right)", outimg);

        
    //

        CvPoint src_corners[4] = {{0,0}, {object.cols,0}, {object.cols, object.rows}, {0object.rows}};
        CvPoint dst_corners[4];

        int k = 0;
        for(int i = 0; i < H.rows; i++)
        for(int j = 0; j < H.cols; j++)
            h[k++]= H.at<double>(i,j);

        forint i = 0; i < 4; i++ )
        {
            double x = src_corners[i].x, y = src_corners[i].y;
            double Z = 1./(h[6]*x + h[7]*y + h[8]);
            double X = (h[0]*x + h[1]*y + h[2])*Z;
            double Y = (h[3]*x + h[4]*y + h[5])*Z;
            dst_corners[i] = cvPoint(cvRound(X), cvRound(Y));
        }
        Mat lineBox(outimg);
        forint i = 0; i < 4; i++ )
        {
            CvPoint r1 = dst_corners[i%4];
            CvPoint r2 = dst_corners[(i+1)%4];
            line( lineBox, cvPoint(r1.x+object.cols, r1.y ), cvPoint(r2.x+object.cols , r2.y), Scalar(0,125,255), 3, CV_AA);
        }
        imshow("Matches: Src image (left) to dst (right)", lineBox);
        waitKey();
    }
  • 相关阅读:
    SpingMVC ModelAndView, Model,Control以及参数传递
    ModelAndView详解
    HibernateTemplate的一些常用方法总结
    选中的文本向左向右移动快捷键
    学习springMVC框架配置遇到的问题-数据写入不进数据库时的处理办法
    springMVC框架中,在hib-config.xml配置sqlserver2008数据库连接的代码
    amaze UI 笔记
    amaze UI 笔记
    jQuery 属性(十二)
    jQuery 核心函数 (十一)
  • 原文地址:https://www.cnblogs.com/smartvessel/p/2222079.html
Copyright © 2011-2022 走看看