2016-09-17 2 views
2

Mes excuses pour le titre prêtant à confusion. Fondamentalement, je veux utiliser le curseur de la souris pour afficher la valeur de pixel de l'image avant d'appliquer la palette de couleurs. C'est possible? Je sais comment obtenir le (x, y) les coordonnées de here Voici mon code:Opencv C++: Affiche la valeur de pixel en utilisant le curseur de l'image avant d'appliquer la palette de couleurs

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

Comment obtenir une valeur de pixel de frameMat lorsque vous utilisez le curseur de la souris? Merci de votre aide!

Répondre

1

Veuillez voir les changements ci-dessous pour afficher les valeurs de pixels des cadres d'origine avant les conversions de la carte en couleur. Ici, la condition basée sur le canal de couleur est ajoutée. S'il s'agit d'une image à trois canaux (BGR), il affichera une valeur de pixel de 3 canaux et s'il s'agit d'une image à canal unique, il affichera également la valeur de pixel:

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

Merci beaucoup MD. Nazmul Kibria pour votre aide. Cela résout mon problème! Pouvez-vous expliquer comment onMouse porte la matrice framesMap mais pas la framesMat elle-même? (si on omet la commande framesMap = frameMat.clone();). – Sofia

+1

Merci. framesMap & frameMat les deux sont identiques. Mais la différence est l'un est dans la portée mondiale et l'autre est dans la portée locale. Une variable de portée globale est connue des autres fonctions et c'est pourquoi la fonction onMouse peut y accéder. Oui, vous pouvez omettre la commande clone, dans ce cas, vous avez passé le paramètre framsMat en tant que paramètre de la fonction onMouse. –