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

来源:互联网 发布:网络策略 sftp 协议 编辑:程序博客网 时间:2024/06/05 09:51

建议先配置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