Je travaille sur un projet de jeu utilisant OpenCV. Maintenant, je dois faire une interface graphique simple: une fenêtre avec un bouton, en utilisant uniquement HighGui.
Je ne suis pas sûr mais je pense que je suis supposé utiliser quelque chose comme ceci:
cvNamedWindow( "NameWindow" , CV_WINDOW_AUTOSIZE);
Toute aide est très appréciée.
OpenCV ne fournit pas de bouton , mais vous pouvez facilement utiliser un rectangle coloré et vérifier si le point cliqué sur l’image se trouve à l’intérieur de ce rectangle.
Rappelez-vous que OpenCV HighGui est très simple et n’est destiné qu’à des fins de débogage. Vous voudrez peut-être utiliser une bibliothèque graphique complète comme Qt ou similaire.
Cependant, ceci est un petit exemple qui montre une image (verte) et un bouton en haut:
Cliquez sur le bouton pour imprimer “Cliqué” sur la sortie standard:
Code:
#include #include using namespace cv; using namespace std; Mat3b canvas; ssortingng buttonText("Click me!"); ssortingng winName = "My cool GUI v0.1"; Rect button; void callBackFunc(int event, int x, int y, int flags, void* userdata) { if (event == EVENT_LBUTTONDOWN) { if (button.contains(Point(x, y))) { cout << "Clicked!" << endl; rectangle(canvas(button), button, Scalar(0,0,255), 2); } } if (event == EVENT_LBUTTONUP) { rectangle(canvas, button, Scalar(200, 200, 200), 2); } imshow(winName, canvas); waitKey(1); } int main() { // An image Mat3b img(300, 300, Vec3b(0, 255, 0)); // Your button button = Rect(0,0,img.cols, 50); // The canvas canvas = Mat3b(img.rows + button.height, img.cols, Vec3b(0,0,0)); // Draw the button canvas(button) = Vec3b(200,200,200); putText(canvas(button), buttonText, Point(button.width*0.35, button.height*0.7), FONT_HERSHEY_PLAIN, 1, Scalar(0,0,0)); // Draw the image img.copyTo(canvas(Rect(0, button.height, img.cols, img.rows))); // Setup callback function namedWindow(winName); setMouseCallback(winName, callBackFunc); imshow(winName, canvas); waitKey(); return 0; }
vous êtes conscient que openCV n’est pas une bibliothèque graphique, mais une bibliothèque de traitement d’image?
il est livré avec highgui: http://docs.opencv.org/2.4/modules/highgui/doc/highgui.html
pour les cas où vous n’avez pas vraiment d’autres options, mais que vous devez créer une fenêtre pour afficher des éléments.
Alors que OpenCV a été conçu pour être utilisé dans des applications à grande échelle et peut être utilisé dans des frameworks d’interface utilisateur riches en fonctionnalités (tels que Qt *, WinForms * ou Cocoa *) ou sans aucune interface utilisateur, il est parfois nécessaire d’essayer les fonctionnalités rapidement et efficacement. visualiser les résultats. C’est pour cela que le module HighGUI a été conçu.
voir OpenCV et créer des interfaces graphiques
edit: “cela ne répond pas à la question”: -> plus d’aide ..
vous ne pouvez pas.
ou si vous connaissez votre gestionnaire de fenêtres sous-jacent, vous le pouvez. c’est-à-dire que si vous êtes sur Windows, vous pouvez obtenir le handle de fenêtre et append dynamicment plus de contrôles .. sinon, vous devez savoir sur quelle plate-forme vous vous trouvez et comment le faire.
Je n’oserais pas essayer de mettre cela dans une réponse simple
@Miki, pourquoi je ne peux pas utiliser mes boutons en alternance? Comment le réparer? Je veux dire que je veux les utiliser en même temps.
EDIT: Je l’ai réparé moi-même. Pas besoin d’aide. 🙂
#include #include using namespace cv; using namespace std; Mat3b canvas; ssortingng buttonText("Nacisnij guzik!"); ssortingng buttonText2("Nacisnij guzik NR2!"); ssortingng winName = "PokerGui"; int a = 0;//mozna pozniej usunac, potrzebne tylko czy button reaguje jak nalezy Rect button, button2; void callBackFunc(int event, int x, int y, int flags, void* userdata) { if (event == EVENT_LBUTTONDOWN) { if (button.contains(Point(x, y)))//ponizej to co ma sie wykonac po nacisnieciu klawisza { a = a + 7; cout << "Nacisnales guzik!\n" << endl; printf("liczba = %i\n", a); rectangle(canvas(button), button, Scalar(0, 0, 255), 2); } else if (button2.contains(Point(x, y)))//ponizej to co ma sie wykonac po nacisnieciu klawisza { //a = a + 7; cout << "Nacisnales guzik NR2!\n" << endl; //printf("liczba = %i\n", a); rectangle(canvas(button2), button, Scalar(0, 0, 255), 2); } } //if (event == EVENT_LBUTTONUP) //{ //rectangle(canvas, button, Scalar(200, 200, 200), 2); //} imshow(winName, canvas); waitKey(1); } void callBackFunc2(int event, int x, int y, int flags, void* userdata) { if (event == EVENT_LBUTTONDOWN) { if (button2.contains(Point(x, y)))//ponizej to co ma sie wykonac po nacisnieciu klawisza { //a = a + 7; cout << "Nacisnales guzik NR2!\n" << endl; //printf("liczba = %i\n", a); rectangle(canvas(button2), button, Scalar(0, 0, 255), 2); } } //if (event == EVENT_LBUTTONUP) //{ //rectangle(canvas, button, Scalar(200, 200, 200), 2); //} imshow(winName, canvas); waitKey(1); } int main() { // An image Mat3b img(300, 300, Vec3b(0, 255, 0)); // Your button button = Rect(0, 0, img.cols, 50); button2 = Rect(0, 60, img.cols, 50); // The canvas canvas = Mat3b(img.rows + button.height, img.cols, Vec3b(0, 0, 0)); // Draw the button canvas(button) = Vec3b(200, 200, 200); canvas(button2) = Vec3b(200, 200, 200); putText(canvas(button), buttonText, Point(button.width*0.35, button.height*0.7), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 0)); putText(canvas(button2), buttonText2, Point(button.width*0.25, button.height*0.7), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 0)); // Draw the image //img.copyTo(canvas(Rect(0, button.height, img.cols, img.rows))); // Setup callback function namedWindow(winName); setMouseCallback(winName, callBackFunc); //setMouseCallback(winName, callBackFunc2); imshow(winName, canvas); waitKey(); return 0; }