opencv中圖像的格式Mat 有圖像的定義,圖像深度、類型格式等,其中Mat的參數depth為深度,深度反應出圖像顏色像素值;
關於數據的儲存:(轉)
Mat_<uchar>對應的是CV_8U,Mat_<char>對應的是CV_8S,Mat_<int>對應的是CV_32S,Mat_<float>對應的是CV_32F,Mat_<double>對應的是CV_64F,對應的數據深度如下:
• CV_8U - 8-bit unsigned integers ( 0..255 )
• CV_8S - 8-bit signed integers ( -128..127 )
• CV_16U - 16-bit unsigned integers ( 0..65535 )
• CV_16S - 16-bit signed integers ( -32768..32767 )
• CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
• CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
• CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
說到圖像像素,肯定要先認識一下圖像中的坐標系長什么樣。
1. 坐標體系中的零點坐標為圖片的左上角,X軸為圖像矩形的上面那條水平線;Y軸為圖像矩形左邊的那條垂直線。該坐標體系在諸如結構體Mat,Rect,Point中都是適用的。(OpenCV中有些數據結構的坐標原點是在圖片的左下角,可以設置的)。
2. 在使用image.at<TP>(x1, x2)來訪問圖像中點的值的時候,x1並不是圖片中對應點的x軸坐標,而是圖片中對應點的y坐標(也就是編程中的pic.rows那行)。x2同理。
3. 如果所畫圖像是多通道的,比如說image圖像的通道數時n,則使用Mat::at(x, y)時,其x的范圍依舊是0到image的height,而y的取值范圍則是0到image的width乘以n,因為這個時候是有n個通道,所以每個像素需要占有n列。但是如果在同樣的情況下,使用Mat::at(point)來訪問的話,則這時候可以不用考慮通道的個數,因為你要賦值給獲取Mat::at(point)的值時,都不是一個數字,而是一個對應的n維向量。
4. 多通道圖像在使用minMaxLoc()函數時不能給出其最大最小值坐標的,因為每個像素點其實有多個坐標,所以是不會給出的。因此在編程時,這2個位置應該給NULL。
5 多通道的圖像可以直接賦值,不必每個通道賦值。但是要注意其類型是Vec3b,如果寫成uchar,最后的copy圖像只會顯示源圖像的1/3