基于Opencv3.0对图像进行透视变换
一,计算图片
垂直拍摄的标定板
倾斜30度拍摄的标定板
待处理图像
二,矫正效果
矫正效果图
二,源码
全局变量
//#######################################
std::vector pointsCZ, pointsQX; //垂直,倾斜
//#######################################
1,计算标定板,获取内角点坐标
//标定板内角点计算
void C透视变换Dlg::OnBnClickedButton1()
{ofstream oFileExcel1;ofstream oFileExcel2;string strExcel1 = "D:\\程序测试图片\\7_7自定义标定板2\\垂直30Excel1.csv";oFileExcel1.open(strExcel1.c_str(), ios::out | ios::trunc);string strExcel2 = "D:\\程序测试图片\\7_7自定义标定板2\\倾斜30Excel2.csv";oFileExcel2.open(strExcel2.c_str(), ios::out | ios::trunc);cv::Mat calibmat[2];int width, height;calibmat[0] = imread("D:\\程序测试图片\\7_7自定义标定板2\\cz16cm0.bmp", 4);calibmat[1] = imread("D:\\程序测试图片\\7_7自定义标定板2\\x30_0.bmp", 4);width = calibmat[0].cols;height = calibmat[0].rows;//#######################获取内角点坐标########################################################################bool iffindpoint;iffindpoint = findChessboardCorners(calibmat[0], cv::Size(7, 9), pointsCZ, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);if (iffindpoint){for (int i = 0; i < pointsCZ.size(); i++){oFileExcel1 << "[x:y]" << "," << pointsCZ[i].x << "," << pointsCZ[i].y << ",";if ((i + 1) % 7 == 0){oFileExcel1 << endl;}}oFileExcel1.close();drawChessboardCorners(calibmat[0], cv::Size(7, 9), pointsCZ, true); //用于在图片中标记角点 imwrite("D:\\程序测试图片\\7_7自定义标定板2\\垂直30.bmp", calibmat[0]);}iffindpoint = findChessboardCorners(calibmat[1], cv::Size(7, 9), pointsQX, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);if (iffindpoint){for (int i = 0; i < pointsQX.size(); i++){oFileExcel2 << "[x:y]" << "," << pointsQX[i].x << "," << pointsQX[i].y << ",";if ((i + 1) % 7 == 0){oFileExcel2 << endl;}}drawChessboardCorners(calibmat[1], cv::Size(7, 9), pointsQX, true); //用于在图片中标记角点 imwrite("D:\\程序测试图片\\7_7自定义标定板2\\倾斜30.bmp", calibmat[1]);//#######################获取内角点坐标########################################################################}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
2,通过上面获得的对应角点坐标,取其中不在同一平面上的4点计算转换矩阵,并通过转换矩阵矫正图像
//4点透视变换
void C透视变换Dlg::OnBnClickedTestButton()
{//###################################################################################################//获取映射矩阵//###################################################################################################// get original image.cv::Mat originalImage = cv::imread("D:\\程序测试图片\\7_7自定义标定板2\\dx30_1.bmp", 4);// perspective image.cv::Mat perspectiveImage;// perspective transformcv::Point2f objectivePoints[4], imagePoints[4];imagePoints[0].x = 923.43; imagePoints[0].y = 1284.55;imagePoints[1].x = 938.906; imagePoints[1].y = 857.076;imagePoints[2].x = 1590; imagePoints[2].y = 853.5;imagePoints[3].x = 1619.71; imagePoints[3].y = 1277.56;// objective points of perspective image.// move up the perspective image : objectivePoints.y - value .// move left the perspective image : objectivePoints.x - value.double moveValueX = 0.0;double moveValueY = 0.0;objectivePoints[0].x = 717.5 + moveValueX; objectivePoints[0].y = 1380.5 + moveValueY;objectivePoints[1].x = 714.5 + moveValueX; objectivePoints[1].y = 750.5 + moveValueY;objectivePoints[2].x = 1562.82 + moveValueX; objectivePoints[2].y = 745.389 + moveValueY;objectivePoints[3].x = 1563.13 + moveValueX; objectivePoints[3].y = 1379.65 + moveValueY;//获取转换矩阵 //原点 //目标点cv::Mat transform = cv::getPerspectiveTransform(objectivePoints, imagePoints);// 透视变换cv::warpPerspective(originalImage,perspectiveImage,transform,cv::Size(originalImage.rows, originalImage.cols),cv::INTER_LINEAR | cv::WARP_INVERSE_MAP);// cv::imshow("perspective image", perspectiveImage);// cvWaitKey(0);//cv::imwrite("D:\\程序测试图片\\透视变换原图.bmp", originalImage);cv::imwrite("D:\\程序测试图片\\7_7自定义标定板2\\dx30_1透视变换矫正图.bmp", perspectiveImage);//return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
3,通过1计算出的所有角点坐标计算转换矩阵,并通过转换矩阵矫正图像
//多点透视变换
void C透视变换Dlg::OnBnClickedButton2()
{//###################################################################################################//获取映射矩阵//###################################################################################################Mat math, origimg, desimg, mask;math = cv::findHomography(pointsQX, pointsCZ, mask);origimg = imread("D:\\程序测试图片\\7_7自定义标定板2\\y30_0.bmp", 4);//读取垂直标定图像//cv::perspectiveTransform(origimg,desimg,math);cv::warpPerspective(origimg, desimg, math, Size(origimg.cols, origimg.rows));imwrite("D:\\程序测试图片\\7_7自定义标定板2\\y30_0opencv多点矫正.bmp", desimg);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet"></div>
基于Opencv3.0对图像进行透视变换相关推荐
- 基于opencv3.0和zbar下条形码和二维码的识别与解码
其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...
- 基于opencv3.0下的运动车辆检测
在opencv的初等应用上,对运动物体的识别主要有帧差或背景差两种方式. 帧差法主要的原理是当前帧与前一帧作差取绝对值: 背景差主要的原理是当前帧与背景帧作差取绝对值: 在识别运动车辆上主要需要以下9 ...
- 图像凸性检测函数convexityDefects在Python2.7下使用opencv3.0的问题
最近在学习Python下的OpenCV,在图像的凸性检测中,发现opencv3.0下的convexityDefects函数对图像的凸性缺陷处理有错误.不知道是opencv3.0的版本问题还是我个人的错 ...
- opencv3.0中的无缝克隆图像——seamless_cloning(Poisson Image Editing)
opencv3.0 photo 模块加入了seamless_cloning类.该类对应的论文是"Poisson Image Editing" 主要可以实现一下功能: seamles ...
- 基于Opencv3的活动轮廓模型--CV, RSF and DRLSE
本人把CV, RSF and DRLSE等经典的活动轮廓模型转化成了基于C++,Opencv3版本的代码,仅供参考.代码的运行效率比matlab快一个数量级. CV模型.源代码下载地址:http:// ...
- 数字图像处理-3.7混合空间增强法-骨骼图 基于opencv3.4.3的实现
引子 刚开始看冈萨雷斯的<数字图像处理>时,3.7节 混合空间增强法中图3.4.3中的全身骨骼图的印象非常深刻.牛XX啊,这么模糊,都能变得这么清楚.虽然书中也给出了大段大段的解释,但是能 ...
- OpenCV3.0中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码
关于OpenCV3中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,汇总如下: cv::Algorithm cv::BackgroundSubtractor cv::Backgro ...
- python基于水色图像的水质评价_基于Python和遥感图像的膨胀与腐蚀操作
引言 膨胀与腐蚀是图像形态学中的基本操作,本文将从两个角度实现python的膨胀与腐蚀算法,分别是特征提取与分割后处理.目前,在RGB图像领域,这两种形态学算法经常用于分割结果的处理,例如连通区处理. ...
- Ubuntu 安装OpenCV3.0.0
Ubuntu安装OpenCV3.0.0 为了看看opencv3.0的HDR效果,尝试安装opencv3.0到ubuntu12.04上面,安装了好几次终于成功了. 参考博客: http://www.sa ...
最新文章
- linux shell sed d删除指定行并更换分隔符为#
- LINQ中的动态排序
- [BZOJ3751] [NOIP2014] 解方程 (数学)
- 【SICP练习】127 练习3.58
- Winform可读取html语言,C# Winform 用WebBrowser实现 Html 编辑功能
- PHP 利用cron 实现文章同步至新浪、网易等微博
- Ext.Net 最新版(2011-06-24)License 问题
- 1130: 零起点学算法37——求阶乘
- Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解
- Datawhale编程学习之数组和链表(1)
- 非线性动力学_第17届全国非线性振动暨第14届全国非线性动力学 和运动稳定性学术会议在南京召开...
- My97DatePicker组件使用方法
- VSCode改变字体大小
- 【Vue项目复习笔记】详情页的展示
- 第四届蓝桥杯JavaC组国(决)赛真题
- 2019考研上海交通大学823计算机通信网真题回忆
- 卧槽!我的世界也有开源版本了!!!
- bat脚本中如何多次键盘输入并判断_万花筒自动发布信息脚本【操作简单】
- Gym 101431B Vera and Banquet (后缀数组)
- 实战:k8s中网络策略实验(成功测试-博客输出)-20211005
热门文章
- mysql停止更新时间_我如何更新这个MySQL查询以获取从开始、停止、暂停和恢复事件经过的总时间...
- (三.0)通过FPGA实现以太网通信原理及理解
- ubuntu mysql主从备份_Ubuntu 16 MySQL主从备份配置
- mysql建表测试_总结MySQL建表、查询优化实用小技巧
- @property (nonatomic,retain)中的nonatom和retain是什么意思
- Finding all unique triplets that sums to zero[部分转载]
- 浅议“全局变量”、“多线程”和“编译器陷阱”
- Apache工具库——Apache Commons的使用
- String.GetEnumerator 方法的C#例子
- 共性的缺失——由博客想到的