- 1. 函式定義
- 2. 示例程式碼
- 3. 掩膜的使用
- 4. 注意事項
- 5. 應用場景
cv::minMaxLoc()
是 OpenCV 庫中用於查詢陣列或影像中最小值和最大值及其位置的函式。
1. 函式定義
void cv::minMaxLoc(
InputArray src,
double* minVal = nullptr,
double* maxVal = nullptr,
Point* minLoc = nullptr,
Point* maxLoc = nullptr,
InputArray mask = noArray()
)
引數:
-
src
: 輸入陣列,可以是單通道或多通道的CV_8U
、CV_32F
或CV_64F
型別的影像或矩陣。 -
minVal
: 指向double
型別變數的指標,用於儲存找到的最小值。如果不需要最小值,可以傳入nullptr
。 -
maxVal
: 指向double
型別變數的指標,用於儲存找到的最大值。如果不需要最大值,可以傳入nullptr
。 -
minLoc
: 指向Point
型別變數的指標,用於儲存最小值的位置(座標)。如果不需要位置,可以傳入nullptr
。 -
maxLoc
: 指向Point
型別變數的指標,用於儲存最大值的位置(座標)。如果不需要位置,可以傳入nullptr
。 -
mask
: 可選的掩膜陣列,型別必須與src
相同。如果提供了掩膜,則函式只會在掩膜非零的區域內查詢最小值和最大值。預設情況下,掩膜為全1,即整個輸入陣列都參與查詢。
返回值:
cv::minMaxLoc()
沒有返回值,結果透過指標引數返回。
2. 示例程式碼
以下是一個使用 cv::minMaxLoc()
函式的示例,展示如何在灰度影像中查詢最小值和最大值及其位置:
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
// 讀取灰度影像
cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
if (img.empty())
{
std::cerr << "無法讀取影像檔案!" << std::endl;
return -1;
}
double minVal, maxVal;
cv::Point minLoc, maxLoc;
// 查詢最小值和最大值及其位置
cv::minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc);
std::cout << "最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")" << std::endl;
std::cout << "最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")" << std::endl;
// 視覺化最小值和最大值的位置
cv::Mat imgColor;
cv::cvtColor(img, imgColor, cv::COLOR_GRAY2BGR);
cv::circle(imgColor, minLoc, 5, cv::Scalar(255, 0, 0), -1); // 藍色標記最小值
cv::circle(imgColor, maxLoc, 5, cv::Scalar(0, 0, 255), -1); // 紅色標記最大值
cv::imshow("MinMaxLoc", imgColor);
cv::waitKey(0);
return 0;
}
示例說明:
-
讀取影像:使用
cv::imread
以灰度模式讀取影像。 -
呼叫
minMaxLoc
:傳入影像,獲取最小值、最大值及其位置。 -
輸出結果:將最小值和最大值及其位置輸出到控制檯。
-
視覺化:在影像上用不同顏色的圓圈標記最小值和最大值的位置,並顯示影像。
3. 掩膜的使用
掩膜允許在指定區域內查詢最小值和最大值。以下示例展示如何在影像的特定區域內查詢最小值和最大值:
// 建立一個與影像大小相同的掩膜,初始為0
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8U);
// 定義掩膜區域,例如一個圓形區域
cv::circle(mask, cv::Point(img.cols / 2, img.rows / 2), 100, cv::Scalar(255), -1);
// 查詢掩膜區域內的最小值和最大值
cv::minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc, mask);
// 輸出結果
std::cout << "掩膜區域內最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")" << std::endl;
std::cout << "掩膜區域內最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")" << std::endl;
示例說明:
-
建立掩膜:建立一個與影像大小相同的單通道掩膜,並在其中繪製一個圓形區域作為有效區域。
-
呼叫
minMaxLoc
:傳入掩膜,只在掩膜為非零的區域內查詢最小值和最大值。 -
輸出結果:輸出掩膜區域內的最小值和最大值及其位置。
4. 注意事項
-
多通道影像:
cv::minMaxLoc()
只處理單通道影像。如果輸入是多通道影像,需要先將其轉換為單通道,例如使用cv::cvtColor
。 -
掩膜型別:掩膜必須是 8 位單通道影像 (
CV_8U
),非零的畫素表示有效區域。 -
效能考慮:對於大尺寸影像或需要頻繁呼叫的場景,可以考慮最佳化掩膜的建立或提前處理影像,以提高效能。
-
精度:最小值和最大值的位置如果存在多個相同的值,
cv::minMaxLoc()
返回第一個找到的位置。
5. 應用場景
-
模板匹配:在模板匹配過程中,可以使用
minMaxLoc()
查詢匹配結果中的最佳匹配位置。 -
影像閾值處理:確定影像的動態範圍,以選擇合適的閾值。
-
特徵檢測:在某些特徵檢測演算法中,需要找到響應值的最大或最小位置。
-
影像分析:分析影像的亮度分佈,識別亮點或暗點。