出的结果不理想。 感觉是tlink的权重的计算有问题,以及参数的设置。三个可设置参数是后面的 i j k  。如果你找到了一组好参数请告诉我。

下载地址 http://download.csdn.net/download/li_haoren/10232283

Interactive Graph Cuts  for Optimal Boundary & Region Segmentation of Objects in N-D Images  code

#include "opencv2\imgproc\imgproc.hpp"  // Gaussian Blur
#include "opencv2\core\core.hpp" // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2\highgui\highgui.hpp> // OpenCV window I/O
#include <iostream> // for standard I/O
#include <string> // for strings
#include <iomanip> // for controlling float print precision
#include <sstream> // string to number conversion
#include<vector>
#include<cmath>
#include "graph.h"  //maxflow-v3.01   下载地址 http://vision.csd.uwo.ca/code/maxflow-v3.01.zip 
typedef Graph<int, int, int> GraphType;
using namespace cv;
using namespace std;
int ofexp = 5;//Lambda
double BSigma = 2;//the Sigma of B{p,q} 小边缘越清
double RSigma = 3;//the Sigma of Rp 小号
const string filename = "1.jpg";//照片
bool rButtonDown = false;
bool lButtonDown = false;
int numUsedBins = 0;
float varianceSquared = 0;
int scribbleRadius = 10;
Mat inputImg = imread(filename, 3), showImg = imread(filename, 3); Mat fgScribbleMask;
Mat bgScribbleMask; static void onMouse(int event, int x, int y, int, void*)
{
//cout << "On Mouse: (" << x << "," << y << ")" <<endl; if (event == CV_EVENT_LBUTTONDOWN)
{
lButtonDown = true; }
else if (event == CV_EVENT_RBUTTONDOWN)
{
rButtonDown = true; }
else if (event == CV_EVENT_LBUTTONUP)
{
lButtonDown = false;
}
else if (event == CV_EVENT_RBUTTONUP)
{
rButtonDown = false;
}
else if (event == CV_EVENT_MOUSEMOVE)
{
if (rButtonDown)
{
// scribble the background
circle(bgScribbleMask, Point(x, y), scribbleRadius, 255, -1);
circle(showImg, Point(x, y), scribbleRadius, CV_RGB(0, 0, 255), -1); }
else if (lButtonDown)
{
// scribble the foreground
circle(showImg, Point(x, y), scribbleRadius, CV_RGB(255, 0, 0), -1);
circle(fgScribbleMask, Point(x, y), scribbleRadius, 255, -1);
//fgScribbleMask.at<char>(y,x)=(char)255;
// set variables using mask
//showImg.setTo(redColorElement,fgScribbleMask); //showImg.at<Vec3b>(y,x)[0] = 0;
//showImg.at<Vec3b>(y,x)[1] = 0;
//showImg.at<Vec3b>(y,x)[2] = 255;
} } imshow("draw", showImg);
imshow("fg mask", fgScribbleMask);
imshow("bg mask", bgScribbleMask);
}
vector<double> slink(inputImg.cols*inputImg.rows),tlink(inputImg.cols*inputImg.rows);
double k=0; GraphType *g = new GraphType(inputImg.cols*inputImg.rows, inputImg.cols*inputImg.rows*4);
inline int node1n(int i, int j) { return i*inputImg.cols + j; }
void computnlink() { double weight0=0; double weight1=0; double weight2=0; double weight3=0;
for (int i = 0; i < inputImg.rows; ++i)
for (int j = 0; j < inputImg.cols; ++j)
{
g->add_node();
}
for (int i = 0; i < inputImg.rows; ++i)
for (int j = 0; j < inputImg.cols; ++j)
{ if (i == 0);
else {
weight0 =
ofexp*exp(-(pow(inputImg.at<Vec3b>(i, j)[0] - inputImg.at<Vec3b>(i - 1, j)[0], 2) +
pow(inputImg.at<Vec3b>(i, j)[1] - inputImg.at<Vec3b>(i - 1, j)[1], 2) +
pow(inputImg.at<Vec3b>(i, j)[2] - inputImg.at<Vec3b>(i - 1, j)[2], 2)) / 6.0 / BSigma / BSigma);
g->add_edge(node1n(i, j), node1n(i - 1, j), weight0, weight0);
}
if (i + 1 ==inputImg.rows);
else {
weight2 =
ofexp*exp(-(pow(inputImg.at<Vec3b>(i, j)[0] - inputImg.at<Vec3b>(i + 1, j)[0], 2) +
pow(inputImg.at<Vec3b>(i, j)[1] - inputImg.at<Vec3b>(i + 1, j)[1], 2) +
pow(inputImg.at<Vec3b>(i, j)[2] - inputImg.at<Vec3b>(i + 1, j)[2], 2)) / 6.0 / BSigma / BSigma);
g->add_edge(node1n(i, j), node1n(i + 1, j), weight2, weight2);
}
if (j==0);
else {
weight3 =
ofexp*exp(-(pow(inputImg.at<Vec3b>(i, j)[0] - inputImg.at<Vec3b>(i , j-1)[0], 2) +
pow(inputImg.at<Vec3b>(i, j)[1] - inputImg.at<Vec3b>(i , j-1)[1], 2) +
pow(inputImg.at<Vec3b>(i, j)[2] - inputImg.at<Vec3b>(i , j-1)[2], 2)) / 6.0 / BSigma / BSigma);
g->add_edge(node1n(i, j), node1n(i , j-1), weight3, weight3);
}
if (j + 1 == inputImg.cols);
else {
weight1 =
ofexp*exp(-(pow(inputImg.at<Vec3b>(i, j)[0] - inputImg.at<Vec3b>(i, j +1)[0], 2) +
pow(inputImg.at<Vec3b>(i, j)[1] - inputImg.at<Vec3b>(i, j + 1)[1], 2) +
pow(inputImg.at<Vec3b>(i, j)[2] - inputImg.at<Vec3b>(i, j + 1)[2], 2)) / 6.0 / BSigma / BSigma);
g->add_edge(node1n(i, j), node1n(i, j + 1), weight1, weight1);
}
if (k < weight1+ weight0+ weight3+ weight2)
k = weight1 + weight0 + weight3 + weight2;
}
k += 1;
} Mat greyimg = imread(filename, 0); double gray[256]; double Bgray[256]; double Fgray[256]; double weight1 = 0; double weight2 = 0;
/*weight有问题改动*/void computtlink() { for (int i = 0; i < greyimg.rows*greyimg.cols; i++) {
++gray[greyimg.at<uchar>(i)];
if(bgScribbleMask.at<uchar>(i))
++Bgray[greyimg.at<uchar>(i)];
if (fgScribbleMask.at<uchar>(i))
++Fgray[greyimg.at<uchar>(i)];
}
cout << greyimg.rows*greyimg.cols<<endl;
for (int i = 0; i < greyimg.rows*greyimg.cols; i++) { weight1 = 0; weight2 = 0;
for (int j = 0; j < 256; j++) {
weight1 += (!gray[j]) ? 0 : ((Fgray[j] / gray[j])*exp(-1 * (pow(greyimg.at<uchar>(i) - j, 2))/2 / RSigma));
weight2 += (!gray[j]) ? 0 : ((Bgray[j] / gray[j])*exp(-1 * (pow(greyimg.at<uchar>(i) - j, 2))/2/ RSigma)); }
if (bgScribbleMask.at<uchar>(i))
{g->add_tweights(i, /* capacities */ k, 0); continue;}
if (fgScribbleMask.at<uchar>(i))
{g->add_tweights(i, /* capacities */ 0, k); continue;} g->add_tweights(i, /* capacities */weight2 ,weight1 ); }
} int main() {
cout << "在draw上画前景背景,左键红前景,右键蓝背景。然后在input输入s 开始运算" << endl;
bgScribbleMask.create(2, inputImg.size, CV_8UC1);
bgScribbleMask = 0;
fgScribbleMask.create(2, inputImg.size, CV_8UC1);
Mat result;
result.create(2, inputImg.size, CV_8UC1);
result = 0;
fgScribbleMask = 0;
namedWindow("draw");
imshow("draw", showImg);
namedWindow("input");
imshow("input", inputImg); string ii[250];
for (int i = 1; i < 250; i++)
ii[i] = i; setMouseCallback("draw", onMouse, 0);
while (1) {
char key = waitKey(0);
if (key == 's') {
double j = 5; int k = 13;for (int i = 1; i < 10; ++++i)
{
ofexp = i;//Lambda 三个可变动参数
BSigma = j;//the Sigma of B{p,q} 小边缘越清
RSigma = k;
computnlink(); computtlink(); int flow = g->maxflow(); printf("Flow = %d\n", flow);
cout << k;
for (int i = 0; i < inputImg.rows*inputImg.cols; i++) {
if (g->what_segment(i)) { result.at<uchar>(i) = 255; result.at<uchar>(i) = 255; result.at<uchar>(i) = 255;
} } namedWindow(ii[i+k*6]);
imshow(ii[i+k * 6], result);
}
}
} return 0; }

  

