opencv实现图像分割,分离前景和背景(2)

简介  如题,本篇是在前一篇的基础上进一步讲解的第三个图像背景分离例子。实例介绍  这个例子是在上一个加入鼠标操作实例的进一步操作。  本例:可以在鼠标选框完成之后,1、通过shift+鼠标右键来选择设置图像对应位置为前景。2、通过ctrl +鼠标右键来选择设置图像对应位置为背景景。3、按下键值‘n’,进行图像背景分离计算,并显示结果。4、按下键值‘esc’,退出程序。实例讲解具体代码

#include <iostream>using namespace std;using namespace cv; string filenameMat image;string winName NOT_SET IN_PROCESS SET LS_LEFT LS_RIGHT LS_NONE uchar rectState, mouse_flag;Rect rect;Mat maskScalar RED Scalar BLUE Mat bgdModelBGD_KEY FGD_KEY = CV_EVENT_FLAG_SHIFTKEY;int i, j;rect.rect.rect.rect.rect.image.rect.image.}Mat& comMask, Mat& binMask ){binMask.CV_8UC1 );binMask xflagsevent CV_EVENT_LBUTTONDOWN:mouse_flag rectState == NOT_SET){rectState = IN_PROCESS;rect CV_EVENT_LBUTTONUPrectState == IN_PROCESS ){rect PointrectState .CV_EVENT_RBUTTONDOWN:mouse_flag = LS_RIGHT;line_countx;line_countyCV_EVENT_RBUTTONUP:mouse_flag = LS_NONE;line_countline_countline_countline_countimwriteCV_EVENT_MOUSEMOVEmouse_flag rectState == IN_PROCESS ){rect Pointimage rectanglePointrect.GREENimshowmouse_flag == LS_RIGHT){IplImage pI = image;IplImage pI_2 = mask;line_countx;line_countyflags cvLineline_countPointline_countREDcvLineline_countPointline_countcvScalarflags cvLineline_countPointline_countBLUEcvLineline_countPointline_countcvScalarline_countx;line_county;imshowargvMat res;Mat binMask;filename image imshow(winName, image);imwrite(filename_tmp,image);mask.CV_8UC1);rectState = NOT_SET;mask.setMouseCallbackc c c image grabCutGC_INIT_WITH_MASK);getBinMask( mask, binMask );image.imshowres

代码讲解  和前面实例1和实例2相同的代码部分,不在做讲解。只讲在之基础上新加入的部分。鼠标右键响应  加入了鼠标右键+键值ctrl、shift的组合操作。  1、鼠标左键按下时候,记录下当前坐标,并且设置当前模式为LS_RIGHT(前景背景设置模式)

case CV_EVENT_RBUTTONDOWN:mouse_flag = LS_RIGHT;line_countx;line_county

  2、当鼠标右键+shift按下,并拖动鼠标的时候,在图像上绘制出鼠标移动的蓝色线条轨迹,同时在掩码mask上,对应轨迹位置标注为前景(GC_FGD)。当鼠标右键+Ctrl 按下,并拖动鼠标的时候,在图像上绘制出鼠标移动的红色线条轨迹,同时在掩码mask上,对应轨迹位置标注为前景(GC_BGD)。

case CV_EVENT_MOUSEMOVE:……..mouse_flag == LS_RIGHT){IplImage pI = image;IplImage pI_2 = mask;line_countx;line_countyflags cvLineline_countPointline_countREDcvLineline_countPointline_countcvScalarflags cvLineline_countPointline_countBLUEcvLineline_countPointline_countcvScalarline_countx;line_county;imshow

  3、当鼠标右键抬起的时候,,清除掉一些前景背景操作中的临时变量。case CV_EVENT_RBUTTONUP:mouse_flag = LS_NONE;line_countline_countline_countline_countimwrite

键盘响应  加入了两个键值的响应操作:1、esc:直接退出程序。2、‘n’:进行图像背景分离计算,并显示结果。

c c c image grabCutGC_INIT_WITH_MASK);getBinMask( mask, binMask );image.imshowres

效果演示  特别注意:本实例使用时候,需要首先鼠标左键画出背景分离矩形框,然后鼠标右键选择的自定义前景背景才能正常时候。之后按下n键,计算背景分离并显示结果。  运行效果:原图像:

结果图像:

“人”的结构就是相互支撑,“众”人的事业需要每个人的参与。

opencv实现图像分割,分离前景和背景(2)

相关文章:

你感兴趣的文章:

标签云: