Получение максимального значения пикселя в изображении в градациях серого в 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: Я знаю, что есть похожий вопрос. Но это конкретная проблема.


person Vito Valov    schedule 11.01.2013    source источник
comment
каждый раз, когда вы печатаете значения серых изображений, выполняйте приведение int..cout‹‹(int)image.at‹uchar›(x,y) или cout‹‹(int)*ptr2pixel...   -  person rotating_image    schedule 11.01.2013
comment
Спасибо, кажется, это решает проблему. (int) приведение помогло   -  person Vito Valov    schedule 11.01.2013
comment
Однако в соответствии с этим я получаю этот вывод: X........ 625 Y ...... 431 = 28, что является максимальным значением. Но если я проверю это изображение вручную, высокий уровень серого будет в центре. И центр 640х480 не то...   -  person Vito Valov    schedule 11.01.2013
comment
может быть, я ошибаюсь с copyTo?   -  person Vito Valov    schedule 11.01.2013
comment
Кажется, когда я комментирую некоторые imshow, ошибка сегментации возникает при доступе через at(). Если я оставлю imshow и waitKey, у меня будут некоторые результаты. Что-то не так со ссылками, я думаю   -  person Vito Valov    schedule 11.01.2013


Ответы (3)


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

    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;
                }
            }
        }
    }
person Vito Valov    schedule 03.07.2013

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

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

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

person Boyko Perfanov    schedule 13.01.2013

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

cout << "X........"
     << x
     << " Y......"
     << y
     << " = "
     << (double) crop.at< unsigned char>(x,y) <<endl;
person Rômulo Bourget Novas    schedule 13.05.2013