2012-01-17 25 views
9

में एसआईएफटी द्वारा निकाली गई सुविधाओं का उपयोग करके लक्ष्य ऑब्जेक्ट के चारों ओर एक आयत कैसे प्राप्त करें I ऑब्जेक्ट डिटेक्शन पर ओपनसीवी में प्रोजेक्ट कर रहा हूं जिसमें संदर्भ छवि के साथ टेम्पलेट छवि में ऑब्जेक्ट से मिलान करना शामिल है। एल्गोरिथ्म सुविधाओं acurately का पता चला और मिलान किया झारना लेकिन मैं आपको पता लगाया वस्तु के चारों और आयत चाहते हैं मिलान किया सुविधाओं के चारों ओर एक rectagle मेरे एल्गोरिथ्म केडी-ट्री स्था EAN पहले तकनीक का उपयोग करता मैचोंओपनसीवी

उत्तर

7

प्राप्त करना चाहते हैं का उपयोग करना, here आपके पास बिल्कुल सही उदाहरण है। आपको सिर्फ होमोग्राफी एच

आशा है कि यह मदद करता है draw a rectangle की आवश्यकता है। सौभाग्य।

+1

दरअसल मैं अपनी परियोजना में ऑब्जेक्ट मिलान के लिए रोब हेस की एसआईएफटी लाइब्रेरी का उपयोग कर रहा हूं और आवश्यकताओं के अनुसार मैच के लिए कोड निष्पादित करता है लेकिन मुझे मेल खाने वाली ऑब्जेक्ट – Punit

+1

के आसपास एक आयत चाहिए, शायद यह लिंक आपको दूसरे की तुलना में बेहतर तरीके से मदद करेगा। एक आयताकार ड्राइंग आसान है, बस वे समझने की कोशिश करें कि वे क्या कर रहे हैं और आपके कोड में होमोग्राफी एच पर लागू होते हैं। http://nashruddin.com/OpenCV_Region_of_Interest_(ROI) –

+1

Thnx Jav_rock कोड बहुत उपयोगी है क्या मुझे इसका दस्तावेज संस्करण मिल सकता है – Punit

5

मैं एक कुंजीपटल के आस-पास निकालने के लिए ओपनसीवी (मॉड्यूल/फीचर्स 2 डी/src/surf.cpp) में SURF एल्गोरिदम से अनुकूलित निम्न कोड का उपयोग करता हूं।

आयताकारों और आरओआई के आधार पर अन्य उदाहरणों के अलावा, यह कोड फीचर पहचान एल्गोरिदम (KeyPoint संरचना में उपलब्ध दोनों) द्वारा निर्धारित अभिविन्यास और स्केल के अनुसार पैच को सही ढंग से उन्मुख करता है।

कई अलग अलग चित्र पर पता लगाने के परिणामों का एक उदाहरण:

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; 
} 

मुझे यकीन है कि अगर पैमाने पूरी तरह से ठीक है नहीं कर रहा हूँ, लेकिन यह सर्फ स्रोत और से लिया जाता है परिणाम मेरे लिए प्रासंगिक लगते हैं।