преобразование cv:: Mat в const CvMat* или CvMat*

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

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

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

2 ответов


cv::Mat есть оператор CvMat() так простое задание работает:

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

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

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

functionTakingCmMatptr(&cvMat);

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


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

THB, документация по OpenCV не самая лучшая. Здесь ссылка на новейший тип: cv:: Mathttp://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 на float:

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.