您的位置:首页 > 运维架构

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;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: