1. #include<opencv2/opencv.hpp>
  2. bool selectObject = false;
  3. cv::Point origin;
  4. cv::Rect selection;
  5. cv::Mat src;
  6. cv::Mat srcMarks;
  7. cv::Mat result;
  8. cv::Mat foreground;
  9. void GrabCutSegment();
  10. void onMouse(int event, int x, int y, int, void*)
  11. {
  12. if (selectObject)
  13. {
  14. selection.x = MIN(x, origin.x);
  15. selection.y = MIN(y, origin.y);
  16. selection.width = std::abs(x - origin.x);
  17. selection.height = std::abs(y - origin.y);
  18.  
  19. selection &= cv::Rect(, , src.cols, src.rows);
  20. }
  21. switch (event)
  22. {
  23. case cv::EVENT_LBUTTONDOWN:
  24. origin = cv::Point(x, y);
  25. selection = cv::Rect(x, y, , );
  26. selectObject = true;
  27. break;
  28. case cv::EVENT_LBUTTONDOWN && cv::EVENT_MOUSEMOVE:
  29. src.copyTo(srcMarks);
  30. cv::rectangle(srcMarks, selection, cv::Scalar(, , ));
  31. imshow("srcMarks", srcMarks);
  32. break;
  33. case cv::EVENT_LBUTTONUP:
  34. selectObject = false;
  35. && selection.height != ){
  36. GrabCutSegment();
  37. }
  38. break;
  39. }
  40. }
  41.  
  42. void GrabCutSegment(){
  43. cv::Mat bgModel, fgModel;
  44. cv::grabCut(src, result, selection, bgModel, fgModel, , cv::GC_INIT_WITH_RECT);
  45. cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
  46. // Generate output image
  47. foreground = cv::Mat::ones(src.size(), CV_8UC3);
  48. src.copyTo(foreground, result); // bg pixels not copied
  49.  
  50. cv::imshow("segment", foreground);
  51. }
  52. int main(){
  53. src = cv::imread("hand.jpg");
  54. cv::imshow("src", src);
  55.  
  56. cv::namedWindow("srcMarks");
  57. src.copyTo(srcMarks);
  58. cv::setMouseCallback();
  59. cv::imshow("srcMarks", srcMarks);
  60.  
  61. cv::waitKey();
  62.  
  63. }

可以使用鼠标在srcMarks窗口中画出前景图像所在矩形,随后使用grabCut函数更加精准的确定每个像素是否属于前景,最后在segment窗口中显示前景图像。

测试图片:

测试结果:

使用GrabCut提取前景图像的示范代码的更多相关文章

  1. opencv提取截获图像(总结摘来)

    opencv提取截获图像(总结摘来) http://blog.csdn.net/wuxiaoyao12/article/details/7305865 版权声明:本文为博主原创文章,未经博主允许不得转 ...

  2. 采用jquery的imgAreaSelect样品图像裁剪示范插件实现

    将用户上传的图片进行裁剪再保存是如今web2.0应用中经常处理的工作,如今借助jquery的imgareaselect插件再配合PHP的GD库就能够轻松的实现这个在曾经来说很棘手的功能. 我们来看看它 ...

  3. OVS 内核KEY值提取及匹配流表代码分析

    原文链接:http://ry0117.com/2016/12/24/OVS内核KEY值提取及匹配流表代码分析/ 当开启OVS后,创建datapath类型为system的网桥并他添加相关接口,OVS网桥 ...

  4. OpenCV:OpenCV图像旋转的代码

    OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...

  5. 提取出图像中感兴趣的部分,cvSetImageRoi,Rect

    在做人脸检测的时候,需要从摄像头拍摄视频中把检测到的人脸区域提取出来,网上找了很多博客,发现多数都是在用cvSetImageRoi函数,该函数声明如下:void cvSetImageROI(IplIm ...

  6. fbx模型动画提取教程附带一个用代码提取的方法

    角色已经人形化(Humanoid)了,那它的动画可以用在其它的模型上了也就是可以共用一套模型动画了但是你有没有发现那动画是和fbx模型绑在一起的,没关系你可以选中这几个动画文件按Contrl+D就可以 ...

  7. 图像仿射变换——MatLab代码实现

    这里先说一下我们的目的,最近在用Pix2Pix 做一个项目的时候,遇到了成对图像质量差,存在着特征不能对齐的问题,即A图与B图是一组成对图像,我们想要将A 图中的物体转化为B 图中的物体,但这个物体在 ...

  8. Ubuntu使用dense_flow提取视频图像的光流图像

    使用dense_flow求取图像的光流图像,原项目地址: https://github.com/wanglimin/dense_flow 该方法使用的是opecnv最基本的光流图像计算方法,输出为 f ...

  9. spark写数据入kafka示范代码

    一.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

随机推荐

  1. C++ CBitmap,HBitmap,Bitmap区别及联系

    加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int ...

  2. ShaderLab学习总结

    转载 Unity ShaderLab学习总结 Why Bothers? 为什么已经有ShaderForge这种可视化Shader编辑器.为什么Asset Store已经有那么多炫酷的Shader组件可 ...

  3. 简单自定义UIToolBar

    let item1 = UIBarButtonItem(title: "分享", style: .Plain, target: self, action: nil) let ite ...

  4. Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans.xsd'

    明明项目没错误,但application.xml就报了错误,这是什么问题呢? 问题在于我们找不到org/springframework/beans/spring-beans这个包,也就是我们的spri ...

  5. 我在eclipse输出的第一个hello world!

    下学期就要学习JAVA 语言,我现在对它好像还真的是一无所知.记得两次在帮学长做测评的时候,他们都说要装上eclipse.然后从放假我就忙着下载,安装,但是由于官网都是英文,似乎一直在出差错.询问了学 ...

  6. spring 解耦

    spring之后不用在类中new一个实体,而是在类中申明接口类:当真正使用的时候是注入相应的实现类,要什么类注入申明类:那么这样就面向接口编程了:耦合度大大降低: 同时spring有面向切面编程,其实 ...

  7. 六 json&pickle模块

    之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...

  8. hdoj1013(数根,大数,九余数算法)

    Digital Roots Problem Description The digital root of a positive integer is found by summing the dig ...

  9. 第二章 向量(d1)有序向量:唯一化

  10. 动态规划 51nod 1183

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 1183 编辑距离  基准时间限制:1 秒 空间限制:1 ...