2012-06-14 3 views
9

Я знаю только C язык, поэтому я получаю путаницы/не понимая синтаксис типов данных openCV особенно в cv::Mat, CvMat*, Mat.новообращенных резюме :: Mat на константную CvMat * или CvMat *

Мой вопрос Как можно Я конвертировать cv::Mat в const CvMat * или CvMat*, и может ли один предоставить документацию ссылку на разницу между CvMat *mat и cv::Mat и Mat в opencv2.4.

и как я могу преобразовать свои данные int в плавающие данные в CvMat? Спасибо

ответ

22

cv::Mat имеет operator CvMat() так просто назначение работ:

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

Это использует те же данные, так что вы должны быть осторожны, что cv::Mat не выходит за рамки до CvMat.

Если вам нужно использовать CvMat в API, который принимает CvMat*, а затем передать адрес объекта:

functionTakingCmMatptr(&cvMat); 

Что касается разницы между cv::Mat и Mat, они одинаковы. В примерах OpenCV часто предполагается (и я не думаю, что это хорошая идея), что используется using namespace cv.

+0

@ Спасибо, juanchopanza, Можете ли вы предоставить ссылку, связанную с вышеуказанными операциями. и как я могу преобразовать свои типы данных в CvMat. У меня есть данные в моем CvMat - целое число. Теперь мне нужно изменить это на float. Как я могу это сделать? – surya

0

Чтобы ответить на второй вопрос, особенно Сурьи:

ТЛ, документация по OpenCV не лучший. Ссылка на новый тип: cv :: Mat http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat Новые типы - это более современный C++, чем стиль c.

Вот два ответа более 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* A = cvCreateMat(10, 10, CV_32F); //guess this works fine with no channels too 

Изменения Int плавать:

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 удерживается в куче, то , cvCreateMat(...) выделяет память, которую вы должны освободить самостоятельно. Еще одна причина для использования cv::Mat.

Смежные вопросы