opencv 将cv::Mat转换为常量CvMat* 或CvMat*

dkqlctbz  于 2023-02-23  发布在  其他
关注(0)|答案(2)|浏览(167)

我只懂C语言,所以我感到困惑/不理解openCV数据类型的语法,尤其是在cv::Mat, CvMat*, Mat.
我的问题是如何将cv::Mat转换为const CvMat * 或CvMat*,以及是否有人提供CvMat *matcv::MatMat之间的差异的文档链接(在opencv2.4中)。
和如何在CvMat中将int数据转换为float数据?谢谢

vddsk6oq

vddsk6oq1#

cv::Mat有一个运算符CvMat(),因此可以进行简单的赋值:

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

这使用相同的底层数据,因此必须小心,cv::Mat不会在CvMat之前超出范围。
如果您需要在接受CvMat*的API中使用CvMat,则传递对象的地址:

functionTakingCmMatptr(&cvMat);

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

svgewumm

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):

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(...)分配内存,您必须稍后自己释放内存。

相关问题