예제 #1
0
int main(int argc, char** argv){
    float maximum_x, maximum_y;
    float minimum_y, minimum_x;

    if(argc != 3){
        cout << "error input the file names" << endl;
        return 0;
    }

    const char *sz_reference_file_path_part1 ="/Users/yangyang/Github/drone/Server/upload/files/";
    char *sz_reference_file_path = NULL;
    if(NULL == sz_reference_file_path){
        sz_reference_file_path = (char*) malloc(1 + strlen(sz_reference_file_path_part1) + strlen(argv[1]));
    }
    strcpy(sz_reference_file_path, sz_reference_file_path_part1);
    strcat(sz_reference_file_path, argv[1]);

    //Mat reference_object = imread("reference.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    //Mat reference_object = imread("/home/webmaster/drone/Server/upload/files/reference.jpg",1); 
    Mat reference_object = imread(sz_reference_file_path, 1); 

    if(sz_reference_file_path != NULL){
        free(sz_reference_file_path);
        sz_reference_file_path = NULL;
    }

    //VideoCapture cap(0); // open the video camera no. 0
    //if (!cap.isOpened())  // if not success, exit program
    //{
        //cout << "Cannot open the video cam" << endl;
        //return -1;
    //}
    Mat image, image_orig;
    //cap.read(image);
    
    const char *sz_image_file_path_part1 = "/Users/yangyang/Github/drone/Server/upload/files/";
    char *sz_image_file_path = NULL;
    if(NULL == sz_image_file_path){
        sz_image_file_path = (char*) malloc(1 + strlen(sz_image_file_path_part1) + strlen(argv[1]));
    }
    strcpy(sz_image_file_path, sz_image_file_path_part1);
    strcat(sz_image_file_path, argv[2]);

    image_orig = imread(sz_image_file_path, 1);

    image = image_orig;
    //cvtColor(image_orig, image, CV_RGB2GRAY);

    Mat des1, des2;
    SURFDetector surf; 
    std::vector<KeyPoint> keypoints_object, keypoints_scene;
    std::vector<DMatch> matches;

    surf(reference_object, Mat(), keypoints_object, des1);
    surf(image, Mat(), keypoints_scene, des2);
    
    SURFMatcher<BFMatcher> matcher;
    matcher.match(des1, des2, matches);

    double max_dist = 0; double min_dist = 100;

  //-- Quick calculation of max and min distances between keypoints
    for( int i = 0; i < des1.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 );

    std::vector< DMatch > good_matches;

    for( int i = 0; i < des1.rows; i++ )
    { if( matches[i].distance < 3*min_dist )
        { good_matches.push_back( matches[i]); }
    }

    Mat img_matches;
    //drawMatches(reference_object, keypoints_object, image, keypoints_scene,
               //good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
               //vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

    //-- Localize the object
    std::vector<Point2f> obj;
    std::vector<Point2f> scene;

    for( int i = 0; i < (int)good_matches.size(); i++ )
    {
    //-- Get the keypoints from the good matches
        obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
        scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
    }

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

    //-- Get the corners from the image_1 ( the object to be "detected" )
    std::vector<Point2f> obj_corners(4);
    obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( reference_object.cols, 0 );
    obj_corners[2] = cvPoint( reference_object.cols, reference_object.rows ); obj_corners[3] = cvPoint( 0, reference_object.rows );
    std::vector<Point2f> scene_corners(4);

    perspectiveTransform( obj_corners, scene_corners, H);

    //-- Draw lines between the corners (the mapped object in the scene - image_2 )
    //line( img_matches, scene_corners[0] + Point2f( reference_object.cols, 0), scene_corners[1] + Point2f( reference_object.cols, 0), Scalar(0, 255, 0), 4 );
    //line( img_matches, scene_corners[1] + Point2f( reference_object.cols, 0), scene_corners[2] + Point2f( reference_object.cols, 0), Scalar( 0, 255, 0), 4 );
    //line( img_matches, scene_corners[2] + Point2f( reference_object.cols, 0), scene_corners[3] + Point2f( reference_object.cols, 0), Scalar( 0, 255, 0), 4 );
    //line( img_matches, scene_corners[3] + Point2f( reference_object.cols, 0), scene_corners[0] + Point2f( reference_object.cols, 0), Scalar( 0, 255, 0), 4 );

    //-- Show detected matches
    
    //-- Drow lines on original corners
    line( image, scene_corners[0] , scene_corners[1] , Scalar(255, 0, 0), 4 );//red
    line( image, scene_corners[1] , scene_corners[2] , Scalar( 0, 0, 255), 4 );//blue
    line( image, scene_corners[2] , scene_corners[3] , Scalar( 0, 255, 0), 4 );//green
    line( image, scene_corners[3] , scene_corners[0] , Scalar( 0, 0, 0), 4 );//black
    //cout<<"scene_corners[0] = " << scene_corners[0] << endl;
    //cout<<"scene_corners[1] = " << scene_corners[1] << endl;
    //cout<<"scene_corners[2] = " << scene_corners[2] << endl;
    //cout<<"scene_corners[3] = " << scene_corners[3] << endl;
    

    //imshow( "Good Matches & Object detection", img_matches );
    //imshow("object in orginal image", image_orig);

    /**
     * for server to receive
     */
    //cout<< scene_corners[0].x << endl;//bottom right
    //cout<< scene_corners[0].y << endl;
    //cout<< scene_corners[1].x << endl;//top right
    //cout<< scene_corners[1].y << endl;
    //cout<< scene_corners[2].x << endl;//top left
    //cout<< scene_corners[2].y << endl;
    //cout<< scene_corners[3].x << endl;//bottom left
    //cout<< scene_corners[3].y << endl;

    float x[4] = {scene_corners[0].x, scene_corners[1].x, scene_corners[2].x, scene_corners[3].x};
    float y[4] = {scene_corners[0].y, scene_corners[1].y, scene_corners[2].y, scene_corners[3].y};
    maximum_x = find_max(x);
    minimum_x = find_mim(x);
    minimum_y = find_mim(y);
    maximum_y = find_max(y);

    //cout << "maximum x is:"<<maximum_x << endl;
    //cout << "maximum y is:"<< maximum_y << endl;

    //cout << "minimum x is:" <<minimum_x << endl;
    //cout << "minimum y is:"<<minimum_y << endl;

    Rect2d roi;
    roi.x = minimum_x, roi.y = minimum_y, roi.width = (maximum_x - minimum_x), roi.height = (maximum_y - minimum_y);
    Mat img1=image_orig(roi);
    //imshow("roi", img1);



    //Ptr<Tracker> tracker = Tracker::create("KCF");
    //tracker -> init(frame,roi);
    //printf("start the tracking process");

    waitKey(0);
    return 0;
}
예제 #2
0
파일: main.cpp 프로젝트: eriktim/timelapse
////////////////////////////////////////////////////
// This program demonstrates the usage of SURF_OCL.
// use cpu findHomography interface to calculate the transformation matrix
int main(int argc, char* argv[])
{
  std::vector<Mat> frames;

  // read input
  for (int i = 1; i < argc; i++) {
    Mat image = imread(argv[i], CV_LOAD_IMAGE_COLOR);
    if (!image.data) {
      std::cerr << "Ignoring image " << i << std::endl;
      continue;
    }
    if (i == 1) {
      Size orgSize = image.size();
      float orgRatio = orgSize.width / 1.0 / orgSize.height;
      if (!(ratio > 0)) {
        ratio = orgRatio;
      }
      outputSize = Size(lines * ratio, lines);
      if (orgRatio > ratio) {
        size.width = (1.0 + crop) * outputSize.width * orgRatio;
        size.height = (1.0 + crop) * outputSize.width;
      } else {
        size.width = (1.0 + crop) * outputSize.width;
        size.height = (1.0 + crop) * outputSize.width / orgRatio;
      }
      size.width += size.width % 2;
      size.height += size.height % 2;
      std::cout << "Input size: " << orgSize << std::endl;
      std::cout << "Process size: " << size << std::endl;
      std::cout << "Output size: " << outputSize << std::endl;
    }
    Mat frame;
    resize(image, frame, size);
    frames.push_back(image/*frame*/);
  }

    double surf_time = 0.;

    //declare input/output
    std::vector<KeyPoint> keypoints1, keypoints2;
    std::vector<DMatch> matches;

    UMat _descriptors1, _descriptors2;
    Mat descriptors1 = _descriptors1.getMat(ACCESS_RW),
        descriptors2 = _descriptors2.getMat(ACCESS_RW);

    //instantiate detectors/matchers
    SURFDetector surf;

    SURFMatcher<BFMatcher> matcher;
    UMat img1, img2;

  for (int k = 1; k < frames.size(); k++) {

    cvtColor(frames[k - 1], img1, CV_BGR2GRAY);
    cvtColor(frames[k], img2, CV_BGR2GRAY);

    for (int i = 0; i <= LOOP_NUM; i++)
    {
        surf(img1.getMat(ACCESS_READ), Mat(), keypoints1, descriptors1);
        surf(img2.getMat(ACCESS_READ), Mat(), keypoints2, descriptors2);
        matcher.match(descriptors1, descriptors2, matches);
    }
    std::cout << "FOUND " << keypoints1.size() << " keypoints on image " << (k - 1) << std::endl;
    std::cout << "FOUND " << keypoints2.size() << " keypoints on image " << k << std::endl;

    Mat H;
    std::vector<Point2f> corner;
    Mat img_matches = drawGoodMatches(img1.getMat(ACCESS_READ), img2.getMat(ACCESS_READ), keypoints1, keypoints2, matches, corner, H);

    Mat out;
    warpPerspective(frames[k - 1], out, H, frames[k].size(), INTER_CUBIC);

    std::ostringstream oss1, oss2;
    oss1 << "SURF_" << k << "_imag.jpg";
    oss2 << "SURF_" << k << "_warp.jpg";
    imwrite(oss1.str(), frames[k]); 
    imwrite(oss2.str(), out); 

  }

    return EXIT_SUCCESS;
}
예제 #3
0
////////////////////////////////////////////////////
// This program demonstrates the usage of SURF_OCL.
// use cpu findHomography interface to calculate the transformation matrix
int main(int argc, char* argv[])
{
    /*const char* keys =
        "{ h help     | false            | print help message  }"
        "{ l left     | box.png          | specify left image  }"
        "{ r right    | box_in_scene.png | specify right image }"
        "{ o output   | SURF_output.jpg  | specify output save path }"
        "{ m cpu_mode | false            | run without OpenCL }";

    CommandLineParser cmd(argc, argv, keys);
    if (cmd.has("help"))
    {
        std::cout << "Usage: surf_matcher [options]" << std::endl;
        std::cout << "Available options:" << std::endl;
        cmd.printMessage();
        return EXIT_SUCCESS;
    }
    if (cmd.has("cpu_mode"))
    {
        ocl::setUseOpenCL(false);
        std::cout << "OpenCL was disabled" << std::endl;
    }*/

    UMat img1, img2;

    std::string outpath = "out.jpg";

    std::string leftName = "imageA.png";
    imread(leftName, IMREAD_GRAYSCALE).copyTo(img1);
    if (img1.empty())
    {
        std::cout << "Couldn't load " << leftName << std::endl;
        return EXIT_FAILURE;
    }

    std::string rightName = "imageB.png";
    imread(rightName, IMREAD_GRAYSCALE).copyTo(img2);
    if (img2.empty())
    {
        std::cout << "Couldn't load " << rightName << std::endl;
        return EXIT_FAILURE;
    }

    double surf_time = 0.;

    //declare input/output
    std::vector<KeyPoint> keypoints1, keypoints2;
    std::vector<DMatch> matches;

    UMat _descriptors1, _descriptors2;
    Mat descriptors1 = _descriptors1.getMat(ACCESS_RW),
        descriptors2 = _descriptors2.getMat(ACCESS_RW);

    //instantiate detectors/matchers
    SURFDetector surf;
    FREAK freak;

    

    SURFMatcher<BFMatcher> matcher;

    //-- start of timing section

    for (int i = 0; i <= LOOP_NUM; i++)
    {
        if (i == 1) workBegin();
        surf(img1.getMat(ACCESS_READ), Mat(), keypoints1, descriptors1);
        surf(img2.getMat(ACCESS_READ), Mat(), keypoints2, descriptors2);
        matcher.match(descriptors1, descriptors2, matches);
    }
    workEnd();
    std::cout << "FOUND " << keypoints1.size() << " keypoints on first image" << std::endl;
    std::cout << "FOUND " << keypoints2.size() << " keypoints on second image" << std::endl;

    surf_time = getTime();
    std::cout << "SURF run time: " << surf_time / LOOP_NUM << " ms" << std::endl << "\n";


    std::vector<Point2f> corner;
    Mat img_matches = drawGoodMatches(img1.getMat(ACCESS_READ), img2.getMat(ACCESS_READ), keypoints1, keypoints2, matches, corner);

    //-- Show detected matches

    namedWindow("surf matches", 0);
    imshow("surf matches", img_matches);
    imwrite(outpath, img_matches);

    waitKey(0);
    return EXIT_SUCCESS;
}