• 大小: 220KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-20
  • 语言: 其他
  • 标签: OpenCV  VS2017  

资源简介

openCV中grabcut图像分割函数使用示例,使用VS2017和opencv3.4.3编译64位版本

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include “opencv2/highgui/highgui.hpp“
#include “opencv2/imgproc/imgproc.hpp“
#include  
#include  

using namespace std;
using namespace cv;

const string winName = “image“;
const Scalar RED = Scalar(00255);
const Scalar BLUE = Scalar(25500);
Mat outImage;

void getBinMask( const Mat& comMask Mat& binMask )   //comMask 变换成binMask
{
if( comMask.empty() || comMask.type()!=CV_8UC1 )
CV_Error( CV_StsBadArg “comMask is empty or has incorrect type (not CV_8UC1)“ );
if( binMask.empty() || binMask.rows!=comMask.rows || binMask.cols!=comMask.cols ) binMask.create( comMask.size() CV_8UC1 ); 
binMask = comMask & 1;
}

void changeMask( Mat& mask vector bgdPixels vector fgdPixels ) //把mask中的的前景背景改变
{
vector::const_iterator it = bgdPixels.begin() itEnd = bgdPixels.end();
for( ; it != itEnd; ++it )
mask.at(*it) = GC_BGD;
it = fgdPixels.begin() itEnd = fgdPixels.end();
for( ; it != itEnd; ++it )
mask.at(*it) = GC_FGD;
}

void showImage( Mat& _img Mat& _mask vector& _bgdPxls vector& _fgdPxls )  //加载显示图像
{
Mat res;
Mat binMask;
if( _mask.empty() )       //_mask为空,直接拷贝
_img.copyTo( res );   //_img -> res
else                                //_mask不为空,变换后拷贝
{
getBinMask( _mask binMask );   //bin
_img.copyTo( res binMask );    //_img - binMask -> res  只拷贝binMask非空时_img的像素
}

vector::const_iterator it;
for( it = _bgdPxls.begin(); it != _bgdPxls.end(); ++it )  //画出背景信息
circle( res *it 1 BLUE );   //(图像,圆心坐标,圆心半径,颜色)  
// 函数cvCircle绘制或填充一个给定圆心和半径的圆。
//圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r g b )。 
for( it = _fgdPxls.begin(); it != _fgdPxls.end(); ++it )  //画出前景信息
circle( res *it 1 RED );

imshow( winName res );
res.copyTo(outImage);
}

Mat image;

Mat mask;
Mat bgdModel fgdModel;
Rect rect;

enum{ NOT_SET = 0 IN_PROCESS = 1 SET = 2 };
uchar rectState = NOT_SET;  //矩形框
uchar lblsState = NOT_SET;

vector fgdPxls bgdPxls;
Point p1 p2;
int iterCount;
/*
这个函数的原型应该为  void Foo(int event int x int y int flags void* param);
其中event是 CV_EVENT_*变量之一,
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系),
flags是CV_EVENT_FLAG的组合, 
param是用户定义的传递到cvSetMouseCallback函数调用的参数。 
*/
void on_mouse( int event int x int y int flags void* param )
{
switch( event )
{
case CV_EVENT_LBUTTONDOWN:  //单击鼠标左键down
{
bool isb = (flags & CV_EVENT_FLAG_ALTKEY) != 0  //是否选中alt键
isf = (flags & CV_EVENT_FLAG_SHIFTKEY) != 0; //是否选中shift键
if( rectState == NOT_SET && !isb && !isf )    //只点击左键时
{
rectState = IN_PROCESS;   //正在处理矩形框
p1 = Point(x y);   //起点
}
if ( (isb || isf) && rectState == SET )   //选中alt或shift键,并且矩形框已设置
{
lblsState = IN_PROCESS;   //正在画背景或前景
}
}
break;
case CV_EVENT_LBUTTONUP:   //点击鼠标左键up
if( rectState == IN_PROCESS )     //若是正在处理矩形框时
{
p2 = Point(x y);        //终点
rect = Rect( p1 p2 );   //矩形框选中
rectState = SET;         //矩形框状态为已设置
gr

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1433  2018-09-16 22:08  CV_grabcut VS2017+OpenCV3.4.3\CV_grabcut.sln

     文件       4551  2012-03-22 14:38  CV_grabcut VS2017+OpenCV3.4.3\CV_grabcut.vcproj

     文件      10293  2018-09-16 22:00  CV_grabcut VS2017+OpenCV3.4.3\CV_grabcut.vcxproj

     文件        932  2018-09-16 21:55  CV_grabcut VS2017+OpenCV3.4.3\CV_grabcut.vcxproj.filters

     文件        165  2018-09-16 21:55  CV_grabcut VS2017+OpenCV3.4.3\CV_grabcut.vcxproj.user

     文件       6772  2018-09-16 22:01  CV_grabcut VS2017+OpenCV3.4.3\grabcut.cpp

     文件     214696  2007-10-01 11:48  CV_grabcut VS2017+OpenCV3.4.3\lena.jpg

     文件      30976  2018-09-16 21:55  CV_grabcut VS2017+OpenCV3.4.3\UpgradeLog.htm

     目录          0  2018-09-16 22:09  CV_grabcut VS2017+OpenCV3.4.3\x64

     目录          0  2018-09-16 22:09  CV_grabcut VS2017+OpenCV3.4.3

----------- ---------  ---------- -----  ----

               269818                    10


评论

共有 条评论