Opencv用鼠标绘制线段
2015-08-25 15:33
375 查看
#include<iostream> #include<opencv2/opencv.hpp> #define WINDOW_NAME "鼠标事件窗口" #define EVENT_WINDOW "滚动条窗口" #define PI 3.1415926 using namespace std; using namespace cv; void DrawLine(Mat &img, Point start, Point end, Scalar color, int thickness = 2, int lineType = 8); void DrawRectangle(Mat &img, Rect box); void onMouse(int event, int x, int y, int flag, void *param); void on_Trackbar_b(int, void *); void on_Trackbar_g(int, void *); void on_Trackbar_r(int, void *); void on_Trackbar_switch(int, void *); void on_Trackbar_proportion(int, void *); void on_Trackbar_Thick(int, void *); Rect g_rectangle; bool g_bDrawingBox = false; RNG g_rng(12345); Point g_startpoint, g_endpoint; double g_angle; Point g_currentPoint; Size_<double> g_currentSize; Scalar g_EllCurColor; double proportion = 0; int EllCurThick; //滑动条 int g_nAlphaValueSlider_b, g_nAlphaValueSlider_g, g_nAlphaValueSlider_r, g_nAlphaValueSlider_switch, g_nAlphaValueSlider_pro, g_EllCurThick; const int g_nMaxAlphaValue = 255, g_switch = 1, g_proportion_max = 11, g_EllCurThickMax = 100; int switch_flag = 0; int main() { Mat srcImage(600, 800, CV_8UC3); Mat winImage(100, 600, CV_8UC3); Mat tempImage; srcImage = Scalar::all(0); winImage = Scalar::all(0); /*srcImage.copyTo(tempImage);*/ /*namedWindow(WINDOW_NAME); setMouseCallback(WINDOW_NAME, onMouse, (void *)&srcImage);*/ g_nAlphaValueSlider_b = 50; g_nAlphaValueSlider_g = 50; g_nAlphaValueSlider_r = 50; g_nAlphaValueSlider_switch = 0; g_nAlphaValueSlider_pro = 0; namedWindow(EVENT_WINDOW); imshow(EVENT_WINDOW, winImage); createTrackbar("blue", EVENT_WINDOW, &g_nAlphaValueSlider_b, g_nMaxAlphaValue, on_Trackbar_b); on_Trackbar_b(g_nAlphaValueSlider_b, 0); createTrackbar("green", EVENT_WINDOW, &g_nAlphaValueSlider_g, g_nMaxAlphaValue, on_Trackbar_g); on_Trackbar_g(g_nAlphaValueSlider_g, 0); createTrackbar("red", EVENT_WINDOW, &g_nAlphaValueSlider_r, g_nMaxAlphaValue, on_Trackbar_r); on_Trackbar_r(g_nAlphaValueSlider_r, 0); createTrackbar("Thick", EVENT_WINDOW, &g_EllCurThick, g_EllCurThickMax, on_Trackbar_Thick); on_Trackbar_switch(g_EllCurThick, 0); createTrackbar("proportion", EVENT_WINDOW, &g_nAlphaValueSlider_pro, g_proportion_max, on_Trackbar_proportion); on_Trackbar_switch(g_nAlphaValueSlider_pro, 0); createTrackbar("switch", EVENT_WINDOW, &g_nAlphaValueSlider_switch, g_switch, on_Trackbar_switch); on_Trackbar_switch(g_nAlphaValueSlider_switch, 0); while (1) { if (switch_flag) { namedWindow(WINDOW_NAME); setMouseCallback(WINDOW_NAME, onMouse, (void *)&srcImage); while (1) { srcImage.copyTo(tempImage); if (g_bDrawingBox) DrawLine(tempImage, g_startpoint, g_endpoint, g_EllCurColor, EllCurThick); imshow(EVENT_WINDOW, winImage); imshow(WINDOW_NAME, tempImage); if (!switch_flag) break; if (waitKey(10) == 27) break; } } if (waitKey(10) == 27) break; } return 0; } void DrawLine(Mat &img, Point start, Point end, Scalar color, int thickness, int lineType) { line(img, start, end, color, thickness, lineType); } void DrawRectangle(Mat &img, Rect box) { rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255))); } void onMouse(int event, int x, int y, int flag, void *param) { Mat &img = *(cv::Mat*)param; switch (event) { //移动鼠标的时候 case CV_EVENT_MOUSEMOVE: { if (g_bDrawingBox) { g_endpoint = Point(x, y); /*g_currentSize.width = pow((g_startpoint.x - g_currentPoint.x) * (g_startpoint.x - g_currentPoint.x) + (g_startpoint.y - g_currentPoint.y) * (g_startpoint.y - g_currentPoint.y), 0.5); g_currentSize.height = g_currentSize.width / (proportion + 1); g_angle = (double)(atan2f((float)(y - g_startpoint.y), (float)(x - g_startpoint.x)) * 180 / PI);*/ } } break; //点击鼠标左键时 case CV_EVENT_LBUTTONDOWN: { g_endpoint = Point(x, y); g_startpoint = Point(x, y); g_bDrawingBox = true; g_startpoint = Point(x, y); } break; //松开鼠标左键时 case CV_EVENT_LBUTTONUP: { g_bDrawingBox = false; DrawLine(img, g_startpoint, g_endpoint, g_EllCurColor, EllCurThick); } break; } } void on_Trackbar_b(int, void *) { g_EllCurColor = Scalar(g_nAlphaValueSlider_b, g_nAlphaValueSlider_g, g_nAlphaValueSlider_r); } void on_Trackbar_g(int, void *) { g_EllCurColor = Scalar(g_nAlphaValueSlider_b, g_nAlphaValueSlider_g, g_nAlphaValueSlider_r); } void on_Trackbar_r(int, void *) { g_EllCurColor = Scalar(g_nAlphaValueSlider_b, g_nAlphaValueSlider_g, g_nAlphaValueSlider_r); } void on_Trackbar_switch(int, void *) { switch_flag = g_nAlphaValueSlider_switch; } void on_Trackbar_proportion(int, void *) { proportion = g_nAlphaValueSlider_pro; } void on_Trackbar_Thick(int, void *) { EllCurThick = g_EllCurThick; }
同样,得先打开开关才能绘制,关闭开关才能退出!!!!!
相关文章推荐
- 我的openwrt学习笔记(十):开发小贴士_vmware虚拟机窗口大小设置
- OpenGL
- linux---动静态库编译及使用
- 各类数据库字符串连接网站
- Opencv用鼠标画圆
- 迅为4412开发板Linux驱动教程之GPIO的初始化
- Setting up Django and your web server with uWSGI and nginx
- OpenCV2:等间隔采样和局部均值的图像缩小
- tomcat的环境变量部署
- linux-impdp的使用
- nginx 代理缓存配置
- Linux下硬盘设备命名规则
- error RC1015: cannot open include file 'atlres.h'问题解决
- linux kernel 0.11 head
- Linux下获取硬盘相关信息
- python执行shell命令的四种方法
- 图像角点检测的Fast算法(OpenCV文档)
- 如何搭建 Nginx 网站服务器
- php\shell 中改变和获取工作目录、执行文件目录
- linux recv 返回值 和 recv 标志参数--- 实测