我应该如何使用CVReforme?
我试图使用CVReformate来获得相同矩阵数据的两个版本。例如,这里的gray_img是一个100x100的矩阵,gray_line是一个10000x1的矩阵,指向相同的数据,但具有不同的头。 以下是我在OpenCV中按照文档所做的工作:我应该如何使用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 =
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;
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;
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
现在有两个实例指向相同的数据