opencv透视变换
关于透视投影的几何知识,以及求解方法,可以参考
http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter06/chapt06_ahz.htm
http://blog.csdn.net/xiaowei_cqu/article/details/26471527
此外,opencv1那本书183页也有讲
这里,实现一个贴图,主要参考
http://www.cnblogs.com/tiandsp/p/4033071.html
那篇博客用的matlab,这里使用opencv2实现
原图
代码
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <vector>
#include <fstream> using namespace std;
using namespace cv; Mat rawImg, dstImg,boardImg,dstboard,maskboard;
vector<Point2f>srcQuad();
vector<Point2f>dstQuad(); void on_mouse(int event, int x, int y, int flags, void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号
{
Point pt;//坐标点;
char coordinateName[];
static int n=; if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取坐标,并在图像上该点处划圆
{
pt = Point(x, y);
cout << x << " " << y << endl;
dstQuad[n] = pt;
n++;
circle(boardImg, pt, , Scalar(, , , ), CV_FILLED, CV_AA, );//划圆
sprintf(coordinateName, "(%d,%d)", x, y);
putText(boardImg, coordinateName, pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(, , , ), , );//在窗口上显示坐标
if (n >= )
{
//imshow("board", boardImg);
cvDestroyAllWindows();
}
}
}
int main()
{
rawImg = imread("lena.jpg",);//图片路径
boardImg = imread("board.jpg",);
dstboard = boardImg.clone();
cvNamedWindow("board",);
setMouseCallback("board",on_mouse,);
imshow("board",boardImg);
waitKey();
imshow("raw", rawImg);
imshow("board", boardImg);
int imgHeigth = rawImg.rows;
int imgWidth = rawImg.cols;
int dstHeigth = boardImg.rows;
int dstWidth = boardImg.cols;
srcQuad[] = Point2f(,);//左上 右上 左下 右下
srcQuad[] = Point2f(imgWidth-, );
srcQuad[] = Point2f(, imgHeigth - );
srcQuad[] = Point2f(imgWidth - , imgHeigth - );
/*dstQuad[0] = Point2f(imgWidth*0.05, imgHeigth*0.33);
dstQuad[1] = Point2f(imgWidth*0.9, imgHeigth*0.25);
dstQuad[2] = Point2f(imgWidth*0.2, imgHeigth*0.7);
dstQuad[3] = Point2f(imgWidth*0.8, imgHeigth*0.9);*/
for (int i = ; i < ; i++)
cout << dstQuad[i] << endl; Mat warpMatrix = getPerspectiveTransform(srcQuad, dstQuad);
cout << warpMatrix << endl;
warpPerspective(rawImg, dstImg, warpMatrix, Size(dstWidth, dstHeigth)); threshold(dstImg, maskboard, , , THRESH_BINARY);
cout << "begin a test of cout to file." << endl;
// 保存cout流缓冲区指针
streambuf* coutBuf = cout.rdbuf();
ofstream of("out.txt");
// 获取文件out.txt流缓冲区指针
streambuf* fileBuf = of.rdbuf();
// 设置cout流缓冲区指针为out.txt的流缓冲区指针
cout.rdbuf(fileBuf);
cout << maskboard << endl; of.flush();
of.close();
// 恢复cout原来的流缓冲区指针
cout.rdbuf(coutBuf);
//imshow("rawboard", dstboard);
cout << "Write Personal Information over..." << endl;
for (int i = ; i < dstHeigth - ; i++)
for (int j = ; j < dstWidth - ; j++)
dstImg.at<uchar>(i, j) = dstImg.at<uchar>(i, j)*maskboard.at<uchar>(i, j)
+ dstboard.at<uchar>(i, j)*(-maskboard.at<uchar>(i, j));
imshow("result", dstImg);
waitKey();
return ;
}
结果
opencv透视变换的更多相关文章
- 对倾斜的图像进行修正——基于opencv 透视变换
这篇文章主要解决这样一个问题: 有一张倾斜了的图片(当然是在Z轴上也有倾斜,不然直接旋转得了o(╯□╰)o),如何尽量将它纠正到端正的状态. 而要解决这样一个问题,可以用到透视变换. 关于透视变换的原 ...
- Java基于opencv—透视变换矫正图像
很多时候我们拍摄的照片都会产生一点畸变的,就像下面的这张图 虽然不是很明显,但还是有一点畸变的,而我们要做的就是把它变成下面的这张图 效果看起来并不是很好,主要是四个顶点找的不准确,会有一些偏差,而且 ...
- OpenCV 透视变换实例
参考文献: http://www.cnblogs.com/self-control/archive/2013/01/18/2867022.html http://opencv-code.com/tut ...
- opencv透视变换GetPerspectiveTransform的总结
对于透视变换,必须为map_matrix分配一个3x3数组,除了3x3矩阵和三个控点变为四个控点外,透视变化在其他方面与仿射变换完全类似.具体可以参考:点击打开链接 主要用到两个函数WarpPersp ...
- OpenCV】透视变换 Perspective Transformation(续)
载分 [OpenCV]透视变换 Perspective Transformation(续) 分类: [图像处理] [编程语言] 2014-05-27 09:39 2776人阅读 评论(13) 收藏 举 ...
- 【OpenCV】透视变换矫正
演示结果参考: 功能实现:运行程序,会显示图片的尺寸,按回车键后,依次点击需矫正的图片的左上.右上.左下.右下角,并能显示其坐标,结果弹出矫正后的图片,如图上的PIC2对话框.可以继续选择图片四个点进 ...
- OpenCV图像变换(仿射变换与透视变换)
仿射变换(affine transform)与透视变换(perspective transform)在图像还原.图像局部变化处理方面有重要意义.通常,在2D平面中,仿射变换的应用较多,而在3D平面中, ...
- opencv实践::透视变换
问题描述 拍摄或者扫描图像不是规则的矩形,会对后期处理产生不 好影响,需要通过透视变换校正得到正确形状. 解决思路 通过二值分割 + 形态学方法 + Hough直线 +透视变换 #include &l ...
- 深入学习OpenCV文档扫描及OCR识别(文档扫描,图像矫正,透视变换,OCR识别)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...
随机推荐
- 由于@@ServerName等问题对SQL增量升级脚本进行补充
由于@@ServerName在安装数据库之后修改了机器名的情况下,获取到的内容仍然是原来的机器名,造成数据库连接失败, 所以不能直接使用该全局变量. 此外对升级脚本的执行方式做了一下调整,将版本的判断 ...
- Ubuntu操作系统安装使用教程 (转)
随着微软的步步紧逼,包括早先的Windows黑屏计划.实施,逮捕番茄花园作者并判刑,种种迹象表明,中国用户免费使用盗版Windows的日子将不会太长久了,那么这个世界上有没有即免费又易用的操作系统呢? ...
- 新策略构思 dual thrust
根据dual truest的策略,因为是针对日线级别的.同理我们可以根据60分钟级别开发出一套策略,等有时间写在下面
- 来自HeroKu的HTTP API 设计指南(中文版)
原文转自:http://get.jobdeer.com/343.get 来自HeroKu的HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国内 ...
- cut - 小巧的文本截取工具
简介 cut命令是Unix下的一个命令行程序.cut命令是以行为单位来处理的.cut命令处理的是标准输入,所以可以结合管道来进行文本的处理. 命令格式 cut option… [file]… cut命 ...
- H5版俄罗斯方块(3)---游戏的AI算法
前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...
- Shell 环境变量 & 参数变量
环境变量 $HOME 当前用户的家目录 $PATH 以冒号分隔的用来搜索命令的目录列表 $PS1 命令提示符,通常是$字符,但在bash中,可以使用一些更复杂的值.例如,字符串[\u@\h \w]$就 ...
- LeetCode-Group Anagrams
Given an array of strings, group anagrams together. For example, given: ["eat", "tea& ...
- Android——配置文件的保存SharedPreferences进行数据存储
很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果 ...
- mysql操作汇集
1.修改root密码 cmd进如mysql的bin目录 >mysql -u root -p Enter password: ****** mysql> use mysql; mysql&g ...