#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include "iostream"
#include <Eigen/Sparse>
using namespace std;
using namespace cv;
using namespace Eigen; int main()
{
const string File = "789.jpg";
Mat imageSource = imread(File, 0);
for (unsigned int i = 0; i < imageSource.rows; i++)
for (unsigned j = 0; j < imageSource.cols; j++)
if (imageSource.at<uchar>(i, j) != 0)imageSource.at<uchar>(i, j) = 255;
namedWindow("Source Image");
imshow("Source Image", imageSource); Mat image;
GaussianBlur(imageSource, image, Size(15, 15), 0);
Canny(image, image, 100, 250);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(image, contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE, Point());
Mat imageContours = Mat::zeros(image.size(), CV_8UC1);
Mat Contours = Mat::zeros(image.size(), CV_8UC1); //绘制
//contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数
int cont_area_M = 0;
for (int i = 0; i < contours.size(); i++) {
if (contourArea(contours[i])>cont_area_M)
cont_area_M = contourArea(contours[i]);
for (int j = 0; j < contours[i].size(); j++)
{
//绘制出contours向量内所有的像素点
Point P = Point(contours[i][j].x, contours[i][j].y);
Contours.at<uchar>(P) = 255; }
}
//绘制轮廓 auto itc = contours.begin(); while (itc != contours.end())
{
if (contourArea(*itc)<cont_area_M - 1)
itc = contours.erase(itc);
else
++itc; } drawContours(imageContours, contours, 0, Scalar(255), 1, 8, hierarchy, 0); Rect rect = boundingRect(contours[0]); Mat ima = imread("7892.jpg", 1); Point p1(0, 0); int n = 0; SparseMatrix< double, ColMajor> src1((rect.height + 2)*(rect.width + 2), (rect.height + 2)*(rect.width + 2));
VectorXd src20((rect.height + 2)*(rect.width + 2));
VectorXd src21((rect.height + 2)*(rect.width + 2));
VectorXd src22((rect.height + 2)*(rect.width + 2)); for (int i = rect.y - 1; i < rect.height + rect.y + 1; i++)
for (int j = rect.x - 1; j < rect.width + rect.x + 1; j++)
{
p1.x = j; p1.y = i;
if (pointPolygonTest(contours[0], p1, false) >0)
{
src1.insert(n, n) = 4;
src1.insert(n, n - 1) = -1;
src1.insert(n, n + 1) = -1;
src1.insert(n, n - rect.width - 2) = -1;
src1.insert(n, n + rect.width + 2) = -1;
src20(n) = 0;
src21(n) = 0;
src22(n) = 0;
}
else {
src1.insert(n, n) = 1;
src20(n) = ima.at<Vec3b>(p1)[0];
src21(n) = ima.at<Vec3b>(p1)[1];
src22(n) = ima.at<Vec3b>(p1)[2]; };
++n;
}
// cout << src1; VectorXd dst00; VectorXd dst01; VectorXd dst02;
SparseLU <SparseMatrix <double, ColMajor>> solver;
solver.analyzePattern(src1);
solver.factorize(src1);
dst00 = solver.solve(src20);
dst01 = solver.solve(src21);
dst02 = solver.solve(src22); n = 0; for (int i = rect.y - 1; i < rect.height + rect.y + 1; i++)
for (int j = rect.x - 1; j < rect.width + rect.x + 1; j++) {
ima.at<Vec3b>(i, j)[0] = dst00(n);
ima.at<Vec3b>(i, j)[1] = dst01(n);
ima.at<Vec3b>(i, j)[2] = dst02(n);
n++;
} imshow("Contours Image", imageContours); //轮廓
imshow("Point of Contours", Contours); //向量contours内保存的所有轮廓点集
imshow("Poin", ima);
waitKey(0); system("pause");
return 0;
}

 789.jpg 

7892.jpg

结果

大概十几s到40s出结果。

vs2015+opencv3.3.1 +Eigen 3.3.4 c++实现 薄膜插值 泊松图像编辑(v=0||Δf=0)的更多相关文章

  1. vs2015+opencv3.3.1 +Eigen 3.3.4 c++ 实现 泊松图像编辑(无缝融合)

    #define EIGEN_USE_MKL_ALL #define EIGEN_VECTORIZE_SSE4_2 #include <iostream> #include "co ...

  2. win7下VS2015+opencv3.1.0配置

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

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

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

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

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

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

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

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

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

  7. 微软今日发布汇总:VS2015, .NET 4.6, C# 6.0, F# 4.0等重量级产品正式上线

    Visual Studio Visual Studio 2015 下载 VS2015新功能列表 ‘ Visual Studio 2013 更新包 5.0 下载 其中包含Visual Studio 20 ...

  8. VS2015, .NET 4.6, C# 6.0, F# 4.0等重量级产品正式上线

    VS2015, .NET 4.6, C# 6.0, F# 4.0等重量级产品正式上线 Visual Studio Visual Studio 2015 下载 VS2015新功能列表 ‘ Visual ...

  9. utuntu16.04安装caffe+Matlab2017a+opencv3.1+CUDA8.0+cudnn6.0

    上午把tensorflow安装好了,下午和晚上装caffe的确很费劲. 默认CUDA,cuDNN可以用了 caffe官方安装教程 有些安装顺序自己也不清楚,简直就是碰运气 1. 安装之前依赖项 Gen ...

随机推荐

  1. 转:Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  2. C过程思想,根据需求写方法就行

     实现的方法有多种 Comprehensive orientate 2017/10/27 13:25:07 C过程思想,根据需求写方法就行  

  3. dubbo学习 一 dubbo概述

    1,背景     1,网站刚开时候的时候可能所有的功能业务都在一个应用里面 2,当业务不断复杂,流量不断增多的时候,就需要将原先的一个应用划分成多个独立的应用. 3,当分出来的业务越来越多的时候,应用 ...

  4. 微信公众号php从0开发,包括功能(自定义菜单,分享)

    之前写的一篇微信公众号文章. 工作需要,进行此次调研,并记录开发过程. 开发目的,页面授权,页面获取用户头像,用户昵称 微信id, 分享页面. 微信订阅号 无法获取用户个人信息 写在记录前,公众号也是 ...

  5. 每天一个Linux命令 - 【groupadd】

    [命令]:grouadd [语法]:groupadd [选项]   [参数] [功能介绍]:groupadd 命令勇于创建新的工作组,新工作组的信息将被添加的系统文件中. [选项说明]: -g < ...

  6. log4net 入门教程

    1.下载dll 下载地址:http://mirror.reverse.net/pub/apache/logging/log4net/binaries/ github:https://github.co ...

  7. Linux的基本指令--

     VIM简介: Vi有三种基本工作模式 1.命令模式 2.文本输入模式 3. 末行模式 VIM基本操作: 一 . 进入插入模式: i: 插入光标前一个字符 I: 插入行首 a: 插入光标后一个字符 A ...

  8. oracle使用exp/imp导入导出(用户)

    实例,从远程机器上导出nxgy用户的所有对象和数据,然后导入到本机数据库的nxgy用户里(用户名可自定义) 如果本机nxgy用户已经存在(数据没用,可以删除),级联删除用户所有对象 首先,从远程机器上 ...

  9. maven学习总结-eclipse开发

    一.创建Web项目 1.1 选择建立Maven Project 选择File -> New ->Project,如下图所示:

  10. PCL struct“flann::SearchParams参数错误

    最近在使用PCL的KdTreeFLANN的时候报错:error C2079: “pcl::KdTreeFLANN<PointT>::param_radius_”使用未定义的 struct“ ...