9

我只知道C语言,所以我很困惑/不理解openCV数据类型的语法,尤其是在cv::Mat, CvMat*, Mat.

我的问题是如何转换cv::Matconst CvMat* or CvMat*,并且任何人都可以提供文档链接以 了解 opencv2.4CvMat *mat中的和cv::Mat和之间Mat的区别。

以及如何将我的 int 数据转换为 CvMat 中的浮点数据?谢谢

4

2 回答 2

22

cv::Mat有一个操作符 CvMat()如此简单的分配工作:

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

这使用相同的基础数据,因此您必须小心,cv::Mat不要在CvMat.

如果您需要在采用CvMat的 API 中使用CvMat*,则传递对象的地址:

functionTakingCmMatptr(&cvMat);

至于 和 之间的区别cv::MatMat它们是相同的。在OpenCV示例中,通常假设(我认为这不是一个好主意)using namespace cv使用它。

于 2012-06-14T06:12:29.413 回答
0

尤其要回答 surya 的第二个问题:

泰铢,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章

特别是对于转换问题(如 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.

于 2017-07-22T20:29:05.550 回答