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 下面 ...
随机推荐
- Http协议访问DataSnap Rest 服务器
用TIDHttp访问DataSnap Rest服务器,在服务器采用了用户验证的情况下,客户端需要注意下面的细节,否则不能正常连接. 假如服务器有如下的用户验证: procedure TSC.DSAut ...
- jQueryMobile控件之复选框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 转载--JAVA读取文件最佳实践
1. 前言 Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释 ...
- Java网络应用编程
1,网络连接 (1)用户向服务器发送请求(Socket); (2)服务器向用户发送信息(ServerSocket),一直监听的话用.accept(); 2,信息发送与接收 (1)客户向服务器端发送信息 ...
- linux命令:more
1.命令介绍: more用来逐页输出文件内容,空格键进入到下一页,b键返回到上一页. 2.命令格式: more [选项] 文件 3.命令参数 +n 从笫n行开始显示 -n 定义屏 ...
- js便签笔记(3)——切记:appendChild()、insertBefore()是移动element节点!
appendChild().insertBefore()是移动element节点,看书的时候注意过,也可以做一个简单的例子测试一下: <div id="div1"> & ...
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- oop、try_except、单例模式
本节大纲: 面向对象特性:封装.继承.多态.一:多态:python本身是多态,他的参数可以多种类型.可以是字符串.数字.列表等.当传入参数的时候,python可以判断参数的数据类型.而在java C# ...
- 《C与指针》第五章练习
本章问题 1.这个表达式的类型和值为多少? (/) answer:The cast is applied to the result of the division,and because both ...
- C语言中的 extern 关键字
今天在 BLE 中看到很多 extern 关键字,现在总结一下: extern 关键字主要用于在一个c文件中要用到另一个c文件中的变量或者函数. example: #extern_base.c ; # ...