我只知道C语言,所以我很困惑/不理解openCV
数据类型的语法,尤其是在cv::Mat, CvMat*, Mat.
我的问题是如何转换cv::Mat
为const CvMat
* or CvMat*
,并且任何人都可以提供文档链接以 了解 opencv2.4CvMat *mat
中的和cv::Mat
和之间Mat
的区别。
以及如何将我的 int 数据转换为 CvMat 中的浮点数据?谢谢
cv::Mat
有一个操作符 CvMat()如此简单的分配工作:
cv::Mat mat = ....;
CvMat cvMat = mat;
这使用相同的基础数据,因此您必须小心,cv::Mat
不要在CvMat
.
如果您需要在采用CvMat
的 API 中使用CvMat*
,则传递对象的地址:
functionTakingCmMatptr(&cvMat);
至于 和 之间的区别cv::Mat
,Mat
它们是相同的。在OpenCV
示例中,通常假设(我认为这不是一个好主意)using namespace cv
使用它。
尤其要回答 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
.