如何在openCV中获得像素矩阵和重塑矩阵

sue*_*ing 5 c++ opencv image-processing matrix

我正在使用openCV在C++中实现一个图像处理算法,其中第一步要求将图像转换为矩阵.我知道当图像加载到openCV中时,它已经存储为矩阵.我使用的图像大小为80 x 60,所以我假设它存储的矩阵大小为80 x 60.但是,我想首先能够看到这个矩阵然后能够重塑它变成了一个相同的矩阵.像素,但作为一个长列.即80×60矩阵现在将成为4800×1矩阵.我曾尝试过研究教科书和在线但无济于事.到目前为止这是我的代码.在任何情况下,它都无法正常工作,因为我无法将'IplImage*'转换为'CvMat*但是我应该如何在创建后将像素值分配给矩阵?如果有人可以帮我解决这个问题,我将不胜感激.

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) {
IplImage* img0 = NULL;
CvMat* img0_mat = NULL ;
img0 = cvLoadImage("C:\\new\\walk mii.jpg");
if (!img0){
    return -1;}
img0_mat = cvCreateMat(80, 60, 1);
img0_mat = img0;
cout <<" matrix " << img0 << endl;

cvWaitKey(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*age 1

您可以致电Mat::reshape(int cn, int rows=0)

\n\n
\n

该方法为 *this 元素创建一个新的矩阵头。新矩阵可以具有不同的大小和/或不同的通道数量。任何组合都是可能的,只要:

\n\n

1)新矩阵中不包含任何额外元素,也不排除任何元素。因此,\n 产品

\n\n

2) rows*cols*channels() 转换后必须保持不变。

\n\n

不复制任何数据,即这是 O(1) 操作。因此,如果更改行数,或者操作以其他方式更改 elements\xe2\x80\x99 行索引,则矩阵必须是连续的。请参见 Mat::isContinously() 。

\n
\n\n

...看起来您正在使用旧版本的库,所以您需要cvReshape。像这样的东西应该有效:

\n\n
#include "cv.h" \n#include "highgui.h" \n#include "iostream" \nusing namespace std; \n\nint main( int argc, char* argv ) \n{ \n    IplImage* img0 = NULL; \n    CvMat* img0_mat = NULL ; \n    img0 = cvLoadImage("C:\\\\new\\\\walk mii.jpg"); \n    img0_mat = cvCreateMat(80, 60, 1); \n\n    CvMat row_header, *row;\n    row = cvReshape( img0_mat, &row_header, 0, 1 );\n\n    cout << " matrix " << row->tostring() << endl; \n\n    cvWaitKey(0); \n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n