Получение максимального значения пикселей в градациях серого в opencv

После того, как я сделаю некоторые манипуляции с изображением и наложу маску, я получаю то, что хочу. Я могу ясно увидеть результат imshow «обрезать», что в середине изображения есть серые пиксели.
Я пытаюсь получить максимальное значение местоположения пикселя. Я проверил crop.channels (), который возвращает 1.

    Mat mask = drawing2;
drawContours(mask, contours, -1, Scalar(255), CV_FILLED);
Mat dist;
distanceTransform( cannyInv, dist, CV_DIST_L2, 3 );
normalize(dist,dist,0.0,1.0,NORM_MINMAX);
Mat crop;
dist.copyTo(crop, mask);
cout << "max.. "<< *std::max_element(crop.begin<double>(),crop.end<double>()) <<endl;

который возвращает макс. 4.25593e-08

    for(int y = 0; y < crop.rows; y++)
{
for(int x = 0; x < crop.cols; x++)
{
if (crop.at<unsigned char>(x,y) > 0){
cout << "X........"<<x<<" Y......"<<y<< " = "<<crop.at<unsigned char>(x,y) <<endl;
}
}
}

Выход:

X........604 Y......479 = ¿
X........607 Y......479 =
X........610 Y......479 = ¿

Помоги мне, пожалуйста

PD: я знаю, что есть похожий вопрос. Но это конкретная проблема.

0

Решение

Я не уверен, как я решил это. Прошло много времени. Но код, который в настоящее время у меня есть, и он работает так:

    Mat dist=Mat::zeros(480,640, CV_8UC1);;
distanceTransform( cannyInv, dist, CV_DIST_L2, 3 );
Mat distNorm;
dist.convertTo(distNorm, CV_8UC1,1,0);
Mat result= Mat::zeros(480,640, CV_8UC1);
distNorm.copyTo(result, mask);
Mat tmp=Mat::zeros(480,640, CV_8UC1);
Mat fik=Mat::zeros(480,640, CV_8UC3);
for(int i = 0; i < result.rows; i++)
{
for(int j = 0; j < result.cols; j++)
{
if ( result.at< uchar >( i,j ) > 0){
uchar val = result.at< uchar >( i,j  );
if(val>maxVal){
if(val>0){
cv::circle(tmp,cvPoint(j,i),2,255,-1);
}
maxVal=val;
maxX = j;
maxY = i;
}
}
}
}
1

Другие решения

Вы уверены, что нормализация мата автоматически преобразует его из uchar в double? Вполне вероятно, что данные все еще хранятся в виде учаров, и вы читаете из них неправильные числа.

Попробуйте dist.convertTo (dist, CV_64F);
Распечатайте числа как двойные везде

ИЛИ работать только с учарами.

0

Попробуйте этот код:

cout << "X........"<< x
<< " Y......"<< y
<< " = "<< (double) crop.at< unsigned char>(x,y) <<endl;
0
По вопросам рекламы [email protected]