透视变换--基于getPerspectiveTransform()及像素赋值(未涉及插值)
好久没写博客了,因为白天要去实习,晚上看论文实在抽不出时间,由于项目需要,研究了透视变换,在网上找了一圈不是缺腿就是少胳膊的,后来对缺省的代码进行补充使其可以调通,现贴出来供大家学习使用,代码如下:
- #include<iostream>
- #include<opencv2/highgui/highgui.hpp>
- #include<opencv2/imgproc/imgproc.hpp>
- using namespace cv;
- using namespace std;
- int main( )
- {
- Mat img=imread("1.jpg");
- int img_height = img.rows;
- int img_width = img.cols;
- vector<Point2f> corners(4);
- corners[0] = Point2f(0,0);
- corners[1] = Point2f(img_width-1,0);
- corners[2] = Point2f(0,img_height-1);
- corners[3] = Point2f(img_width-1,img_height-1);
- vector<Point2f> corners_trans(4);
- corners_trans[0] = Point2f(150,250);
- corners_trans[1] = Point2f(771,0);
- corners_trans[2] = Point2f(0,img_height-1);
- corners_trans[3] = Point2f(650,img_height-1);
- Mat transform = getPerspectiveTransform(corners,corners_trans);
- cout<<transform<<endl;
- vector<Point2f> ponits, points_trans;
- for(int i=0;i<img_height;i++){
- for(int j=0;j<img_width;j++){
- ponits.push_back(Point2f(j,i));
- }
- }
- perspectiveTransform( ponits, points_trans, transform);
- Mat img_trans = Mat::zeros(img_height,img_width,CV_8UC3);
- int count = 0;
- for(int i=0;i<img_height;i++){
- uchar* p = img.ptr<uchar>(i);
- for(int j=0;j<img_width;j++){
- int y = points_trans[count].y;
- int x = points_trans[count].x;
- uchar* t = img_trans.ptr<uchar>(y);
- t[x*3] = p[j*3];
- t[x*3+1] = p[j*3+1];
- t[x*3+2] = p[j*3+2];
- count++;
- }
- }
- imwrite("1_trans.jpg",img_trans);
- namedWindow("原图");
- imshow("原图", img);
- namedWindow("透视变换图");
- imshow("透视变换图", img_trans);
- waitKey(0);
- return 0;
- }
原图:
透视变换之后的效果图:
转载自:https://blog.csdn.net/llx1026/article/details/78289247
透视变换--基于getPerspectiveTransform()及像素赋值(未涉及插值)相关推荐
- opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用
透视变换在图像还原的上的应用很广泛,他是将成像投影到一个新的视平面.比如两个摄像头在不同的角度对统一物体进行拍照,物体上的同一个点在两张照片上的坐标是不一样的,为了实现两张图片同一个点的对应关系映射, ...
- HALCON示例程序check_fish_stick_dimension.hdev生鱼棒尺寸测量;基于形态学的像素级精度尺寸测量
HALCON示例程序check_fish_stick_dimension.hdev基于形态学的像素级精度尺寸测量 示例程序源码(加注释) 关闭实时显示更新 dev_update_off () 关闭窗口 ...
- 基于 FFMPEG 的像素格式变换(swscale,致敬雷霄骅)
基于 FFMPEG 的像素格式变换(swscale,致敬雷霄骅) 前几天写了几篇关于ffmpeg 编程转封装的入门文章,下一步本来是要写转码或者编码的.但是发现无论是转码还是编码,都会遇到图像像素格式 ...
- python 赋值方法_基于Python List的赋值方法
Python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不 ...
- R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates)
R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates) 目录
- 转载 基于bayer型阵列的空间域插值
基于bayer型阵列的空间域插值算法分 蒲杰 女,重庆邮电大学,在读硕士,研究方向为移动通信. 李振中 重庆邮电大学通信与信息工程学院. 屈刚 江苏省邮电规划设计院有限责任公司. 1 引言 在数码照相 ...
- 基于主动学习和克里金插值的空气质量推测
基于主动学习和克里金插值的空气质量推测 常慧娟, 於志文, 於志勇, 安琦, 郭斌 西北工业大学计算机学院,陕西 西安 710072 福州大学数学与计算机科学学院,福建 福州 350108 摘要 ...
- 基于 Python 的自然邻域法空间插值的实现与优化
接上期基于 Python 的自然邻域法空间插值的实现与思考. 上期说到,我们仅仅利用自然邻域法基础原理进行插值,会出现许多空值.异常值,且与ArcGIS相同分辨率.范围下的插值结果对比(对比图 ...
- 基于ArcGis栅格数据的腌膜、插值、分类色带等图像处理
基于ArcGis栅格数据的腌膜.插值.分类色带等图像处理 问题 因源数据缺失以及色带问题,导致图像很难看. 腌膜处理 ArcToolbox>Spatial Analyst工具>提取分析&g ...
最新文章
- 将数据库的0和1显示为jsp页面的是和否
- Ordering Tasks
- 我的世界连锁挖矿下载JAVA_我的世界1.7.10连锁挖矿整合包
- 实体类的动态生成(三)
- 操作系统【六】虚拟内存
- tcp协议seq和ack
- 微软原生 Notepad 融入 VS Code 才是出路?
- python3.4连接mysql5.7数据库增删改查
- ubuntu-12.04.4-server安装
- mockito简单教程
- Jensen不等式及其扩展
- PHP-利用阿里云邮件推送免费发邮件详细步骤
- excel自动调整列宽_Java 设置Excel自适应行高、列宽
- 波束成形技术原理解析
- bzoj5442: [Ceoi2018]Global warming
- python开发工程师招聘要求
- div html 下边加横线_css字体下边横线 html超链接更改颜色和去掉下划线
- 成都艾司博讯:什么是拼多多网店的品质退款率?
- Rancher简介和部署
- 货车驱动桥设计英文资料翻译
热门文章
- 23.网市场云建站系统部署
- 【Day04】介绍防抖节流原理、区别以及应用,并用 JavaScript 进行实现
- 【C语言】利用二维数组输出成绩
- C#LeetCode刷题之#824-山羊拉丁文​​​​​​​(Goat Latin)
- 通用职责分配软件原则之3-低耦合原则
- 关于黑名单和白名单的一些思考
- javascript教程_JavaScript教程
- 如何在Windows上安装Angular:Angular CLI,Node.js和构建工具指南
- u8薪资管理_用友U8习题集
- dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存