Opencv C++: отображать значение пикселя с помощью курсора изображения перед применением карты цветов

Мои извинения за запутанный заголовок. В основном я хочу использовать курсор мыши для отображения значения пикселя изображения перед применением цветовой карты. Является ли это возможным? Я знаю, как получить координаты (x, y) из здесь Вот мой код:

cv::Mat falseColorsMap;
void onMouse( int event, int x, int y, int, void* );
void showImage( cv::Mat frameMat){
    double min;
    double max;
    cv::minMaxLoc(frameMat, &min, &max);
    std::cout << min << "," << max << "\n";

    cv::Mat adjMap;
    frameMat.convertTo(adjMap,CV_8UC1, 255 / (max-min), -min); // expand your range to 0..255. Similar to histEq();
    applyColorMap(adjMap, falseColorsMap, cv::COLORMAP_JET);


    namedWindow( "Out", CV_WINDOW_NORMAL );// Create a window for display.
    resizeWindow("Out", 800, 600);
    setMouseCallback( "Out", onMouse, 0 );
    cv::imshow("Out", falseColorsMap);
    waitKey(0);
}

// Function onMouse displays cursor values
void onMouse( int event, int x, int y, int, void* )
{
    if ( event != CV_EVENT_LBUTTONDOWN )
        return;

    Point pt = Point(x,y);
    std::cout<<"("<<pt.x<<", "<<pt.y<<") ...... "<<(falseColorsMap.at<int>(y,x)) << '\n';
}

Как получить значение пикселя frameMat при использовании курсора мыши? Спасибо за вашу помощь!


person hlambert24    schedule 17.09.2016    source источник


Ответы (1)


См. приведенные ниже изменения, чтобы показать исходные значения пикселей кадров перед преобразованием цветовой карты. Здесь добавлено условие на основе цветового канала. Если это трехканальное (BGR) изображение, оно покажет значение пикселя для 3 каналов, а если это одноканальное изображение, оно также покажет значение пикселя:

    cv::Mat falseColorsMap;
    cv::Mat framesMap;
    void onMouse( int event, int x, int y, int, void* );
    void showImage( cv::Mat frameMat){
        double min;
        double max;
        cv::minMaxLoc(frameMat, &min, &max);
        std::cout << min << "," << max << "\n";

        framesMap = frameMat.clone();
        cv::Mat adjMap;
        frameMat.convertTo(adjMap,CV_8UC1, 255 / (max-min), -min); // expand your range to 0..255. Similar to histEq();
        applyColorMap(adjMap, falseColorsMap, cv::COLORMAP_JET);


        namedWindow( "Out", CV_WINDOW_NORMAL );// Create a window for display.
        resizeWindow("Out", 800, 600);
        setMouseCallback( "Out", onMouse, 0 );
        cv::imshow("Out", falseColorsMap);
        waitKey(0);
    }

    // Function onMouse displays cursor values
    void onMouse( int event, int x, int y, int, void* )
    {
        if ( event != CV_EVENT_LBUTTONDOWN )
            return;

        Point pt = Point(x,y);

if(framesMap.channels()==3)
{
        std::cout<<"("<<pt.x<<", "<<pt.y<<") ...... [blue] "<<framesMap.at<Vec3b>(y,x)[0] << " [green] "<<framesMap.at<Vec3b>(y,x)[1] << " [red] "<<framesMap.at<Vec3b>(y,x)[2]<<'\n';
}
else
{
    std::cout<<"("<<pt.x<<", "<<pt.y<<") ......  "<<framesMap.at<uchar>(y,x) <<'\n';
}
    }
person MD. Nazmul Kibria    schedule 18.09.2016
comment
Большое спасибо МД. Nazmul Kibria за вашу помощь. Это решает мою проблему! Не могли бы вы объяснить, как onMouse переносит матрицу frameworksMap, но не сам frameMat? (если мы опустим команду frameworkMap = frameMat.clone();). - person hlambert24; 20.09.2016
comment
Спасибо. frameMap и frameMat одинаковы. Но разница в том, что один находится в глобальной области, а другой - в локальной. Глобальная переменная области известна другим функциям, поэтому функция onMouse может получить к ней доступ. Да, вы можете опустить команду клонирования, в этом случае вы передадите framsMat в качестве параметра функции onMouse. - person MD. Nazmul Kibria; 21.09.2016