Opencv漫水填充-鼠标、滚动条
2015-09-17 23:20
411 查看
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; bool g_bDrawingBox = false; Point g_CurrPoint; int g_nDown = 0, g_nUp = 0, g_nColorBlue = 255, g_nColorGreen = 255, g_nColorRed = 0, g_nWay = 0; Mat srcImage, dstImage, maskImage, grayImage; Rect rect; int g_nFillMode = 0, g_nImageType = 0; void onMouse(int event, int x, int y, int flag, void *param); int main() { srcImage = imread("1.jpg"); cvtColor(srcImage, grayImage, CV_BGR2GRAY); srcImage.copyTo(dstImage); //为了执行后期阀值化的操作,所以需要创建一个单通道的矩阵 maskImage.create(srcImage.rows + 2, srcImage.cols + 2, CV_8UC1); //必须要指定颜色值 maskImage = Scalar::all(0); //滚动条事件 //在只需要取用滚动条的数值时,不需要有回调函数 //窗口函数的第二个参数如果是0,可以调整窗口的大小 namedWindow("【滚动条窗口】", 0); createTrackbar("Down", "【滚动条窗口】", &g_nDown, 100, 0); createTrackbar("Up", "【滚动条窗口】", &g_nUp, 100, 0); createTrackbar("Blue", "【滚动条窗口】", &g_nColorBlue, 255, 0); createTrackbar("Green", "【滚动条窗口】", &g_nColorGreen, 255, 0); createTrackbar("Red", "【滚动条窗口】", &g_nColorRed, 255, 0); createTrackbar("1/2", "【滚动条窗口】", &g_nWay, 1, 0); createTrackbar("Mode", "【滚动条窗口】", &g_nFillMode, 1, 0); createTrackbar("ImgType", "【滚动条窗口】", &g_nImageType, 1, 0); //鼠标事件 namedWindow("【漫水填充窗口】"); setMouseCallback("【漫水填充窗口】", onMouse, 0); while (1) { dstImage = (g_nImageType == 0 ? srcImage : grayImage); /*if (g_bDrawingBox) floodFill(srcImage, g_CurrPoint, Scalar(0, 0, 255), &rect, Scalar(20, 20, 20), Scalar(20, 20, 20));*/ int flags = 4 + (255 << 8) + (g_nFillMode == 0 ? CV_FLOODFILL_FIXED_RANGE : 0); if (g_nWay == 0) { floodFill(srcImage, g_CurrPoint, Scalar(g_nColorBlue, g_nColorGreen, g_nColorRed) , &rect, Scalar(g_nDown, g_nDown, g_nDown), Scalar(g_nUp, g_nUp, g_nUp), flags); } if (g_nWay == 1) { threshold(maskImage, maskImage, 1, 128, CV_THRESH_BINARY); floodFill(srcImage, maskImage, g_CurrPoint, Scalar(g_nColorRed * 0.299 + g_nColorGreen * 0.587 + g_nColorBlue * 0.114) , &rect, Scalar(g_nDown, g_nDown, g_nDown), Scalar(g_nUp, g_nUp, g_nUp), flags); namedWindow("【掩码窗口】", 0); imshow("【掩码窗口】", maskImage); } imshow("【漫水填充窗口】", srcImage); char c = waitKey(10); if (c == 27) break; /*if (c == 'a') srcImage.copyTo(dstImage);*/ } return 0; } /*注意:不能在回调函数中写入未初始化的矩阵类,所以需要用时,需要写一个标志位,然后再在while(1)循环内使用*/ void onMouse(int event, int x, int y, int flag, void *param) { /*Mat &img = *(cv::Mat*)param;*/ switch (event) { //点击鼠标左键时 case CV_EVENT_LBUTTONDOWN: { g_bDrawingBox = false; g_CurrPoint = Point(x, y); } break; //松开鼠标左键时 case CV_EVENT_LBUTTONUP: { g_bDrawingBox = true; } break; } }
相关文章推荐
- linux下的bash编程简要学习
- 进程管理工具top、htop、glances、dstat的使用
- Linux2.6.32驱动笔记(3)分析应用程序read访问驱动过程
- Opencv实现曼水填充算法-floodFill函数
- Linux bind-utils
- Opencv形态学滤波-综合
- Linux 脚本 命令状态 条件测试
- Kurento应用开发指南(以Kurento 6.0为模板) 之六:kurento架构
- Mac 下配置Tomcat环境
- openstack 之 ceilometer: Sample
- opencv Mat 与IplImage 转换
- 新站4个月,新手做网站经验总结
- Linux下DRBD配置
- linux下jar命令与jar包
- 使用squid做出口防火墙
- ubuntu kylin上部署hadoop源码环境
- 决定学linux了
- 决定学linux了
- 决定学linux了
- 决定学linux了