我需要从一幅图像中截出一小块,把它转成一维向量。开始是这样做的
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是得到的一维向量