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 下面 ...
随机推荐
- Ubuntu user switch
To list all users you can use: cut -d: -f1 /etc/passwd To add a new user you can use: sudo adduser n ...
- 详解<a>标签
相信对于学前端的人而言<a>标签并不陌生,我们先把他所有的属性列出来 一.主要属性 一般来说,a标签有着四种状态,分别是link,hover,active,visited,接下来我会仔细讲 ...
- marquee|各种文字滚动代码(适用公告)
marquee|各种文字滚动代码(适用公告)
- [Algorithm Basics] Sorting, LinkedList
Time complexity: Binary search O(log2 n): i=0. n elements: ------------------- i=1. n/2 ...
- “cv”: 具有该名称的命名空间不存在
记得添加#include<highgui.h> 无法解析的外部符号 遇到这种问题一般都是由于缺少相应的库文件 右击项目,选择“属性”--“链接器”--“输入”--“附加依赖项” 根据错误中 ...
- import和from import陷阱一
#from datetime import datetime import datetime format="output-%Y-%m-%d-%H%M%S.txt" str=&qu ...
- SVG文档的注意事项
SVG 是 HTML5 关于描述矢量图的元素.可以写在 <html> </html> 中,也可以保存为一个单独的.svg文件. 单独作为一个svg文件的时候,有一点规则需要注意 ...
- PAT (Basic Level) Practise:1032. 挖掘机技术哪家强
[题目链接] 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行 ...
- Kubuntu 使用YaH3C进行中大校园网认证
之前都是用路由器连网线上网,我也没注意到inode校园网客户端在linux上的问题.直到前两天把路由器给搞残废了,只能默默的找办法装inode.根据学校网络中心给的教程,在kubuntu上尝试安装in ...
- python数据结构与算法——图的最短路径(Floyd-Warshall算法)
使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 # 城市地图(字典的字典) # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直 ...