vs2015+opencv3.3.1 +Eigen 3.3.4 c++ 实现 泊松图像编辑(无缝融合)
#define EIGEN_USE_MKL_ALL
#define EIGEN_VECTORIZE_SSE4_2
#include <iostream>
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp" #include <Eigen/Sparse>
#include <time.h>
using namespace std;
using namespace cv;
using namespace Eigen; int main()
{
int t = time(NULL);
const string File = "5.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("55.jpg", 1);
Mat ima1 = imread("555.jpg", 1); Point p0(50, 215);
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) = 4*ima.at<Vec3b>(p1)[0]- ima.at<Vec3b>(p1+Point(0,1))[0] - ima.at<Vec3b>(p1+Point(1, 0))[0] - ima.at<Vec3b>(p1-Point(0,1))[0]- ima.at<Vec3b>(p1 - Point(1, 0))[0];
src21(n) = 4 * ima.at<Vec3b>(p1)[1] - ima.at<Vec3b>(p1 + Point(0, 1))[1] - ima.at<Vec3b>(p1 + Point(1, 0))[1] - ima.at<Vec3b>(p1 - Point(0, 1))[1] - ima.at<Vec3b>(p1 - Point(1, 0))[1];
src22(n) = 4 * ima.at<Vec3b>(p1)[2] - ima.at<Vec3b>(p1 + Point(0, 1))[2] - ima.at<Vec3b>(p1 + Point(1, 0))[2] - ima.at<Vec3b>(p1 - Point(0, 1))[2] - ima.at<Vec3b>(p1 - Point(1, 0))[2];
}
else {
src1.insert(n, n) = 1;
src20(n) = ima1.at<Vec3b>(p1+p0)[0];
src21(n) = ima1.at<Vec3b>(p1 + p0)[1];
src22(n) = ima1.at<Vec3b>(p1 + p0)[2]; };
++n;
}
// cout << src1; VectorXd dst00; VectorXd dst01; VectorXd dst02;
SparseLU <SparseMatrix <double>, COLAMDOrdering< int >> solver;
src1.makeCompressed();
solver.compute(src1);
// 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++) {
p1.x = j; p1.y = i;
if (pointPolygonTest(contours[0], p1, false) > 0) {
ima1.at<Vec3b>(i + p0.y, j + p0.x)[0] = dst00(n) < 0?0: dst00(n);
ima1.at<Vec3b>(i + p0.y, j + p0.x)[1] = dst01(n)< 0 ? 0 : dst01(n);
ima1.at<Vec3b>(i + p0.y, j + p0.x)[2] = dst02(n)< 0 ? 0 : dst02(n);
} n++;
} imshow("Contours Image", imageContours); //轮廓
imshow("Point of Contours", Contours); //向量contours内保存的所有轮廓点集
imshow("Poin", ima1);
cout<<(time(NULL) -t );
waitKey(0); system("pause");
return 0;
}
5.jpg

55.jpg

555.jpg

生成的图片

vs2015+opencv3.3.1 +Eigen 3.3.4 c++ 实现 泊松图像编辑(无缝融合)的更多相关文章
- vs2015+opencv3.3.1 +Eigen 3.3.4 c++实现 薄膜插值 泊松图像编辑(v=0||Δf=0)
#include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/i ...
- win7下VS2015+opencv3.1.0配置
由于opencv与vs的适配版本不同,本人在官网下载opencv3.1.0,其可以和VS2013.VS2015适配,文中以VS2015为例 opencv2.4.13-----vc11;vc12 ope ...
- [转]VS2015+OpenCV3.3 GPU模块和opencv_contrib模块的编译以及采用CMake编译opencv_contrib时提示“No extra modules found in folder”问题的解决方案
据官方说法,目前还不是太稳定的算法模块都在opencv_contrib里边,由于不稳定,所以不能在release版本里发行,只有在稳定以后才会放进release里边.但是这里边有很多我们经常要用的算法 ...
- Win10 64位+VS2015+Opencv3.3.0安装配置
Win10 64位+VS2015+Opencv3.3.0安装配置 1.我们首先下载VS2015.OpenCV3.3.0. 1.1 VS2015下载 在官网https://visualstudio.mi ...
- win10+VS2015+opencv3.4.0配置方法
win10+VS2015+opencv3.4.0配置方法 操作环境: windows10 64位opencv 3.4.0:https://opencv.org/releases.html(选择open ...
- win10+vs2015+opencv3.0 x86/x64配置(debug+release)
最近做一些图像识别的项目,用到了opencv,opencv3.1没有x86版本,所以只能用opencv3.0来完成,下面介绍一下在window10下vs2015 配置opencv3.0的过程(x86和 ...
- opencv配置(win10+VS2015+opencv3.1)
Step 1:准备工作 a.win10 b.vs2015 c.opencv3.1[从http://opencv.org/downloads.html下载] Step 2.开始安装 a. 双击openc ...
- opencv探索之路(一):win10 X64+VS2015+opencv3.10安装教程
我的电脑64位Win10系统,现在利用VS2015安装opencv3.10.安装之路颇为艰辛,从一开始的VS2015的安装,到opencv的安装,都充满挑战,历经千辛万苦终于把opencv开发环境搭建 ...
- win10*64+vs2015+opencv3.0工程模板配置
参考网上的资料,自己再次整合一下,为新手提供个方便,也为自己备份. 一.下载安装opencv3.0 1.首先下载opencv3.0的包(windows版本的) 2.安装opencv,路径自己选好,自动 ...
随机推荐
- 如何安装pip
1.安装python之后进入到python的安装目录,里面有个Scripts文件夹,打开文件夹里面有个easy_install.exe的文件 2.打开控制台,到easy_install.exe的文件地 ...
- Python实现SSH连接远程服务器
首先需要安装paramiko模块 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import paramiko ssh = p ...
- Bokeh绘图
http://bokeh.pydata.org/en/latest Bokeh 是一个专门针对Web浏览器的呈现功能的交互式可视化Python库.这是Bokeh与其它可视化库最核心的区别. 专门针对 ...
- c#winform图片绘制与图片验证码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 微信小程序中遇到的wx:if问题
最近在项目中遇到wx:if问题进行梳理一下,有个需求就是有数据的时候显示数据列表,没有数据的时候就显示‘去赚钱’的页面,这可以放在一个页面进行显示,就要用到wx:if判断.我在js中设置了一个变量sh ...
- 14-EasyNetQ之用Future Publish发布预定中事件
很多商业流程需要事件在未来的时间按照预定时间发布.例如,在初次与客户接触后,可以在未来某个时间去电话回访客户.EasyNetQ可以用它的Future Publish功能帮你实现这个功能.举例:这里我们 ...
- Ubuntu16.04安装之后的几个设置
Ubuntu16.04安装之后的几个设置 Ubuntu16.04界面很漂亮,但是安装之后,需要做如下几个简单的设置,这样用的时候会更加顺畅. 1.中文支持 在右上角有一个齿轮,点击->Syste ...
- opennebula 开发记录
/app/opennebula/var//datastores/1/12933297f0ffeba3e55bbccabcb3153b to 127.0.0.1:/app/opennebula/data ...
- wordpress+lnmp出现 404 Not Found nginx
在本地使用Apache,因此进行重写规则是.htaccess文件,但在Nginx服务器中此文件不起作用. 只需在网站的虚拟机配置文件中添加如下 location / { if (-f $request ...
- Django rest_framework----认证,权限,频率组件
认证 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions impor ...