【问题标题】:How to make a simple window with one button using OpenCV HighGui only?如何仅使用 OpenCV HighGui 一键制作一个简单的窗口?
【发布时间】:2016-02-29 11:59:48
【问题描述】:

我正在使用 OpenCV 开发一个游戏项目。现在我要做一个简单的 GUI:一个只有一个按钮的窗口,只使用 HighGui。

我不确定,但我认为我应该使用这样的东西:

cvNamedWindow( "NameWindow" , CV_WINDOW_AUTOSIZE);

非常感谢任何帮助。

【问题讨论】:

  • 你在使用 OpenCV 和 Qt 之类的 GUI 库吗?或者您只需要使用 HighGui 吗?我看到你提到“仅 OpenCV”,但“仅 OpenCV”并不仅仅意味着简单的调试。编程语言?
  • 是的,仅使用 HighGui。我只需要一个带有几个按钮的窗口,仅此而已。 :)
  • 编程语言?
  • Miki,你认为可以使用 HighGui 在我的 GUI 中显示我的每个返回值吗?例如......是否可以制作一个按钮,当我按下另一个按钮时可以更改其名称?我希望你明白我的意思。
  • 所以你想创建一个标签(或文本区域),你可以用一些新文本刷新它?是的,你不应该(比如按钮),但你可以做到。

标签: c++ user-interface opencv button window


【解决方案1】:

您现在可以在 OpenCV 窗口上创建按钮和其他有用的工具。下面的页面显示了几个有用的示例。

https://docs.opencv.org/master/dc/d46/group__highgui__qt.html

它的要点是:

#include <opencv2/highgui.hpp>
void myButtonName_callback(int state, void*userData) {
    // do something
    printf("Button pressed\r\n");
}
createButton("myButtonName",myButtonName_callback,NULL,CV_PUSH_BUTTON,1);

【讨论】:

  • 了解python wrapper?
  • 注意:createButton() 需要使用 Qt 支持构建的 OpenCV。
【解决方案2】:

@Miki,为什么我不能交替使用我的按钮?如何解决?我的意思是我想同时使用它们。

编辑:我自己修好了。不需要帮助。 :)

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

【讨论】:

    【解决方案3】:

    OpenCV 没有提供按钮,但是你可以很容易地使用一个彩色矩形,并检查图像上的点击点是否在这个矩形内。

    请记住,OpenCV HighGui 非常简单,仅用于调试目的。您可能希望使用 Qt 等功能齐全的图形库或类似库。

    但是,这是一个小示例,显示了(绿色)图像和顶部的按钮:

    单击按钮将在标准输出上打印“Clicked”:

    代码:

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

    【讨论】:

    • 非常感谢你,三木!!! :) 现在我有一个很好的基础来做我自己的程序。再次感谢!
    【解决方案4】:

    你知道 openCV 不是一个 GUI 库,而是一个图像处理库吗?

    它附带 highgui:http://docs.opencv.org/2.4/modules/highgui/doc/highgui.html

    对于那些您确实没有其他选择,但需要创建一个显示内容的窗口的情况。

    虽然 OpenCV 设计用于全面的应用程序,并且可以在功能丰富的 UI 框架(例如 Qt*、WinForms* 或 Cocoa*)中使用,或者根本不需要任何 UI,但有时需要尝试快速实现功能并可视化结果。这就是 HighGUI 模块的设计目的。

    OpenCV and creating GUIs

    编辑:“这不能回答问题”:-> 更多帮助..

    你不能。

    也就是说,如果您知道底层的窗口管理器,您就可以。 即,如果您在 Windows 上,您可以获得窗口句柄,并动态添加更多控件.. 如果没有,你需要知道你在哪个平台上,以及如何在那个平台上做。

    我不敢尝试把这个放在一个简单的答案中

    【讨论】:

    • 这没有提供问题的答案。
    • ps。我会说使用 winAPI 或其他库会作弊,因为问题明确指出“仅使用 openCV”
    • 检查我的答案,你只能用 HighGui 做一个按钮。是的,不是 cool nicelooking 按钮(您需要 Qt 或类似的工具),但它可以工作。
    • @Miki 虽然这实际上不是一个按钮,而是图像中的一个可点击区域,通过回调,它解决了问题,并且实际上是一个按钮。我喜欢它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2012-07-12
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多