cvCopy与cvCloneImage的区别
/* Copies source array to destination array */
CVAPI(void) cvCopy( const CvArr* src, CvArr* dst,
const CvArr* mask CV_DEFAULT(NULL) );
/* Creates a copy of IPL image (widthStep may differ) */
CVAPI(IplImage*) cvCloneImage( const IplImage* image );
如果设定了ROI等参数的时候,cvCopy只是复制被设定的区域,复制到一个和所设定参数相吻合的新的IplImage中
而cvCloneImage则是将整个IplImage结构复制到新的IplImage中,其中的ROI等参数也会一同复制。新的IplImage将会和原来的一模一样。
ref:
http://blog.csdn.net/jianguo_cui/article/details/7387169
下面對Mat矩陣進行一些說明:
1. cv::Mat中的數據不需要釋放.cv::Mat會自動釋放.
例如,cv::Mat m=cv::imread("123.jpg"); 然後進行數據操作,最後根本不用對m進行釋放,也不需要調用其他的任何release函數.
2. cv::Mat的depth()函數可以得到圖像的深度,值類似于CV_8U.CV_16F等..可以理解為單個channel中的單個元素的大小(bit)與類型.8U表示8-bit unsigned char.
3. cv::Mat的cols表示圖像的width,rows表示圖像的height.
4. cv::Mat在取底層數據的時候使用at函數,類似于src.at<cv::Point3i>(i,j)[0]的方式,取出第i行第j列的像素的第0個channel的值.尖括號中的類型為Mat元素的類型.例如單channel的8U圖像可以使用unsigned char型,由於是單channel就不要後面的中括號了.3channel的BGR圖像可以使用cv::Point3i的格式.
5. cv::Mat的類型是由深度和channel數一起決定的,類似于CV_8UC3,表示深度為CV_8U,channel數為CV_C1.可以使用CV_MAKETYPE(depth,cn) 宏來合成類型值.
6. cv::Mat 默認情況下是不進行數據拷貝的,只是生成一個Mat頭信息,所以就導致如果兩個Mat指向同一個數據的時候,其中一個進行了變更,另一個也會變更.如果要進行實際數據的拷貝可以使用下面的2中方式:
cv::Mat m1=cv::imread("123.jpg");
cv::Mat m2=m1; //沒有數據拷貝
cv::Mat m3=m2.clone();//有數據拷貝
cv::Mat m4;
m2.copyTo(m4); //有數據拷貝
7. 當多個cv::Mat 指向同一組數據的時候,只有所有的Mat都釋放之後實際數據才會釋放,否則只是進行計數累加. 當其中一個Mat調用Relese函數后,只是釋放當前Mat的頭信息,如果此時還有其他Mat在使用這些實際數據,則這些實際數據并不釋放.也就是說cv::Mat.Relese()只是減少一個引用計數,并清空Mat頭,其他無影響.
Mat rowRange(int startrow, int endrow) const; 使用第startrow行到第endrow行的數據新建一個Mat,不進行數據拷貝.
Mat rowRange(const Range& r) const; 使用Range 中的行的數據新建一個Mat,不進行數據拷貝.
Mat colRange(int startcol, int endcol) const;使用第startcol列到第endcol列的數據新建一個Mat,不進行數據拷貝.
Mat colRange(const Range& r) const; 使用Range 中的列的數據新建一個Mat,不進行數據拷貝.
void copyTo( OutputArray m, InputArray mask ) const; 功能同 copyTo( OutputArray m ) ,只是只會拷貝mask中對應不是0的值.mask與源Mat要有相同的size. m在被拷貝之前會用0填充.
留言列表