OpenCV 找出图像中最小值最大值函数minMaxLoc的使用
功能:從一個(gè)矩陣中找出全局的最大值和最小值。
函數(shù)cv::minMaxLoc找出最大和最小元素的值和他們的位置。極值是遍歷整個(gè)矩陣找到,或者當(dāng)掩碼不是一個(gè)空矩陣時(shí),是通過遍歷指定矩陣區(qū)域找到。
函數(shù)不適用于多通道矩陣,如果需要遍歷所有的通道來找到最大和最小值,首先使用函數(shù)Mat::reshape轉(zhuǎn)換為單通道矩陣。或者你可以使用函數(shù) extractImageCOI ,mixChannels , or split 來提取特定通道。
函數(shù)原型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());
參數(shù)說明:
參數(shù)1 src 輸入單通道矩陣.
參數(shù)1 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數(shù) maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數(shù) minLoc 返回最小值位置的指針 (二維情況下); 如果不需要輸入NULL.
參數(shù) maxLoc 返回最大值位置的指針 (二維情況下); 如果不需要輸入NULL.
參數(shù) mask 可選參數(shù),用于選擇一個(gè)子矩陣.
參考 max, min, compare, inRange, extractImageCOI, mixChannels, split, Mat::reshape
函數(shù)原型2:
1 CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0, 2 int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray());
參數(shù)說明:
參數(shù)1 src 輸入單通道矩陣.
參數(shù)1 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數(shù) maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數(shù) minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個(gè)矩陣, 每個(gè)維度里最小元素的坐標(biāo)按順序存儲(chǔ).
參數(shù) maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.
參數(shù) mask 指定矩陣區(qū)域.
注意:
在稀疏矩陣中,最小值是只能在非零元素中找到。
當(dāng)minIdx 不是NULL的時(shí)候,他必須有至少兩個(gè)元素(同maxIdx),即使src是一個(gè)單行或者單列矩陣。在OpenCV (跟隨MATLAB)中每個(gè)矩陣至少要有兩個(gè)維度。單列矩陣是Mx1 矩陣(因此 minIdx/maxIdx將是(i1,0)/(i2,0)),單行矩陣是 1xN矩陣(因此minIdx/maxIdx 將是(0,j1)/(0,j2))。
函數(shù)原型3:
1 CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal, 2 double* maxVal, int* minIdx = 0, int* maxIdx = 0);
參數(shù)說明:
參數(shù)1 a 輸入單通道矩陣.
參數(shù)2 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數(shù)3 maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數(shù)4 minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個(gè)矩陣, 每個(gè)維度里最小元素的坐標(biāo)按順序存儲(chǔ).
參數(shù)5 maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.
代碼示例:
1 #include <iostream>
2 #include <opencv2/opencv.hpp>
3 ?
4 int main()
5 {
6 // std::cout << "Hello World!
";
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; // 最小值坐標(biāo),最大值坐標(biāo)
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 }
運(yùn)行結(jié)果如下
Mat類的函數(shù)reshape
功能:不用拷貝數(shù)據(jù)轉(zhuǎn)換一個(gè)2維矩陣的形狀或通道的個(gè)數(shù)
函數(shù)為這些元素制造了一個(gè)新的矩陣頭,新的矩陣可能會(huì)有不同的大小或不同的通道數(shù),如果滿足下面條件任何組合都有可能:
沒有額外的元素被包含進(jìn)去新矩陣,也沒有元素被排除。所以結(jié)果的行數(shù)、列數(shù)、通道數(shù)必須在轉(zhuǎn)換后保持不變。
沒有數(shù)據(jù)拷貝,也就是說這是個(gè) O(1)操作。因此,如果你改變了行的個(gè)數(shù),或者操作以其他方式改變了元素行的指數(shù),矩陣必須是連續(xù)的,參考:Mat::isContinuous
例如:假如有一些3維的點(diǎn)的集合存儲(chǔ)在一個(gè)STL vector中,你想用一個(gè)3xN矩陣表示這些點(diǎn),按下面這樣做:
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
函數(shù)原型1:
Mat reshape(int cn, int rows=0) const;
參數(shù)說明:
參數(shù)1 cn 新通道數(shù).如果參數(shù)是0,通道數(shù)保持不變.
參數(shù)2 rows 新通道行數(shù). 如果參數(shù)是0,行數(shù)保持不變.
函數(shù)原型2:
Mat reshape(int cn, int newndims, const int* newsz) const;
函數(shù)原型3:
Mat reshape(int cn, const std::vector<int>& newshape) const;
總結(jié)
以上是生活随笔為你收集整理的OpenCV 找出图像中最小值最大值函数minMaxLoc的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印出系统所有即未被assign到bus
- 下一篇: 批量修改product descript