我正在使用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;
}
答案 0 :(得分:1)
您可以致电Mat::reshape(int cn, int rows=0)
:
该方法为* this元素创建一个新的矩阵头。新矩阵可以具有不同的大小和/或不同数量的通道。任何组合都是可能的,只要:
1)新矩阵中不包含额外元素,也不排除任何元素。所以, 产品
2)行* cols * channels()必须在转换后保持不变。
没有数据被复制,即这是O(1)操作。因此,如果更改行数,或者操作以其他方式更改元素的行索引,则矩阵必须是连续的。见Mat :: isContinuous()。
...看起来您正在使用旧版本的库,但您需要cvReshape。这样的事情应该有效:
#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");
img0_mat = cvCreateMat(80, 60, 1);
CvMat row_header, *row;
row = cvReshape( img0_mat, &row_header, 0, 1 );
cout << " matrix " << row->tostring() << endl;
cvWaitKey(0);
return 0;
}