【OpenCV】笔记(4) ——自带UI显示

建议先配置OpenCV的Release,运行时将调试从Debug改成 Release,否则可能出错。

代码

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>


#include <iostream>
using namespace std;
using namespace cv;

//全局定义和变量
Mat orig_img, temp_img;
const char main_win[] = "main_win";
char msg[50] = { 0 };

//回调函数声明
void cbMouse(int event, int x, int y, int flags, void*);
void tb1_Callback(int value,void *);
void tb2_Callback(int value,void *);
void checkboxCallback(int state, void *);
void radioboxCallback(int state, void *id);
void pushbuttonCallback(int, void *font);

int main(int, char* argv[])
{
    const char track1[] = "Trackbar 1";
    const char track2[] = "Trackbar 2";
    const char checkbox[] = "Check Box";
    const char radiobox1[] = "Radio Box1";
    const char radiobox2[] = "Radio Box2";
    const char pushbutton[] = "Push Button";

    int tb1_value = 50;//trackbar1 的初始值
    int tb2_value = 25;//trackbar2 的初始值

    orig_img = imread("peppers.png");//打开并读取图像
    //orig_img = imread(argv[1]);

    if (orig_img.empty())
    {
        cout << "出现错误,图像无法打开!" << endl;
        return -1;
    }
    namedWindow(main_win);
    //为添加到图像中的文本创建字体
    //QtFont font = fontQt("Arial", 20, Scalar(255, 0, 0,0), QT_FONT_BLACK, QT_STYLE_NORMAL);
    //QtFont font = fontQt("Arial", 20, Scalar(255, 0, 0, 0), QT_FONT_BLACK, QT_STYLE_NORMAL,0);
    //回调函数的创建
    setMouseCallback(main_win, cbMouse, NULL);
    createTrackbar(track1, main_win, &tb1_value, 100,tb1_Callback);
    //createButton(checkbox, checkboxCallback, 0, QT_CHECKBOX);

    //将值font传递给Callback
    //createButton(pushbutton, pushbuttonCallback, (void*)&font, QT_PUSH_BUTTON);

    //cvCreateTrackbar(track2, NULL, &tb2_value, 50, tb2_Callback);

    //将值传递给callback
    //createButton(radiobox1, radioboxCallback, (void*)radiobox1, QT_RADIOBOX);
    //createButton(radiobox2, radioboxCallback, (void*)radiobox2, QT_RADIOBOX);

    imshow(main_win, orig_img);//显示原始图像
    cout << "Press any key to exit..." << endl;
    waitKey();

    return 0;
}

//回调函数
void tb1_Callback(int value,void *)
{
    sprintf(msg, "Trackbar 1 changed. New value=%d", value);
    displayOverlay(main_win, msg);
    return;
}

void tb2_Callback(int value,void *)
{
    sprintf(msg, "Trackbar 2 changed. New value=%d", value);
    displayStatusBar(main_win, msg,1000);
    return;
}

//鼠标交互
void cbMouse(int event, int x, int y, int flags, void*)
{
    //调用之间的静态保留值
    static Point p1, p2;
    static bool p2set = false;

    //点击鼠标左键
    if (event == EVENT_LBUTTONDOWN)
    {
        p1 = Point(x, y);
        p2set = false;
    }
    else if (EVENT_MOUSEMOVE&&flags==EVENT_FLAG_LBUTTON)
    {
        //检查鼠标移动和按下鼠标左键
        //出界检查
        if (x>orig_img.size().width)
        {
            x = orig_img.size().width;
        }
        else if (x<0)
        {
            x = 0;
        }
        if (y>orig_img.size().height)
        {
            y = orig_img.size().height;
        }
        else if (y<0)
        {
            y = 0;
        }
        //设置终点
        p2 = Point(x, y);
        p2set = true;
        //将原始图像复制到临时图像中
        orig_img.copyTo(temp_img);
        //绘制矩形
        rectangle(temp_img, p1, p2, Scalar(0, 0, 255));
        //使用rect.绘制临时图像
        imshow(main_win, temp_img);

    }
    else if (event==EVENT_LBUTTONUP&&p2set)
    {
        //检查鼠标左键已经弹起
        //选择一块区域
        //在orig.图像上设置字数组
        //使用选取的矩形
        Mat submat = orig_img(Rect(p1, p2));
        //此处为子矩阵的某些处理
        //......
        //标记所选取矩形的边界
        rectangle(orig_img, p1, p2, Scalar(0, 0, 255), 2);
        imshow("main_win", orig_img);

    }
    return;
}

//按钮(只在使用QT支持时)
void checkboxCallback(int state, void *)
{
    sprintf(msg, "Check box changed. New state=%d",state);
    displayStatusBar(main_win, msg);
    return;
}

void radioboxCallback(int state, void *id)
{
    //传递给回调函数的单选框id
    sprintf(msg, "%s changed. New state=%d",(char*)id,state);
    displayStatusBar(main_win, msg);
    return;
}

void pushbuttonCallback(int, void *font)
{
    //向图像中添加文本
    //addText(orig_img, "Push button clicked", Point(50, 50), *((QtFont*)font));
    imshow(main_win, orig_img);
    return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值