2012-06-14 14 views
9

मैं केवल सी भाषा जानते हैं, इसलिए मैं विशेष रूप से cv::Mat, CvMat*, Mat.परिवर्तित सीवी :: चटाई CvMat const करने के लिए * या CvMat *

में openCV डेटा प्रकार के वाक्य रचना नहीं समझने में भ्रम की स्थिति हो रही है/मेरा प्रश्न है कैसे कर सकते हैं मैं const CvMat * या CvMat* करने के लिए cv::Mat कनवर्ट करते हैं, और किसी भी एक opencv2.4 में CvMat *mat और cv::Mat और Mat बीच अंतर के लिए दस्तावेज़ीकरण लिंक प्रदान कर सकते हैं।

और मैं अपने int डेटा को CvMat में डेटा फ़्लोट करने के लिए कैसे परिवर्तित कर सकता हूं? धन्यवाद

उत्तर

22

cv::Mat एक operator CvMat() इतना आसान काम काम करता है:

cv::Mat mat = ....; 
CvMat cvMat = mat; 

यह समान ही अंतर्निहित डेटा का उपयोग करता है तो आप सावधान कि cv::MatCvMat से पहले क्षेत्र से बाहर जाने नहीं करता रहना होगा।

आप एक API कि एक CvMat* लेता में CvMat उपयोग करने की आवश्यकता है, तो वस्तु का पता पारित:

functionTakingCmMatptr(&cvMat); 

cv::Mat और Mat के बीच अंतर का सवाल है, वे एक ही हैं। OpenCV उदाहरणों में, इसे अक्सर माना जाता है (और मुझे नहीं लगता कि यह एक अच्छा विचार है) using namespace cv का उपयोग किया जाता है।

+0

@ धन्यवाद juanchopanza, क्या आप उपरोक्त परिचालन से संबंधित लिंक प्रदान कर सकते हैं। और मैं अपने डेटा प्रकारों को सीवीमैट में कैसे परिवर्तित कर सकता हूं। मेरे पास सीवीमैट में डेटा पूर्णांक है, अब मुझे इसे फ्लोट करने के लिए बदलना है, मैं यह कैसे कर सकता हूं? – surya

0

विशेष रूप से सूर्य की दूसरी सवाल का जवाब करने के लिए:

THB, OpenCV पर दस्तावेज़ीकरण सबसे अच्छा नहीं है। यहां नवीनतम प्रकार का लिंक: सीवी :: मैट http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat सी प्रकार की तरह नए प्रकार के आधुनिक सी ++ हैं।

यहाँ

एक समान विषय के साथ दो और OpenCV मंच जवाब: http://answers.opencv.org/question/65224/conversion-between-cvmat-and-cvmat/ और http://www.answers.opencv.org/question/13437/difference-between-cvmat-cvmat-cvmat-and-mat/

विशेष रूप से रूपांतरण समस्या के लिए

(juanchopanza उल्लेख किया):

cv::Mat mat = cv::Mat(10, 10, CV_32FC1); //CV_32FC1 equals float 
             //(reads 32bit floating-point 1 channel) 
CvMat cvMat = mat; 

या साथ

using namespace cv; //this should be in the beginning where you include 
Mat mat = Mat(10, 10, CV_32FC1); 
CvMat cvMat = mat; 

नोट: आमतौर पर आप शायद CvMat* के साथ काम करेंगे - लेकिन आपको सोचना चाहिए नए प्रकारों को पूरी तरह से स्विच करने के बारे में। के रूप में CvMat ढेर पर आयोजित किया जाता है तो

CvMat* A = cvCreateMat(10, 10, CV_16SC1); 
//Feed A with data 
CvMat* B = cvCreateMat(10, 10, CV_32FC1); 
for(int i=0; i<10; ++i) 
    for(int i=0; i<10; ++i) 
     CV_MAT_ELEM(*A, float, i, j) = (float) cvmGet(B, i, j); 
//Don't forget this unless you want to produce a memory leak. 
cvReleaseMat(&A); 
cvReleaseMat(&B); 

पहले दो उदाहरण (सूचक) के बिना इस तरह ठीक हैं: फ्लोट करने के लिए

CvMat* A = cvCreateMat(10, 10, CV_32F); //guess this works fine with no channels too 

बदलने पूर्णांक: उदाहरण (मेरी दूसरी कड़ी से लिया गया) । cvCreateMat(...) स्मृति को आवंटित करता है जिसे आपको बाद में मुक्त करना होगा। cv::Mat का उपयोग करने का एक अन्य कारण।

संबंधित मुद्दे