2012-01-17 41 views
9

Tôi đang thực hiện dự án trong OpenCV về phát hiện đối tượng bao gồm đối tượng trong ảnh mẫu với hình ảnh tham chiếu. Sử dụng thuật toán SIFT các tính năng được phát hiện chính xác và phù hợp nhưng tôi muốn một rectagle xung quanh các tính năng phù hợp Thuật toán của tôi sử dụng KD-Tree est ean Kỹ thuật đầu tiên để có được các kết quả phù hợpCách lấy một hình chữ nhật xung quanh đối tượng đích bằng cách sử dụng các tính năng được trích xuất bằng SIFT trong OpenCV

Trả lời

7

Nếu bạn muốn một hình chữ nhật xung quanh đối tượng được phát hiện, here bạn có ví dụ mã với chính xác điều đó. Bạn chỉ cần draw a rectangle quanh địa lý nhà riêng H.

Hy vọng điều đó sẽ hữu ích. Chúc may mắn.

+1

Thực ra tôi đang sử dụng thư viện SIFT của Robb Hess để phù hợp với đối tượng trong dự án của tôi và mã cho phù hợp với yêu cầu nhưng tôi muốn một hình chữ nhật quanh đối tượng phù hợp – Punit

+1

Có thể liên kết này giúp bạn tốt hơn. Vẽ một hình chữ nhật là dễ dàng, chỉ cần cố gắng hiểu wgat họ đang làm và áp dụng cho homography H trong mã của bạn. http://nashruddin.com/OpenCV_Region_of_Interest_(ROI) –

+1

Thnx Jav_rock mã này rất hữu ích, tôi có thể lấy phiên bản tài liệu của nó – Punit

5

Tôi sử dụng mã sau đây, được điều chỉnh từ thuật toán SURF trong OpenCV (modules/features2d/src/surf.cpp) để trích xuất xung quanh một điểm chính.

Ngoài các ví dụ khác dựa trên hình chữ nhật và ROI, mã này trả về bản vá theo đúng định hướng và tỷ lệ được xác định bằng thuật toán phát hiện tính năng (có sẵn trong cấu trúc KeyPoint).

Một ví dụ về kết quả của việc phát hiện trên hình ảnh khác nhau:

SIFT keypoint patch extract example

const int PATCH_SZ = 20; 
Mat extractKeyPoint(const Mat& image, KeyPoint kp) 
{ 
    int x = (int)kp.pt.x; 
    int y = (int)kp.pt.y; 
    float size = kp.size; 
    float angle = kp.angle; 

    int win_size = (int)((PATCH_SZ+1)*size*1.2f/9.0); 
    Mat win(win_size, win_size, CV_8UC3); 

    float descriptor_dir = angle * (CV_PI/180); 
    float sin_dir = sin(descriptor_dir); 
    float cos_dir = cos(descriptor_dir); 
    float win_offset = -(float)(win_size-1)/2; 
    float start_x = x + win_offset*cos_dir + win_offset*sin_dir; 
    float start_y = y - win_offset*sin_dir + win_offset*cos_dir; 
    uchar* WIN = win.data; 
    uchar* IMG = image.data; 
    for(int i = 0; i < win_size; i++, start_x += sin_dir, start_y += cos_dir) 
    { 
     float pixel_x = start_x; 
     float pixel_y = start_y; 
     for(int j = 0; j < win_size; j++, pixel_x += cos_dir, pixel_y -= sin_dir) 
     { 
      int x = std::min(std::max(cvRound(pixel_x), 0), image.cols-1); 
      int y = std::min(std::max(cvRound(pixel_y), 0), image.rows-1); 
      for (int c=0; c<3; c++) { 
       WIN[i*win_size*3 + j*3 + c] = IMG[y*image.step1() + x*3 + c]; 
      } 
     } 
    } 
    return win; 
} 

Tôi không chắc chắn nếu quy mô là hoàn toàn OK, nhưng nó được lấy từ nguồn SURF và kết quả có liên quan đến tôi.

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