【问题标题】:How am I supposed to use cvReshape?我应该如何使用 cvReshape?
【发布时间】:2011-08-20 04:33:43
【问题描述】:

我正在尝试使用 cvReshape 来获得相同矩阵数据的 2 个版本。例如,gray_img 是一个 100x100 的矩阵,gray_line 是一个 10000x1 的矩阵,指向相同的数据但具有不同的标题。 这就是我按照文档在 OpenCV 中所做的事情:

CvMat *  gray_img;
CvMat  gray_line_header;
CvMat * gray_line;
gray_img = cvCreateImage(100, 100, IPL_DEPTH_32F, 1);
gray_line = cvReshape(gray_img, &gray_line_header, 0, 10000);

这是有意的,但我觉得这很难阅读,而且一点也不优雅。如果我理解正确,gray_line 将指向 gray_line_header,所以我觉得这里有一个额外的变量。 是否可以在不声明矩阵头或仅使用 2 个(而不是 3 个)矩阵声明的情况下做我想做的事情?

谢谢

【问题讨论】:

    标签: c opencv


    【解决方案1】:

    您是否致力于 OpenCV 的旧 C 接口?使用 C++ 接口,您可以这样做:

    cv::Mat grayImg(100, 100, CV_32FC1);
    cv::Mat grayLine(grayImg);
    grayLine.reshape(1,10000); //1 column, 10000 rows
    

    现在您有两个指向相同数据的实例。

    【讨论】:

      【解决方案2】:

      你猜对了。

      gray_line 正好指向额外的变量 gray_line_header。

      但是,您的问题似乎没有简单的解决方案......

      如果你这样编码:

      CvMat *gray_img, *gray_line;
      gray_img = cvCreateMat(20, 20, CV_8U);
      gray_line = cvReshape(gray_img, gray_line, 0, 40);
      cvShowImage("after reshape", gray_line);
      cvWaitKey(0);
      

      它肯定会给你一个分段错误...

      为了摆脱额外的变量,我只能想出2个仍然不优雅的解决方案

      1. 只用一个指针,一个实际

        CvMat *gray_img, gray_line_data;
        gray_img = cvCreateImage(100, 100, IPL_DEPTH_32F, 1);
        cvReshape(gray_img, &gray_line_data, 0, 10000);
        CvMat *gray_line = &gray_line_data;
        
      2. 只使用两个指针,并在 cvReshape 之前调用 cvCreateMatHeader

        CvMat *gray_img, *gray_line;
        gray_img  = cvCreateMat(20, 20, CV_8U);
        // initialize gray_img (omitted)
        gray_line = cvCreateMatHeader(40, 1, gray_img->type);
        gray_line = cvReshape(gray_img, gray_line, 0, 40); // maybe just data pointer reassigning?
        

      【讨论】:

        猜你喜欢
        • 2015-06-27
        • 2013-09-04
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        相关资源
        最近更新 更多