2012-04-26 16 views
11

मैं opencv फ्लान :: सूचकांक के साथ कुछ समस्याएं हैं -ओपनसीवी फ्लैन :: इंडेक्स का उपयोग कैसे करें?

मैं सूचकांक बना रहा हूं

Mat samples = Mat::zeros(vfv_net_quie.size(),24,CV_32F); 
     for (int i =0; i < vfv_net_quie.size();i++) 
     { 
      for (int j = 0;j<24;j++) 
      { 
       samples.at<float>(i,j)=(float)vfv_net_quie[i].vfv[j]; 
      } 
     } 
    cv::flann::Index flann_index(
      samples, 
      cv::flann::KDTreeIndexParams(4), 
      cvflann::FLANN_DIST_EUCLIDEAN 
       ); 
    flann_index.save("c:\\index.fln"); 

एक fter है कि मैं इसे लोड और पास की neiborhoods

cv::flann::Index flann_index(Mat(), 
    cv::flann::SavedIndexParams("c:\\index.fln"), 
    cvflann::FLANN_DIST_EUCLIDEAN 
    ); 

cv::Mat resps(vfv_reg_quie.size(), K, CV_32F); 
cv::Mat nresps(vfv_reg_quie.size(), K, CV_32S); 
cv::Mat dists(vfv_reg_quie.size(), K, CV_32F); 

flann_index.knnSearch(sample,nresps,dists,K,cv::flann::SearchParams(64)); 

खोजने के लिए कोशिश कर रहा हूँ और लाइन

((IndexType*)index)->knnSearch(_query, _indices, _dists, knn, 
          (const ::cvflann::SearchParams&)get_params(params)); 

Pl में miniflann.cpp में पहुंच उल्लंघन है मदद

उत्तर

12

आप एक Mat() में फ्लान-फ़ाइल को लोड नहीं करना चाहिए, के रूप में यह जगह है जहाँ सूचकांक संग्रहीत किया जाता है है कम। कन्स्ट्रक्टर कहलाए जाने के बाद यह एक अस्थायी वस्तु नष्ट हो गई है। यही कारण है कि जब आप knnSearch() पर कॉल करते हैं तो सूचकांक कहीं भी उपयोगी नहीं है।

cv::Mat indexMat; 
cv::flann::Index flann_index(
    indexMat, 
    cv::flann::SavedIndexParams("c:\\index.fln"), 
    cvflann::FLANN_DIST_EUCLIDEAN 
); 

में जिसके परिणामस्वरूप:

मैं निम्नलिखित की कोशिश की

Reading FLANN index error: the saved data size (100, 64) or type (5) is different from the passed one (0, 0), 0 

जिसका अर्थ है, मैट्रिक्स सही आयामों के साथ प्रारंभ हो गया है कि (मेरे लिए बहुत बेवकूफ लगता है, के रूप में मैं डॉन ' टी जरूरी नहीं है, मेरे सूचकांक में कितने तत्व संग्रहीत हैं)।

cv::Mat indexMat(samples.size(), CV_32FC1); 
cv::flann::Index flann_index(
    indexMat, 
    cv::flann::SavedIndexParams("c:\\index.fln"), 
    cvflann::FLANN_DIST_EUCLIDEAN 
); 

चाल है।

+4

ध्यान देने योग्य बिंदु यह है कि आपको वास्तविक मूल डेटासेट प्रदान करने की आवश्यकता है, न केवल सही आयाम वाले मैट। यह ओपनसीवी दस्तावेज में बहुत स्पष्ट नहीं है, लेकिन [फ्लैन प्रलेखन] की धारा 3.3.4 में उल्लेख किया गया है (http://www.cs.ubc.ca/~mariusm/uploads/FLANN/flann_manual-1.6.pdf) – Sau

+0

@Sau धारा 3.3.4 Matlab के बारे में बात नहीं है और सी ++ नहीं है? क्या आपने ओपनसीवी में या फ्लैन के सी ++ संस्करण में अपनी टिप्पणी सत्यापित की है? – t2k32316

1

स्वीकार्य उत्तर में किसी भी तरह से स्पष्ट और भ्रामक नहीं है कि cv::flann::Index में इनपुट मैट्रिक्स क्यों संरक्षित सूचकांक उत्पन्न करने के लिए उपयोग किए गए मैट्रिक्स के समान ही आयाम होना चाहिए। मैं एक उदाहरण के साथ @ सॉ की टिप्पणी पर विस्तार से बताऊंगा।

KDTreeIndex इनपुट एक cv::Mat sample के रूप में उपयोग करते हुए उत्पन्न किया गया था, और उसके बाद बचा लिया।

cv::Mat sample(sample_num, sample_size, ... /* other params */); 
cv::flann::SavedIndexParams index_params("c:\\index.fln"); 
cv::flann::GenericIndex<cvflann::L2<float>> flann_index(sample, index_params); 

L2 सामान्य इयूक्लिडियन दूरी (अन्य प्रकार opencv2/flann/dist.h में पाया जा सकता है): जब आप इसे लोड, आप एक ही sample मैट्रिक्स यह उत्पन्न करने के लिए, की तरह कुछ (टेम्प्लेटेड GenericIndex इंटरफ़ेस का उपयोग कर) प्रदान करनी चाहिए।

अब सूचकांक से पता चला के रूप में इस्तेमाल किया जा सकता है लगता है एक query बिंदु के K निकटतम पड़ोसियों:

std::vector<float> query(sample_size); 
std::vector<int> indices(K); 
std::vector<float> distances(K); 

flann_index.knnSearch(query, indices, distances, K, cv::flann::SearchParams(64)); 

मैट्रिक्स indices मैट्रिक्स sample में स्थानों निकटतम पड़ोसियोंकी में शामिल होंगे, जिसे पहले इंडेक्स जेनरेट करने के लिए इस्तेमाल किया गया था। यही कारण है कि आपको इंडेक्स जेनरेट करने के लिए इस्तेमाल किए गए मैट्रिक्स के साथ सहेजे गए इंडेक्स को लोड करने की आवश्यकता है, अन्यथा लौटा वेक्टर में अर्थहीन "निकटतम पड़ोसियों" को इंगित सूचकांक शामिल होंगे।

इसके अलावा आप से युक्त एक distances मैट्रिक्स मिल कितनी दूर अपने query बिंदु है, जो आपको बाद में उदाहरण के लिए, कुछ inverse distance weighting प्रदर्शन करने के लिए उपयोग कर सकते हैं से पाया पड़ोसी हैं।

कृपया यह भी ध्यान दें कि sample_sizesample मैट्रिक्स और query बिंदु से मेल खाना है।