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