功能:從一個矩陣中找出全局的最大值和最小值。
函數cv::minMaxLoc找出最大和最小元素的值和他們的位置。極值是遍歷整個矩陣找到,或者當掩碼不是一個空矩陣時,是通過遍歷指定矩陣區域找到。
函數不適用於多通道矩陣,如果需要遍歷所有的通道來找到最大和最小值,首先使用函數Mat::reshape轉換為單通道矩陣。或者你可以使用函數 extractImageCOI ,mixChannels , or split 來提取特定通道。
函數原型1:
1 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal, 2 CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0, 3 CV_OUT Point* maxLoc = 0, InputArray mask = noArray());
參數說明:
參數1 src 輸入單通道矩陣.
參數1 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數 maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數 minLoc 返回最小值位置的指針 (二維情況下); 如果不需要輸入NULL.
參數 maxLoc 返回最大值位置的指針 (二維情況下); 如果不需要輸入NULL.
參數 mask 可選參數,用於選擇一個子矩陣.
參考 max, min, compare, inRange, extractImageCOI, mixChannels, split, Mat::reshape
函數原型2:
1 CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0, 2 int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray());
參數說明:
參數1 src 輸入單通道矩陣.
參數1 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數 maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數 minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個矩陣, 每個維度里最小元素的坐標按順序存儲.
參數 maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.
參數 mask 指定矩陣區域.
注意:
在稀疏矩陣中,最小值是只能在非零元素中找到。
當minIdx 不是NULL的時候,他必須有至少兩個元素(同maxIdx),即使src是一個單行或者單列矩陣。在OpenCV (跟隨MATLAB)中每個矩陣至少要有兩個維度。單列矩陣是Mx1 矩陣(因此 minIdx/maxIdx將是(i1,0)/(i2,0)),單行矩陣是 1xN矩陣(因此minIdx/maxIdx 將是(0,j1)/(0,j2))。
函數原型3:
1 CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal, 2 double* maxVal, int* minIdx = 0, int* maxIdx = 0);
參數說明:
參數1 a 輸入單通道矩陣.
參數2 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數3 maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數4 minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個矩陣, 每個維度里最小元素的坐標按順序存儲.
參數5 maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.
代碼示例:
1 #include <iostream>
2 #include <opencv2/opencv.hpp>
3 4 int main() 5 { 6 // std::cout << "Hello World!\n";
7 cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png"); 8 cv::Mat image_re = image.reshape(1); 9 double minValue, maxValue; // 最大值,最小值
10 cv::Point minIdx, maxIdx; // 最小值坐標,最大值坐標
11 cv::minMaxLoc(image_re, &minValue, &maxValue, &minIdx, &maxIdx); 12 std::cout << "最大值:" << maxValue <<"最小值:"<<minValue<<std::endl; 13 std::cout << "最大值位置:" << maxIdx << "最小值位置:" << minIdx; 14
15 cv::waitKey(0); 16 17 }
運行結果如下
Mat類的函數reshape
功能:不用拷貝數據轉換一個2維矩陣的形狀或通道的個數
函數為這些元素制造了一個新的矩陣頭,新的矩陣可能會有不同的大小或不同的通道數,如果滿足下面條件任何組合都有可能:
沒有額外的元素被包含進去新矩陣,也沒有元素被排除。所以結果的行數、列數、通道數必須在轉換后保持不變。
沒有數據拷貝,也就是說這是個 O(1)操作。因此,如果你改變了行的個數,或者操作以其他方式改變了元素行的指數,矩陣必須是連續的,參考:Mat::isContinuous
例如:假如有一些3維的點的集合存儲在一個STL vector中,你想用一個3xN矩陣表示這些點,按下面這樣做:
1 td::vector<Point3f> vec; 2 ... 3 Mat pointMat = Mat(vec). // convrt vector to Mat, O(1) operation
4 reshape(1). // make Nx3 1-channel matrix out of Nx1 3-channel. 5 // Also, an O(1) operation
6 t(); // finally, transpose the Nx3 matrix. 7 // This involves copying all the elements
函數原型1:
Mat reshape(int cn, int rows=0) const;
-
參數說明:
-
參數1 cn 新通道數.如果參數是0,通道數保持不變.
-
參數2 rows 新通道行數. 如果參數是0,行數保持不變.
函數原型2:
Mat reshape(int cn, int newndims, const int* newsz) const;
函數原型3:
Mat reshape(int cn, const std::vector<int>& newshape) const;