我使用opencv创建了以下函数来计算图像矩阵中具有最小强度的点。然而,我总是将点0,0作为具有最小强度的点,并且强度值也是荒谬的,如-2142484923。有人可以帮忙吗?
img是输入图像矩阵,minloc以最小强度返回cvPoint。
int min_Loc(Mat img, Point minloc)
{
cvtColor(img, img, CV_RGB2GRAY);
int x1;
int y1;
int x2;
int y2;
x1 = 0;
x2 = img.rows;
y1 = 0;
y2 = img.cols;
int min = std::numeric_limits< int >::max();
int currentval;
for (int j=y1; j<y2; j++)
{
for (int i=x1; i<x2; i++){
currentval = img.at<int>(j,i);
if(currentval < min){
min = std::min<int>( currentval, min );
minloc.x = i;
minloc.y = j;
}
}
}
return min;
}
答案 0 :(得分:1)
你的功能
int min_Loc(Mat img, Point minloc)
不会返回minloc。它返回一个整数,并按值获取Mat和Point。如果你想能够修改minloc的值并在调用min_Loc()之后保持这种值,你应该使用指针或引用作为参数,如:
int min_loc(Mat * img, Point * minloc)
{
...
minloc->x = i;
minloc->y = j;
...
return min;
}
并且对函数的调用将是:
min_loc(&img, &minloc);
这假设你在那次呼叫之前有某个地方:
Mat img = ...;
Point minloc = ...;
更多信息:When to pass by reference and when to pass by pointer in C++?
答案 1 :(得分:1)
请注意,OpenCV使您能够在函数cv::minMaxLoc中找到(单通道)矩阵的最小值和最大值及其位置