我该如何使用cvReshape?

时间:2011-08-19 17:51:01

标签: c opencv

我正在尝试使用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)矩阵声明?

感谢

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

你的猜测是正确的。

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?