//-----------------------------------【程序说明】----------------------------------------------
// 程序名称::《【OpenCV入门教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)》 博文配套源码
// 开发所用IDE版本:Visual Studio 2010
// 开发所用OpenCV版本: 2.4.9
// 2014年6月3日 Created by 浅墨
// 配套博文链接: http://blog.csdn.net/poem_qianmo/article/details/28261997
// PS:程序结合配合博文学习效果更佳
// 浅墨的微博:@浅墨_毛星云 http://weibo.com/1723155442/profile?topnav=1&wvr=5&user=1
// 浅墨的知乎:http://www.zhihu.com/people/mao-xing-yun
// 浅墨的豆瓣:http://www.douban.com/people/53426472/
//----------------------------------------------------------------------------------------------
//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
using namespace std;
//-----------------------------------【全局变量声明部分】--------------------------------------
// 描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_dstImage, g_grayImage, g_maskImage;//定义原始图、目标图、灰度图、掩模图
int g_nFillMode = 1;//漫水填充的模式
int g_nLowDifference = 20, g_nUpDifference = 20;//负差最大值、正差最大值
int g_nConnectivity = 4;//表示floodFill函数标识符低八位的连通值
int g_bIsColor = true;//是否为彩色图的标识符布尔值
bool g_bUseMask = false;//是否显示掩膜窗口的布尔值
int g_nNewMaskVal = 255;//新的重新绘制的像素值
//-----------------------------------【ShowHelpText( )函数】----------------------------------
// 描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText()
{
//输出一些帮助信息
printf("\n\n\n\t欢迎来到漫水填充示例程序~\n\n");
printf( "\n\n\t按键操作说明: \n\n"
"\t\t鼠标点击图中区域- 进行漫水填充操作\n"
"\t\t键盘按键【ESC】- 退出程序\n"
"\t\t键盘按键【1】- 切换彩色图/灰度图模式\n"
"\t\t键盘按键【2】- 显示/隐藏掩膜窗口\n"
"\t\t键盘按键【3】- 恢复原始图像\n"
"\t\t键盘按键【4】- 使用空范围的漫水填充\n"
"\t\t键盘按键【5】- 使用渐变、固定范围的漫水填充\n"
"\t\t键盘按键【6】- 使用渐变、浮动范围的漫水填充\n"
"\t\t键盘按键【7】- 操作标志符的低八位使用4位的连接模式\n"
"\t\t键盘按键【8】- 操作标志符的低八位使用8位的连接模式\n"
"\n\n\t\t\t\t\t\t\t\t by浅墨\n\n\n"
);
}
//-----------------------------------【onMouse( )函数】--------------------------------------
// 描述:鼠标消息onMouse回调函数
//---------------------------------------------------------------------------------------------
static void onMouse( int event, int x, int y, int, void* )
{
// 若鼠标左键没有按下,便返回
if( event != CV_EVENT_LBUTTONDOWN )
return;
//-------------------【<1>调用floodFill函数之前的参数准备部分】---------------
Point seed = Point(x,y);
int LowDifference = g_nFillMode == 0 ? 0 : g_nLowDifference;//空范围的漫水填充,此值设为0,否则设为全局的g_nLowDifference
int UpDifference = g_nFillMode == 0 ? 0 : g_nUpDifference;//空范围的漫水填充,此值设为0,否则设为全局的g_nUpDifference
int flags = g_nConnectivity + (g_nNewMaskVal << 8) +
(g_nFillMode == 1 ? CV_FLOODFILL_FIXED_RANGE : 0);//标识符的0~7位为g_nConnectivity,8~15位为g_nNewMaskVal左移8位的值,16~23位为CV_FLOODFILL_FIXED_RANGE或者0。
//随机生成bgr值
int b = (unsigned)theRNG() & 255;//随机返回一个0~255之间的值
int g = (unsigned)theRNG() & 255;//随机返回一个0~255之间的值
int r = (unsigned)theRNG() & 255;//随机返回一个0~255之间的值
Rect ccomp;//定义重绘区域的最小边界矩形区域
Scalar newVal = g_bIsColor ? Scalar(b, g, r) : Scalar(r*0.299 + g*0.587 + b*0.114);//在重绘区域像素的新值,若是彩色图模式,取Scalar(b, g, r);若是灰度图模式,取Scalar(r*0.299 + g*0.587 + b*0.114)
Mat dst = g_bIsColor ? g_dstImage : g_grayImage;//目标图的赋值
int area;
//--------------------【<2>正式调用floodFill函数】-----------------------------
if( g_bUseMask )
{
threshold(g_maskImage, g_maskImage, 1, 128, CV_THRESH_BINARY);
area = floodFill(dst, g_maskImage, seed, newVal, &ccomp, Scalar(LowDifference, LowDifference, LowDifference),
Scalar(UpDifference, UpDifference, UpDifference), flags);
imshow( "mask", g_maskImage );
}
else
{
area = floodFill(dst, seed, newVal, &ccomp, Scalar(LowDifference, LowDifference, LowDifference),
Scalar(UpDifference, UpDifference, UpDifference), flags);
}
imshow("效果图", dst);
cout << area << " 个像素被重绘\n";
}
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
//改变console字体颜色
system("color 2F");
//载入原图
g_srcImage = imread("1.jpg", 1);
if( !g_srcImage.data ) { printf("Oh,no,读取图片image0错误~! \n"); return false; }
//显示帮助文字
ShowHelpText();
g_srcImage.copyTo(g_dstImage);//拷贝源图到目标图
cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);//转换三通道的image0到灰度图
g_maskImage.create(g_srcImage.rows+2, g_srcImage.cols+2, CV_8UC1);//利用image0的尺寸来初始化掩膜mask
namedWindow( "效果图",CV_WINDOW_AUTOSIZE );
//创建Trackbar
createTrackbar( "负差最大值", "效果图", &g_nLowDifference, 255, 0 );
createTrackbar( "正差最大值" ,"效果图", &g_nUpDifference, 255, 0 );
//鼠标回调函数
setMouseCallback( "效果图", onMouse, 0 );
//循环轮询按键
while(1)
{
//先显示效果图
imshow("效果图", g_bIsColor ? g_dstImage : g_grayImage);
//获取键盘按键
int c = waitKey(0);
//判断ESC是否按下,若按下便退出
if( (c & 255) == 27 )
{
cout << "程序退出...........\n";
break;
}
//根据按键的不同,进行各种操作
switch( (char)c )
{
//如果键盘“1”被按下,效果图在在灰度图,彩色图之间互换
case '1':
if( g_bIsColor )//若原来为彩色,转为灰度图,并且将掩膜mask所有元素设置为0
{
cout << "键盘“1”被按下,切换彩色/灰度模式,当前操作为将【彩色模式】切换为【灰度模式】\n";
cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);
g_maskImage = Scalar::all(0); //将mask所有元素设置为0
g_bIsColor = false; //将标识符置为false,表示当前图像不为彩色,而是灰度
}
else//若原来为灰度图,便将原来的彩图image0再次拷贝给image,并且将掩膜mask所有元素设置为0
{
cout << "键盘“1”被按下,切换彩色/灰度模式,当前操作为将【彩色模式】切换为【灰度模式】\n";
g_srcImage.copyTo(g_dstImage);
g_maskImage = Scalar::all(0);
g_bIsColor = true;//将标识符置为true,表示当前图像模式为彩色
}
break;
//如果键盘按键“2”被按下,显示/隐藏掩膜窗口
case '2':
if( g_bUseMask )
{
destroyWindow( "mask" );
g_bUseMask = false;
}
else
{
namedWindow( "mask", 0 );
g_maskImage = Scalar::all(0);
imshow("mask", g_maskImage);
g_bUseMask = true;
}
break;
//如果键盘按键“3”被按下,恢复原始图像
case '3':
cout << "按键“3”被按下,恢复原始图像\n";
g_srcImage.copyTo(g_dstImage);
cvtColor(g_dstImage, g_grayImage, COLOR_BGR2GRAY);
g_maskImage = Scalar::all(0);
break;
//如果键盘按键“4”被按下,使用空范围的漫水填充
case '4':
cout << "按键“4”被按下,使用空范围的漫水填充\n";
g_nFillMode = 0;
break;
//如果键盘按键“5”被按下,使用渐变、固定范围的漫水填充
case '5':
cout << "按键“5”被按下,使用渐变、固定范围的漫水填充\n";
g_nFillMode = 1;
break;
//如果键盘按键“6”被按下,使用渐变、�
没有合适的资源?快使用搜索试试~ 我知道了~
浅墨opencv博客源码(全部源码打包)
共430个文件
dll:65个
jpg:59个
tlog:59个
5星 · 超过95%的资源 需积分: 9 138 下载量 45 浏览量
2017-10-26
10:01:18
上传
评论 6
收藏 57.97MB ZIP 举报
温馨提示
浅墨自己啃官方文档和英文书写出来的原创OpenCV教程博文,基于OpenCV2.X新版本来书写。 浅墨博客专栏:http://blog.csdn.net/column/details/opencv-tutorial.html
资源推荐
资源详情
资源评论
收起资源包目录
浅墨opencv博客源码(全部源码打包) (430个子文件)
main.cpp 8KB
main.cpp 7KB
main.cpp 7KB
main.cpp 6KB
main.cpp 6KB
main.cpp 6KB
main.cpp 6KB
main.cpp 5KB
main.cpp 5KB
main.cpp 5KB
main.cpp 5KB
main.cpp 4KB
main.cpp 4KB
main.cpp 4KB
main.cpp 4KB
main.cpp 4KB
main.cpp 2KB
main.cpp 2KB
main.cpp 2KB
main.cpp 2KB
main.cpp 356B
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core249.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_core248.dll 2MB
opencv_highgui249.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui248.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_highgui249.dll 1.98MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc249.dll 1.83MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_imgproc248.dll 1.82MB
opencv_features2d249.dll 701KB
opencv_features2d249.dll 701KB
opencv_features2d249.dll 701KB
opencv_features2d249.dll 701KB
opencv_features2d249.dll 701KB
HelloOpenCV.exe 45KB
OpenCVdemo12.exe 20KB
OpenCVdemo6.exe 20KB
OpenCVdemo2 by浅墨.exe 18KB
OpenCVdemo3.exe 18KB
OpenCVdemo5.exe 17KB
OpenCVdemo9.exe 17KB
OpenCVdemo13.exe 17KB
OpenCVdemo11.exe 16KB
OpenCVdemo8.exe 16KB
OpenCVdemo17.exe 16KB
OpenCVdemo7.exe 16KB
OpenCVdemo4.exe 16KB
OpenCVdemo14.exe 15KB
共 430 条
- 1
- 2
- 3
- 4
- 5
资源评论
- wangnima1122018-05-02很良心,集合了所有的资源
- luosai2102019-06-14好资源,很良心
- a8197218102017-12-18很良心,集合了所有的资源
东风牧野
- 粉丝: 166
- 资源: 28
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功