关于cvReshape和cvGetRow的用法

1.在求矩阵转置方面,cvReshape比cvTranspose要好:
cvMat* matT, hdr;
matT = cvReshape( mat, &hdr, CV_MAT_CN(mat->type), mat->cols );
以上方式比下边的方式要好
CvMat* matT = cvCreateMat( mat->cols, mat->rows, mat->type );
cvTranpose( mat, matT );
cvReleaseMat( &matT );
原因是cvReshape在转置时不需要内存分配。
CvMat* mat, hdr;
mat = cvReshape( orig, &hdr, nChannel, nRow );
mat的地址指向的是orig的地址,而没有重新分配地址,形如CvMat* cvXxx( const CvMat*, &hdr )的函数都是这样的。
当然这种方式只适用于部分向量,而不适用于由
cvGetRow或者cvGetCols得到的向量,因为这样得到的向量内存是不连续的。
2.通过cvGetRow达到cvSetRow的目的
这个纯属是上边那个结论的小技巧,我们用cvGetRow取出指定行,其实就是取出指向指定行的地址,
然后用cvCopy来修改,原行自然就被改动了:
CvMat *row, hdr;
row = cvGetRow( mat, &hdr, 1 );
cvCopy( another_row, row );    

你可能感兴趣的:(关于cvReshape和cvGetRow的用法)