vs2015+opencv3.3.1+ maxflow-v3.01 c++实现Yuri Boykov 的Interactive Graph Cuts的更多相关文章

  1. win7下VS2015+opencv3.1.0配置

    由于opencv与vs的适配版本不同,本人在官网下载opencv3.1.0,其可以和VS2013.VS2015适配,文中以VS2015为例 opencv2.4.13-----vc11;vc12 ope ...

  2. [转]VS2015+OpenCV3.3 GPU模块和opencv_contrib模块的编译以及采用CMake编译opencv_contrib时提示“No extra modules found in folder”问题的解决方案

    据官方说法,目前还不是太稳定的算法模块都在opencv_contrib里边,由于不稳定,所以不能在release版本里发行,只有在稳定以后才会放进release里边.但是这里边有很多我们经常要用的算法 ...

  3. Win10 64位+VS2015+Opencv3.3.0安装配置

    Win10 64位+VS2015+Opencv3.3.0安装配置 1.我们首先下载VS2015.OpenCV3.3.0. 1.1 VS2015下载 在官网https://visualstudio.mi ...

  4. win10+VS2015+opencv3.4.0配置方法

    win10+VS2015+opencv3.4.0配置方法 操作环境: windows10 64位opencv 3.4.0:https://opencv.org/releases.html(选择open ...

  5. win10+vs2015+opencv3.0 x86/x64配置(debug+release)

    最近做一些图像识别的项目,用到了opencv,opencv3.1没有x86版本,所以只能用opencv3.0来完成,下面介绍一下在window10下vs2015 配置opencv3.0的过程(x86和 ...

  6. opencv配置(win10+VS2015+opencv3.1)

    Step 1:准备工作 a.win10 b.vs2015 c.opencv3.1[从http://opencv.org/downloads.html下载] Step 2.开始安装 a. 双击openc ...

  7. opencv探索之路(一):win10 X64+VS2015+opencv3.10安装教程

    我的电脑64位Win10系统,现在利用VS2015安装opencv3.10.安装之路颇为艰辛,从一开始的VS2015的安装,到opencv的安装,都充满挑战,历经千辛万苦终于把opencv开发环境搭建 ...

  8. win10*64+vs2015+opencv3.0工程模板配置

    参考网上的资料,自己再次整合一下,为新手提供个方便,也为自己备份. 一.下载安装opencv3.0 1.首先下载opencv3.0的包(windows版本的) 2.安装opencv,路径自己选好,自动 ...

  9. VS2015+Opencv3.2配置(一次配好)

    对于 VS2015+QT5.8的配置我就不介绍了,由于我配置的比较早,具体有的东西忘掉了,大家可以参考下面这几篇文章. 留白留白留白留白留白(稍后补) 对于Opencv+VS的配置是我重点要说的内容. ...

随机推荐

  1. UEditor使用有感(红色),保存内容时,会自动添加p标签

    UEditor 介绍 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 1 入门部署 ...

  2. python学习(十七) 扩展python

    c, c++, java比python快几个数量级. 17.1 考虑哪个更重要 开发速度还是运行速度更重要. 17.2 非常简单的途径:Jython和IronPython Jython可以直接访问JA ...

  3. MVC中Ajax post 和Ajax Get——提交对象Model

    HTTP 请求:GET vs. POST两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST.GET - 从指定的资源请求数据POST - 向指定的资源提交要处理的数据GET 基本上 ...

  4. DFT的理解

    在以前学习的离散傅立叶变换(DFT),总是不能理解只是知道公式 X(k) = Σx(n) * WNnk    ,也不知道如何得来的. 现在可以聊聊了,因为最近在使用MATLAB实际的操作了所以比以前了 ...

  5. 安装glibc-2.14

    下载glibc-2.14.tar.gz 解压: [root@jrgc130 software]# tar xf glibc-2.14.tar.gz [root@jrgc130 software]# c ...

  6. Python re模块与正则表达式的运用

    re模块 永远不要起一个py文件的名字,这个名字和你已知的模块同名 查找 findall():     匹配所有   每一项都是列表中的一个元素 语法 :   findall(正则判断条件,要判断字符 ...

  7. OpenGL ES & SDL(转载)

    原帖:http://qqwt.blog.sohu.com/91060365.html 这个学期在学习嵌入式,由于老师的高要求.所以我们几个水手必须要完成一个项目,名字就叫OpenGL ES & ...

  8. Windchill 设计变更流程卡死查询方法

    设计变更流程卡死查询方法 1. 导出设计变更表单查看填写了“需要”和“是”字眼的文本框  2.打开进程管理器显示流程卡死的地方,确定哪里出错导致没法执行下一步  3.打开设计变更流程图,里面可以查看有 ...

  9. 主机不能访问虚拟机中的web服务【解决方案】

    百度了其它一些方法都不行,最后实在没辙,关了windows防火墙和Linux防火墙,居然能够访问了,我服. 总结一下,原来是Red Hat Linux 6.0防火墙没有开启端口80,开启的方法为(老版 ...

  10. 字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式

    Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT ...