2016-09-17 52 views
2

我對令人困惑的標題感到抱歉。基本上我想使用鼠標光標在應用色彩映射之前顯示圖像的像素值。可能嗎?我知道怎麼弄的(X,Y)從here 這裏的座標是我的代碼:Opencv C++:在應用色彩地圖之前使用圖像的光標顯示像素值

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的像素值?謝謝你的幫助!

回答

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'; 
} 
    } 
+0

非常感謝MD。 Nazmul Kibria爲您提供幫助。它解決了我的問題!你能解釋一下onMouse如何攜帶矩陣framesMap而不是framesMat本身? (如果我們省略framesMap = frameMat.clone();命令)。 – Sofia

+1

謝謝。 framesMap和frameMat都相同。但區別在於全球範圍內和其他地區範圍內。全局範圍變量對其他函數是已知的,這就是爲什麼onMouse函數可以訪問它。是的,您可以省略克隆命令,在這種情況下,您已經將framsMat作爲onMouse函數的參數傳遞。 –

相關問題