Como fazer uma janela simples com um botão usando apenas o OpenCV HighGui?

Estou a trabalhar num projecto de jogo com o OpenCV. Agora eu tenho que fazer uma interface gráfica simples: uma janela com um botão, usando apenas HighGui.

Não tenho a certeza,mas acho que devo usar algo assim.
cvNamedWindow( "NameWindow" , CV_WINDOW_AUTOSIZE);
Qualquer ajuda é muito apreciada.

Author: Miki, 2015-11-26

3 answers

O OpenCV não oferece um botão , mas você pode usar facilmente um rectângulo colorido, e verificar se o ponto clicado na imagem está dentro deste rectângulo.

Lembre-se que o OpenCV HighGui é muito simples e destina-se apenas a depuração. Você pode querer usar uma biblioteca gráfica completa como Qt, ou similar.

No entanto, este é um pequeno exemplo que mostra uma imagem (verde), e um botão no topo:

enter image description here

Se carregar no botão, irá imprimir "Clicked" no stdout:

enter image description here

Código:

#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;


Mat3b canvas;
string buttonText("Click me!");
string 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;
}
 12
Author: Miki, 2015-11-26 12:27:18

Está ciente de que o openCV não é uma biblioteca GUI, mas uma lib de processamento de imagens?

Ele navega com highgui: http://docs.opencv.org/2.4/modules/highgui/doc/highgui.html

Para os casos em que você realmente não tem outras opções, mas precisa criar uma janela para mostrar coisas.

Embora o OpenCV tenha sido concebido para ser utilizado em aplicações em grande escala e possa ser utilizado dentro de quadros UI funcionalmente ricos (tais como Qt*, WinForms*, ou cacau*) ou sem qualquer IU de todo, às vezes é necessário tentar a funcionalidade rapidamente e visualizar os resultados. É para isso que o módulo HighGUI foi projetado.

Ver OpenCV e criar GUIs

Edite: "isto não responde à pergunta": -> mais ajuda..

Não podes..

Ou seja, se conhece o seu gestor de janelas subjacente, pode. isto é, se você estiver no windows, você pode obter o manípulo da janela, e dinamicamente adicionar mais controles.. se não, você precisa saber em que plataforma você está, e como fazê-lo nisso. Não me atreveria a tentar colocar isto numa resposta simples.
 0
Author: Henrik, 2017-05-23 12:02:27
@Miki, porque não posso usar os meus botões alternadamente? Como resolvê-lo? Quero usá-los ao mesmo tempo.

EDIT: eu próprio o consertei. Não preciso de Ajuda. :)

#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;


Mat3b canvas;
string buttonText("Nacisnij guzik!");
string buttonText2("Nacisnij guzik NR2!");
string 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;
}
 0
Author: Koci Ogon, 2015-11-30 20:56:07