2012-06-15 37 views
5

Tôi đang cố gắng phát hiện một đối tượng từ mã sau đây liên quan đến dò tìm lướt, tôi không muốn vẽ các đối sánh, tôi muốn vẽ một hình chữ nhật xung quanh đối tượng được phát hiện, nhưng bằng cách nào đó tôi không thể có được chính xác Homography, xin vui lòng bất cứ ai có thể chỉ ra nơi tôi đang đi sai.Vẽ hình chữ nhật xung quanh đối tượng được phát hiện sử dụng SURF

#include <stdio.h> 
#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 

using namespace cv; 

int main() 
{ 
    Mat object = imread("sample.jpeg", CV_LOAD_IMAGE_GRAYSCALE); 

    if(!object.data) 
    { 
     std::cout<< "Error reading object " << std::endl; 
     return -1; 
    } 

    //Detect the keypoints using SURF Detector 
    int minHessian = 500; 

    SurfFeatureDetector detector(minHessian); 
    std::vector<KeyPoint> kp_object; 

    detector.detect(object, kp_object); 

    //Calculate descriptors (feature vectors) 
    SurfDescriptorExtractor extractor; 
    Mat des_object; 

    extractor.compute(object, kp_object, des_object); 

    FlannBasedMatcher matcher; 

    VideoCapture cap(0); 

    namedWindow("Good Matches",0); 
    cvResizeWindow("Good Matches",800,800); 

    std::vector<Point2f> obj_corners(4); 

    //Get the corners from the object 
    obj_corners[0] = (cvPoint(0,0)); 
    obj_corners[1] = (cvPoint(object.cols,0)); 
    obj_corners[2] = (cvPoint(object.cols,object.rows)); 
    obj_corners[3] = (cvPoint(0, object.rows)); 

    char key = 'a'; 
    int framecount = 0; 
    while (key != 27) 
    { 
     Mat frame; 
     cap >> frame; 

     if (framecount < 5) 
     { 
      framecount++; 
      continue; 
     } 

     Mat des_image, img_matches; 
     std::vector<KeyPoint> kp_image; 
     std::vector<vector<DMatch > > matches; 
     std::vector<DMatch > good_matches; 
     std::vector<Point2f> obj; 
     std::vector<Point2f> scene; 
     std::vector<Point2f> scene_corners(4); 
     Mat H; 
     Mat image; 

     cvtColor(frame, image, CV_RGB2GRAY); 

     detector.detect(image, kp_image); 
     extractor.compute(image, kp_image, des_image); 

     matcher.knnMatch(des_object, des_image, matches, 2); 

     for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS 
     { 
      if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0)) 
     { 
       good_matches.push_back(matches[i][0]); 
      } 
     } 

     //Draw only "good" matches 
    // drawMatches(object, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

     if (good_matches.size() >= 4) 
     { 
      for(int i = 0; i < good_matches.size(); i++) 
      { 
       //Get the keypoints from the good matches 
       obj.push_back(kp_object[ good_matches[i].queryIdx ].pt); 
       scene.push_back(kp_image[ good_matches[i].trainIdx ].pt); 
      } 

      H = findHomography(obj, scene, CV_RANSAC); 

      perspectiveTransform(obj_corners, scene_corners, H); 

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

     //Show detected matches 
     imshow("Good Matches", image); 

     key = waitKey(1); 
    } 
    return 0; 
} 
+0

bằng cách nào đó không thể bằng cách nào? bạn không nhận được đủ các trận đấu hay không, liệu bài hát được tính toán đơn giản có sai không? có lẽ bạn có một số trận đấu bên ngoài các đối tượng? – penelope

+0

@penelope các trận đấu là đủ tốt, nhưng hình chữ nhật được cho là xung quanh đối tượng không phải là xung quanh nó, vì vậy tôi đoán tôi đang tính toán tọa độ sai. – sum2000

Trả lời

4

Nếu bạn muốn xem cả hình ảnh với một hình chữ nhật bounding đến thứ hai xung quanh đối tượng được phát hiện bạn cần phải sử dụng img_matches mảng và không ảnh khi bạn vẽ các đường.

Nếu bạn muốn xem chỉ hình ảnh với mục đích rõ rệt và không phải là cặp hình ảnh (như bạn xác định bởi các đường vẽ vào ảnh), bạn chỉ cần thay đổi mã của bạn để:

line(image, scene_corners[0], scene_corners[1], Scalar(0, 255, 0), 4);

line(image, scene_corners[1], scene_corners[2], Scalar(0, 255, 0), 4);

line(image, scene_corners[2], scene_corners[3], Scalar(0, 255, 0), 4);

line(image, scene_corners[3], scene_corners[0], Scalar(0, 255, 0), 4);

và hiển thị các hình ảnh trong một cửa sổ mới

imshow("Result", image);

Các vấn đề liên quan