下面是OPENCV B4.0 附带的 FLOOD FILL 算法的源代码样例,可以实现简单的彩色图像分割。
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#endif
IplImage* color_img0;
IplImage* mask;
IplImage* color_img;
IplImage* gray_img0 = NULL;
IplImage* gray_img = NULL;
int ffill_case = 1;
int lo_diff = 20, up_diff = 20;
int connectivity = 4;
int is_color = 1;
int is_mask = 0;
int new_mask_val = 255;
void on_mouse( int event, int x, int y, int flags )
{
if( !color_img )
return;
switch( event )
{
case CV_EVENT_LBUTTONDOWN:
{
CvPoint seed = cvPoint(x,y);
int lo = ffill_case == 0 ? 0 : lo_diff;
int up = ffill_case == 0 ? 0 : up_diff;
int flags = connectivity + (new_mask_val << 8) +
(ffill_case == 1 ? CV_FLOODFILL_FIXED_RANGE : 0);
int b = rand() & 255, g = rand() & 255, r = rand() & 255;
CvConnectedComp comp;
if( is_mask )
cvThreshold( mask, mask, 1, 128, CV_THRESH_BINARY );
if( is_color )
{
CvScalar color = CV_RGB( r, g, b );
cvFloodFill( color_img, seed, color, CV_RGB( lo, lo, lo ),
CV_RGB( up, up, up ), &comp, flags, is_mask ? mask : NULL );
cvShowImage( "image", color_img );
}
else
{
CvScalar brightness = cvRealScalar((r*2 + g*7 + b + 5)/10);
cvFloodFill( gray_img, seed, brightness, cvRealScalar(lo),
cvRealScalar(up), &comp, flags, is_mask ? mask : NULL );
cvShowImage( "image", gray_img );
}
printf("%g pixels were repainted\n", comp.area );
if( is_mask )
cvShowImage( "mask", mask );
}
break;
}
}
int main( int argc, char** argv )
{
char* filename = argc >= 2 ? argv[1] : (char*)"fruits.jpg";
if( (color_img0 = cvLoadImage(filename,1)) == 0 )
return 0;
printf( "Hot keys: \n"
"\tESC - quit the program\n"
"\tc - switch color/grayscale mode\n"
"\tm - switch mask mode\n"
"\tr - restore the original image\n"
"\ts - use null-range floodfill\n"
"\tf - use gradient floodfill with fixed(absolute) range\n"
"\tg - use gradient floodfill with floating(relative) range\n"
"\t4 - use 4-connectivity mode\n"
"\t8 - use 8-connectivity mode\n" );
color_img = cvCloneImage( color_img0 );
gray_img0 = cvCreateImage( cvSize(color_img->width, color_img->height), 8, 1 );
cvCvtColor( color_img, gray_img0, CV_BGR2GRAY );
gray_img = cvCloneImage( gray_img0 );
mask = cvCreateImage( cvSize(color_img->width + 2, color_img->height + 2), 8, 1 );
cvNamedWindow( "image", 0 );
cvCreateTrackbar( "lo_diff", "image", &lo_diff, 255, NULL );
cvCreateTrackbar( "up_diff", "image", &up_diff, 255, NULL );
cvSetMouseCallback( "image", on_mouse );
for(;;)
{
int c;
if( is_color )
cvShowImage( "image", color_img );
else
cvShowImage( "image", gray_img );
c = cvWaitKey(0);
switch( c )
{
case '\x1b':
printf("Exiting ...\n");
goto exit_main;
case 'c':
if( is_color )
{
printf("Grayscale mode is set\n");
cvCvtColor( color_img, gray_img, CV_BGR2GRAY );
is_color = 0;
}
else
{
printf("Color mode is set\n");
cvCopy( color_img0, color_img, NULL );
cvZero( mask );
is_color = 1;
}
break;
case 'm':
if( is_mask )
{
cvDestroyWindow( "mask" );
is_mask = 0;
}
else
{
cvNamedWindow( "mask", 0 );
cvZero( mask );
cvShowImage( "mask", mask );
is_mask = 1;
}
break;
case 'r':
printf("Original image is restored\n");
cvCopy( color_img0, color_img, NULL );
cvCopy( gray_img0, gray_img, NULL );
cvZero( mask );
break;
case 's':
printf("Simple floodfill mode is set\n");
ffill_case = 0;
break;
case 'f':
printf("Fixed Range floodfill mode is set\n");
ffill_case = 1;
break;
case 'g':
printf("Gradient (floating range) floodfill mode is set\n");
ffill_case = 2;
break;
case '4':
printf("4-connectivity mode is set\n");
connectivity = 4;
break;
case '8':
printf("8-connectivity mode is set\n");
connectivity = 8;
break;
}
}
exit_main:
cvDestroyWindow( "test" );
cvReleaseImage( &gray_img );
cvReleaseImage( &gray_img0 );
cvReleaseImage( &color_img );
cvReleaseImage( &color_img0 );
cvReleaseImage( &mask );
return 1;
}
#ifdef _EiC
main(1,"ffilldemo.c");
#endif
<!-- Signature -->
分享到:
相关推荐
用OpenCV开发图像分割
Flood_Fill算法介绍与实现 相当详细 绝对相当有用!!
SYN flood是属于DOS攻击的一种典型方式,其发生方式就出现在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手...
C#,计算几何,计算机图形学(Computer Graphics)洪水填充算法(Flood Fill Algorithm)与源代码 泛洪填充算法(Flood Fill Algorithm) ,又称洪水填充算法,是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 ...
很难找到的瀑布算法ios示例,即著名的flood fill算法,网上找到的大部分是c语言实现,这是object-c实现
这个udpFlood是从上面我写的那个synflood里改的,很简单,如果大家需要做两个攻击的话建议自己改一个就ok,也可以集成在一起。还能多练习,熟悉tcp和udp的区别
在Windows下编程实现SYN Flood攻击程序,并实现源地址伪装。
A flood fill game for Android by GunshipPenguin (Rhys RE). Gameplay You start in the upper left hand corner of the board. Tap the colored buttons along the bottom of the board to flood all ...
基于半监督学习的Sentinel-1 SAR图像洪水分割_Flood Segmentation on Sentinel-1 SAR Imagery with Semi-Supervised Learning.pdf
python库,解压后可用。 资源全名:flood_fill_filter-1.1.0-py3-none-any.whl
用于 Flood Fill 算法的 Clojure 库。 ,只做了很小的改动。 安装Arkifact 将以下条目添加到project.clj文件的:dependencies向量: [ ] ( ) 淹没地球 user=> ( require '[the-flood.core :refer [flood-fill]]) ...
VS2005+AE9.2 洪水淹没 实现洪水面的自动演示,简单易懂。AE二次开发。
Microsoft Visual C++ 6.0环境下的syn flood源程序
SYNFLOOD 攻击源代码 C++ 实现拒绝服务攻击 可以不断发送SYN包
漫水算法,matlab,floodfil,用了matlab自带图片做演示,版本:matlab2018a,imfill函数,也可以把图片换成自己的
资源来自pypi官网。 资源全名:flood_fill_filter-1.1.0-py3-none-any.whl
FloodFillOPenCV使用 OpenCV 框架实现的IOS 的 Flood Fill 功能
清华大学SYN Flood & UDP Flood ppt 利用Netwox进行TCP SYN Flood攻击演示 攻击工具 Longcat Flooder SinFlood Synflooder.pl metasploit Netwox ……
一种全局的SYN Flood防御方法,韩超,李明楚,本文给出了一种全新的全局的,大范围的防御SYN Flood攻击的方法,可以同时在目标网络检测攻击并在攻击源网络进行过滤。采用异常检测
Linux下synflood源码