特别回答surya的第二个问题:
THB,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 的另一个原因。