如何在OpenCV中获取n维数组的最大值

4

我正在尝试从一个三维Mat中获取最大值,但是minmaxIdx和mixmaxloc都无法实现这一点。

int sz[] = {BIN, BIN, BIN};
Mat accumarray(3, sz, CV_8U, Scalar::all(0)) ;
double testMaxval = 0;
int minIdx = accumarray.dims ;
minMaxIdx(accumarray, NULL, &testMaxval,NULL,minIdx ,NULL) ;
cout<<testMaxval<<endl ;

这段代码不能正常工作,那么我是否可以使用max()、minmaxidx()或minmaxloc()来高效地获取最大值,而不需要手动处理整个n维数组?

2个回答

6

以下代码在OpenCV 2.3.1版本中适用:

int sz[] = {3, 3, 3};
Mat accumarray(3, sz, CV_8U, Scalar::all(0));
accumarray.at<uchar>(0, 1, 2) = 20;
double testMaxval;
int maxIdx[3];
minMaxIdx(accumarray, 0, &testMaxval, 0, maxIdx);
cout << testMaxval << endl ;
cout << maxIdx[0] << ", " << maxIdx[1] << ", " << maxIdx[2] << endl;

这个很好用,非常感谢。minIdx 应该与 accumarray 具有相同的维度。 - tomriddle_1234

6

在使用遮罩时,请使用Mat()而不是NULL,否则将违反断言Mask.empty()

Mat m;
double min, max;
int minInd, maxInd;
cv::minMaxIdx(m, &min, &max, &minInd, &maxInd, Mat());

仍然出现错误:在minMaxIdx中,断言失败((cn == 1 && (mask.empty() || mask.type() == CV_8U)) || (cn >= 1 && mask.empty() && !minIdx && !maxIdx))。 - 2vision2
似乎您的cn>=1,请先检查minIdx和maxIdx是否不为空。 - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接