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);
2条答案
按热度按时间vddsk6oq1#
cv::Mat
有一个运算符CvMat(),因此可以进行简单的赋值:这使用相同的底层数据,因此必须小心,
cv::Mat
不会在CvMat
之前超出范围。如果您需要在接受
CvMat*
的API中使用CvMat
,则传递对象的地址:至于
cv::Mat
和Mat
之间的区别,它们是相同的,在OpenCV
的例子中,经常假设(我不认为这是一个好主意)使用using namespace cv
。svgewumm2#
要特别回答surya's second question:
TBH,OpenCV上的文档不是最好的。这里是最新类型的链接:cv::Mat.较新的类型比c风格更像现代c++。
主题与here is an archived page类似的Here is more OpenCV forum answer。特别是对于转换问题(as juanchopanza mentioned):
或与
注意:通常你可能会使用
CvMat*
,但是你应该考虑完全切换到新的类型。示例(取自我的第二个链接):将
int
更改为float
:前两个例子(没有指针)很好,因为CvMat保存在堆中,然后.
cvCreateMat(...)
分配内存,您必须稍后自己释放内存。