#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. 张瀚荣:如何用UE4制作3D动作游戏

    转自:http://www.gamelook.com.cn/2015/06/218267 GameLook报道/ 6月5日,2015年第三期GameLook开放日‧虚幻引擎专场活动在上海正式举行,此次 ...

  2. MFC学习(六)计算器

    1 stdafx.h  所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H.Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使 ...

  3. 概览JVM的基本结构和JVM内存结构

    概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...

  4. 配置环境是程序员的第一步 -- Windows 10 下 MySQL 安装

    MySQL 作为最典型的关系型数据库管理系统,由于其体积小.速度快.总体拥有成本低,尤其是其开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库.MySQL 社区版的功能也足够我们 ...

  5. Unity3d平台信息设置

    [Unity3d平台信息设置] 通过"Edit" -> "Project Settings" -> "Player"菜单选项.打 ...

  6. JSP页面使用EL表达式出现的问题:javax.el.PropertyNotFoundException: Property 'ID' not found on type java.lang.Str

    问题描述: 1. 后台返回到JSP前台的的list,在jsp页面使用EL表达式遍历时出现如下问题:javax.el.PropertyNotFoundException: Property 'ID' n ...

  7. Log4php使用指南

      一.Log4php简介 Log4php是Log4xx系列日志组件之一,是Log4j迁移到php的版本,主要用来记录日志信息,支持多种输入目的地,包括:日志文件.日志回滚文件.数据库.日志服务器等等 ...

  8. c语言实践输出某个区间中不是3的倍数的偶数

    OK,先审题,我们最后要输出的那些数是需要满足两个条件的,第一个条件是,这个数不是3的倍数,第二个条件是这个数是偶数.也就是这样的数需要同时满足这两个条件的时候才把这个数输出. 不是3的倍数这个条件在 ...

  9. 【linux命令】setterm控制终端属性命令(中英文)

    [linux命令]setterm控制终端属性命令(中英文) 2018年03月23日 17:13:44 阅读数:489 标签: linux 更多 个人分类: linux 摘自:https://blog. ...

  10. ifcfg-eth0文件参数PREFIX 和 NETMASK的配置不一致问题

    ifcfg-eth0文件参数PREFIX 和 NETMASK的配置不一致问题 摘自:https://blog.csdn.net/aikui0621/article/details/9148997 阅读 ...