OpenCV cv::Mat.type() 以及各類型數據轉換


一、cv::Mat的類型有30種,預定義的enum 0-30分別如下

圖轉自http://blog.csdn.net/hyqsong/article/details/46367765

二、type由depth和channel組成,depth   由.depth()返回的enum有以下這些

enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };

例如CV_8U代表8位unsigned int , CV_16S代表16位short

 

.channels()返回結果是幾就代表是幾通道的

 

三、src.convertTo(dst, CV_8UC1)這個函數,只能進行depth的轉換,不能轉換通道。

例如src是CV_8UC3,執行上面這個函數之后的dst,依然是CV_8UC3,而不會變為CV_8UC1,注意,此時僅為數據截斷。

CV_16U->CV_8U dst.convertTo(src, CV_8U, 1/257.0) ,這里使用257而不是256是為了結果<=255保障不越界

如果是32F或64F轉換,則

double maxVal = 0;
double minVal = 0;
cv::minMaxLoc(image_mat, &minVal, &maxVal);
scale = 255.0 / (maxVal - minVal);
shift = -255.0*minVal / (maxVal - minVal);
image_mat.convertTo(image_mat, CV_8U, scale, shift);

先使用minMaxLoc獲取最大最小值,然后按比例縮放偏移

四、要改變通道數,要使用 cv::cvtColor(src, dst, COLOR_BGR2GRAY);   3通道就轉化成了單通道

Mat_<uchar>---------CV_8U
Mat<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F

Mat_<double>--------CV_64F

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM