我需要从一幅图像中截出一小块,把它转成一维向量。开始是这样做的
IplImage *result;
CvSize size;
size.width=rectInImage.width;
size.height=rectInImage.height;
result=cvCreateImage( size, orgImage->depth, orgImage->nChannels );
//从图像中提取子图像
cvSetImageROI(orgImage,rectInImage);
cvCopy(orgImage,result);
cvResetImageROI(orgImage);
//把CvMat转成IplImage
cvGetMat(result, matRect, NULL, 0 );
//转成一维向量
CvMat vecHead,*vec;
vec=cvReshape( matRect, &vecHead, 0, 1 )
matRect->data.ptr=(uchar*)result->imageData;
//cvGetMat是从不确定数组返回矩阵头。
CvMat* cvGetMat( const CvArr* arr, CvMat* header, int* coi=NULL, int allowND=0 );
cvReshape函数也是只改变矩阵的头,数据部分不变。
1.
CvMat row_header, *row;
row = cvReshape( mat, &row_header, 0, 1 );
//运行后row=&row_header,row->data.ptr=mat->data.ptr
//cvReshape的第一个参数可以是IplImage,但是所产生的CvMat在调用其他函数时是否会再出现“Image step is wrong”的错就不好说了(因为没时间,所以没试)。
//我的程序最后改为下述代码实现。
2.
cvSetImageROI(srcImg,blockRect);//blockRect为CvRect类型
cvCopy(srcImg,block);//srcImg为IplImage类型,block为CvMat类型
cvResetImageROI(srcImg);
CvMat vecHead,*vec;
vec=cvReshape( block, &vecHead, 0, 1 );//vec是得到的一维向量