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 下面 ...
随机推荐
- GoldenGate 12.2 支持不可见列invisible column的复制
Oracle Goldengate 12.2现在可以复制不可见列,在以前的版本中是没有此项功能的.示例:在源和目标都创建一个不可见和虚拟列commission SQL> create tabl ...
- JavaScript基础--简单功能的计算器(十一)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- How do I uninstall Java 7 and later versions on my Mac?
How do I uninstall Java 7 and later versions on my Mac? http://www.java.com/en/download/help/mac_uni ...
- BlackHat会议上将公布一款免费的汽车黑客工具
汽车,无可厚非是现代社会很重要的交通工具,但与此同时却也带来了诸多安全隐患,不管怎样,汽车安全都是我们不可忽视的一个重大问题. 即将免费分享该工具 近日一名法国研究者将发布一款检测汽车安全漏洞的工具, ...
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
#!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...
- IPC-管道
内容提要: 管道简介 使用无名管道实现一个简单的本地文件服务器 使用标准I/O函数库提供的管道实现 使用popen实现本地文件服务器 有名管道-FIFO 使用FIFO改写本地文件服务器 管道和FIFO ...
- CentOS 6.5 安装CodeBlocks
CentOS 6.5 安装CodeBlocks 经历了无数痛苦的折磨,Linux上的库依赖真是能把人逼疯,终于在Google上找到了办法,勉强将CodeBlocks安装成功. 1.为了避免最新版本的C ...
- [读书笔记]OSGI-灵活的类加载器架构
以下内容来自周志明的<深入理解Java虚拟机>. 学习JEE规范,去看JBoss源码:学习类加载器,就去看OSGI源码. OSGI,即Open Service Gateway Initia ...
- qsort函数用法【转】
qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(con ...
- 防止特殊html字符的问题(xxs攻击)方法
快速对字符转义,避免跨站攻击XSS XSS已经成为非常流行的网站攻击方式,为了安全起见,尽量避免用户的输入.可是有些情况下不仅不避免,反而要求鼓励输入,比如写博客.博客园开放性很高,可以运行手写的 ...