使用GrabCut提取前景图像的示范代码
#include<opencv2/opencv.hpp>
bool selectObject = false;
cv::Point origin;
cv::Rect selection;
cv::Mat src;
cv::Mat srcMarks;
cv::Mat result;
cv::Mat foreground;
void GrabCutSegment();
void onMouse(int event, int x, int y, int, void*)
{
if (selectObject)
{
selection.x = MIN(x, origin.x);
selection.y = MIN(y, origin.y);
selection.width = std::abs(x - origin.x);
selection.height = std::abs(y - origin.y);
selection &= cv::Rect(, , src.cols, src.rows);
}
switch (event)
{
case cv::EVENT_LBUTTONDOWN:
origin = cv::Point(x, y);
selection = cv::Rect(x, y, , );
selectObject = true;
break;
case cv::EVENT_LBUTTONDOWN && cv::EVENT_MOUSEMOVE:
src.copyTo(srcMarks);
cv::rectangle(srcMarks, selection, cv::Scalar(, , ));
imshow("srcMarks", srcMarks);
break;
case cv::EVENT_LBUTTONUP:
selectObject = false;
&& selection.height != ){
GrabCutSegment();
}
break;
}
}
void GrabCutSegment(){
cv::Mat bgModel, fgModel;
cv::grabCut(src, result, selection, bgModel, fgModel, , cv::GC_INIT_WITH_RECT);
cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
// Generate output image
foreground = cv::Mat::ones(src.size(), CV_8UC3);
src.copyTo(foreground, result); // bg pixels not copied
cv::imshow("segment", foreground);
}
int main(){
src = cv::imread("hand.jpg");
cv::imshow("src", src);
cv::namedWindow("srcMarks");
src.copyTo(srcMarks);
cv::setMouseCallback();
cv::imshow("srcMarks", srcMarks);
cv::waitKey();
}
可以使用鼠标在srcMarks窗口中画出前景图像所在矩形,随后使用grabCut函数更加精准的确定每个像素是否属于前景,最后在segment窗口中显示前景图像。
测试图片:

测试结果:


使用GrabCut提取前景图像的示范代码的更多相关文章
- opencv提取截获图像(总结摘来)
opencv提取截获图像(总结摘来) http://blog.csdn.net/wuxiaoyao12/article/details/7305865 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- 采用jquery的imgAreaSelect样品图像裁剪示范插件实现
将用户上传的图片进行裁剪再保存是如今web2.0应用中经常处理的工作,如今借助jquery的imgareaselect插件再配合PHP的GD库就能够轻松的实现这个在曾经来说很棘手的功能. 我们来看看它 ...
- OVS 内核KEY值提取及匹配流表代码分析
原文链接:http://ry0117.com/2016/12/24/OVS内核KEY值提取及匹配流表代码分析/ 当开启OVS后,创建datapath类型为system的网桥并他添加相关接口,OVS网桥 ...
- OpenCV:OpenCV图像旋转的代码
OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...
- 提取出图像中感兴趣的部分,cvSetImageRoi,Rect
在做人脸检测的时候,需要从摄像头拍摄视频中把检测到的人脸区域提取出来,网上找了很多博客,发现多数都是在用cvSetImageRoi函数,该函数声明如下:void cvSetImageROI(IplIm ...
- fbx模型动画提取教程附带一个用代码提取的方法
角色已经人形化(Humanoid)了,那它的动画可以用在其它的模型上了也就是可以共用一套模型动画了但是你有没有发现那动画是和fbx模型绑在一起的,没关系你可以选中这几个动画文件按Contrl+D就可以 ...
- 图像仿射变换——MatLab代码实现
这里先说一下我们的目的,最近在用Pix2Pix 做一个项目的时候,遇到了成对图像质量差,存在着特征不能对齐的问题,即A图与B图是一组成对图像,我们想要将A 图中的物体转化为B 图中的物体,但这个物体在 ...
- Ubuntu使用dense_flow提取视频图像的光流图像
使用dense_flow求取图像的光流图像,原项目地址: https://github.com/wanglimin/dense_flow 该方法使用的是opecnv最基本的光流图像计算方法,输出为 f ...
- spark写数据入kafka示范代码
一.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
随机推荐
- python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)
-*- paramiko.util.log_to_file( ssh = paramiko.SSHClient() ssh.set_missing ...
- 将一个dropdownlist从一个div复制到另一个div
<select id="dropdwon1"> <option value=">Item1</option> <option v ...
- MySQL 服务无法启动
拷贝的mysql数据库配置文件的路径网络更改
- opencv输出图片像素值
需求:在控制台输出灰度图像的像素值 代码: #include <stdio.h> #include <iostream> #include <opencv2/core/c ...
- sql 求max和min,但是第二大,第二小怎么算?
利用子查询,但这样速度较慢. SELECT Baoming.id, Baoming.addtime AS '报名时间', CONCAT(Members.realname,Members.usernam ...
- selenium自动化测试之整合测试报告
selenium自动化测试之整合测试报告 标签(空格分隔): 整合报告 如下截图我们添加一个文件叫做:latest_report.py文件, import time import os import ...
- 关于OPEN_MAX宏undeclared的问题
最近在看unp时,I/O复用-poll一章的代码使用到了OPEN_MAX.据书中描述,这一宏定义在limits.h头文件中,指代一个进程在任意时刻能打开的最大描述符数目.但在代码编译时遇到了错误,提示 ...
- oracle中的trim()函数详解
1.先看一下Oracle TRIM函数的完整语法描述 TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ]| trim_character} ...
- java多线程与并发笔记
0.多线程,主要用来提高程序效率,处理耗时的操作. 多个线程写在同一个类里调用,并不是说写在前面的线程就会先运行.各个线程会进行争抢,能抢到系统资源的才会先运行. 因此,同一个程序,多个线程运行,可能 ...
- centos 7.3+nginx+jira(.bin)+mysql
JIRA 安装参考资料 http://www.cnblogs.com/ilanni/p/6200875.html 注意服务启动与关闭 service jira stop service jira st ...