2011-10-28 11 views
5

एक OpenCV cv::Mat को float* में कनवर्ट करने के लिए कैसे करें Vlfeat vl_dsift_process में खिलाया जा सकता है? मुझे समझ में नहीं आता कि vl_dsift_process एक-आयामी फ्लोट सरणी पर कैसे काम करता है। आधिकारिक नमूने केवल MatLab API का उपयोग करने का तरीका दिखाते हैं। ऐसा लगता है कि सी एपीआई के बारे में कोई नमूने नहीं हैं, और एकमात्र सुराग स्रोत पैकेज में MEX फ़ाइल है।ओपनसीवी सीवी :: मैट को फ्लोट में कैसे परिवर्तित करें * जिसे Vlfeat vl_dsift_process में खिलाया जा सकता है?

+0

क्या यह समस्या मैटलैब से सी तक मैट्रिक्स कैसे पारित की जा सकती है? –

उत्तर

11

float* matData = (float*)myMat.data;

मैट्रिक्स को हटाया नहीं जाता है/आंकड़ों के सूचक का उपयोग कर समाप्त करने से पहले क्षेत्र से बाहर चला जाता है सुनिश्चित करें। और सुनिश्चित करें कि मैट्रिक्स में फ्लोट्स हैं।

+1

मैट्रिक्स को निरंतर होने के लिए जांचना चाहिए, अन्यथा इसे एक-आयामी सरणी के रूप में व्याख्या नहीं किया जा सकता है। और मुझे लगता है कि यहां 'reinterpret_cast' का उपयोग करना अधिक उचित है क्योंकि यह स्पष्ट रूप से इस कलाकार की खतरनाक प्रकृति को इंगित करता है। वैसे भी, डीएसआईएफटी निष्कर्षण शायद मैट्रिक्स को 'वेक्टर ' में परिवर्तित करने की तुलना में धीमी गति के कई आदेश होंगे, इसलिए मुझे लगता है कि संबंधित ओवरहेड नगण्य है और अतिरिक्त सुरक्षा और पोर्टेबिलिटी के लायक है। – lizarisk

4

मैं एक आयामी नाव सरणी

DSIFT पर कैसे vl_dsift_process काम करता है समझ में नहीं आ सकते हैं, जहां पिक्सेल (एक्स, वाई) की intensivity float_array [y * चौड़ाई + x] में संग्रहित है ग्रेस्केल छवि की उम्मीद फ्लोट वैल्यू के रूप में। ओपनसीवी छवियों में हस्ताक्षरित वर्णों के रूप में संग्रहीत किया जाता है ताकि मट :: डेटा फ्लोट करने के लिए इतना आसान रूपांतरण * काम नहीं करेगा। आपको प्रत्येक मान को मैन्युअल रूप से फ़्लोट करने के लिए कनवर्ट करना होगा:

Mat mat = imread("image_name.jpg", 0); // 0 stands for grayscale 

vector<float> img; 
for (int i = 0; i < mat.rows; ++i) 
    for (int j = 0; j < mat.cols; ++j) 
    img.push_back(mat.at<unsigned char>(i, j)); 

vl_dsift_process(dsift, &img[0]); 
संबंधित मुद्दे