Я использовал функцию cv::minMaxLoc() OpenCV в своем коде. Но из-за некоторых ограничений на устройстве я не могу вызвать его из OpenCV и мне приходится реализовывать его самому с нуля. Но это работает не так, как ожидалось.
Как реализовать функцию точно так же, как в openCV? Моя матрица — CV_32F, а значения двойные. Вот как я звонил через OpenCV:
cv::Mat output = cv::Mat(6, 1000, CV_32F, array.data());
cv::Mat classes_scores = output.col(i).rowRange(4, output.rows);
//....
double minScore, maxScore;
cv::Point minClassLoc, maxClassLoc;
cv::minMaxLoc(classes_scores, &minScore, &maxScore, &minClassLoc, &maxClassLoc);
И моя реализация вручную:
void minMaxLoc(cv::Mat& input, double* minVal, double* maxVal, cv::Point* minLoc, cv::Point* maxLoc) {
int rows = input.rows;
int cols = input.cols;
int minRow = 0, minCol = 0, maxRow = 0, maxCol = 0;
double minValue = input.at(0, 0);
double maxValue = input.at(0, 0);
for (int row = 0; row < rows; ++row) {
const double* rowData = input.ptr(row);
for (int col = 0; col < cols; ++col) {
double value = rowData[col];
if (value < minValue) {
minValue = value;
minRow = row;
minCol = col;
}
if (value > maxValue) {
maxValue = value;
maxRow = row;
maxCol = col;
}
}
}
*minVal = minValue;
*maxVal = maxValue;
*minLoc = cv::Point(minCol, minRow);
*maxLoc = cv::Point(maxCol, maxRow);
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... c-function