我应该如何使用CVReforme?

我应该如何使用CVReforme?,c,opencv,C,Opencv,我试图使用CVReformate来获得相同矩阵数据的两个版本。例如,这里的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 =

我试图使用CVReformate来获得相同矩阵数据的两个版本。例如,这里的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);
这是有意的,但我觉得这很难阅读,一点也不优雅。如果我理解正确,灰线将指向灰线标题,所以我觉得这里有一个额外的变量。 是否可以不声明矩阵头或只声明2(而不是3)个矩阵来执行我想要的操作

谢谢你的猜测是对的

灰线正好指向额外的变量灰线标题

然而,你的问题似乎没有简单的解决办法

如果您这样编写代码:

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个仍然不优雅的解决方案

  • 只使用一个指针,一个实际值

    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;
    
  • 仅使用两个指针,并在CVReformate之前调用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?
    
  • 你的猜测是对的

    灰线正好指向额外的变量灰线标题

    然而,你的问题似乎没有简单的解决办法

    如果您这样编写代码:

    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个仍然不优雅的解决方案

  • 只使用一个指针,一个实际值

    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;
    
  • 仅使用两个指针,并在CVReformate之前调用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?
    

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

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

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

    您是否承诺使用OpenCV的旧C接口?用C++接口,你可以这样做:

    cv::Mat grayImg(100, 100, CV_32FC1);
    cv::Mat grayLine(grayImg);
    grayLine.reshape(1,10000); //1 column, 10000 rows
    
    现在有两个实例指向相同的数据