【问题标题】:convert cv::Mat to const CvMat* or CvMat*将 cv::Mat 转换为 const CvMat* 或 CvMat*
【发布时间】:2017-07-23 04:29:05
【问题描述】:

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

我的问题是如何将cv::Mat 转换为const CvMat* 或CvMat*,并且任何人都可以提供文档链接以了解opencv2 中CvMat *matcv::MatMat 之间的区别。 4.

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

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

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

    这使用相同的基础数据,因此您必须注意cv::Mat 不会超出CvMat 之前的范围。

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

    functionTakingCmMatptr(&cvMat);
    

    cv::MatMat的区别是一样的。在OpenCV 示例中,通常假设(我认为这不是一个好主意)使用using namespace cv

    【讨论】:

    • @谢谢juanchopanza,能否提供以上操作相关的链接。以及如何在 CvMat 中转换我的数据类型。我的 CvMat 中的数据是整数,现在我必须将其更改为浮点数,我该怎么做?
    【解决方案2】:

    特别回答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 的另一个原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2016-09-03
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多