преобразование 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
.