版权声明:本文为业余狙击手原创文章,欢迎阅读,欢迎转载,转载请注明出处,谢谢。 https://blog.csdn.net/sxlsxl119/article/details/75087675

一,计算图片

垂直拍摄的标定板


倾斜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对图像进行透视变换相关推荐

  1. 基于opencv3.0和zbar下条形码和二维码的识别与解码

    其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

  2. 基于opencv3.0下的运动车辆检测

    在opencv的初等应用上,对运动物体的识别主要有帧差或背景差两种方式. 帧差法主要的原理是当前帧与前一帧作差取绝对值: 背景差主要的原理是当前帧与背景帧作差取绝对值: 在识别运动车辆上主要需要以下9 ...

  3. 图像凸性检测函数convexityDefects在Python2.7下使用opencv3.0的问题

    最近在学习Python下的OpenCV,在图像的凸性检测中,发现opencv3.0下的convexityDefects函数对图像的凸性缺陷处理有错误.不知道是opencv3.0的版本问题还是我个人的错 ...

  4. opencv3.0中的无缝克隆图像——seamless_cloning(Poisson Image Editing)

    opencv3.0 photo 模块加入了seamless_cloning类.该类对应的论文是"Poisson Image Editing" 主要可以实现一下功能: seamles ...

  5. 基于Opencv3的活动轮廓模型--CV, RSF and DRLSE

    本人把CV, RSF and DRLSE等经典的活动轮廓模型转化成了基于C++,Opencv3版本的代码,仅供参考.代码的运行效率比matlab快一个数量级. CV模型.源代码下载地址:http:// ...

  6. 数字图像处理-3.7混合空间增强法-骨骼图 基于opencv3.4.3的实现

    引子 刚开始看冈萨雷斯的<数字图像处理>时,3.7节 混合空间增强法中图3.4.3中的全身骨骼图的印象非常深刻.牛XX啊,这么模糊,都能变得这么清楚.虽然书中也给出了大段大段的解释,但是能 ...

  7. OpenCV3.0中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码

    关于OpenCV3中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,汇总如下: cv::Algorithm   cv::BackgroundSubtractor     cv::Backgro ...

  8. python基于水色图像的水质评价_基于Python和遥感图像的膨胀与腐蚀操作

    引言 膨胀与腐蚀是图像形态学中的基本操作,本文将从两个角度实现python的膨胀与腐蚀算法,分别是特征提取与分割后处理.目前,在RGB图像领域,这两种形态学算法经常用于分割结果的处理,例如连通区处理. ...

  9. Ubuntu 安装OpenCV3.0.0

    Ubuntu安装OpenCV3.0.0 为了看看opencv3.0的HDR效果,尝试安装opencv3.0到ubuntu12.04上面,安装了好几次终于成功了. 参考博客: http://www.sa ...

最新文章

  1. linux shell sed d删除指定行并更换分隔符为#
  2. LINQ中的动态排序
  3. [BZOJ3751] [NOIP2014] 解方程 (数学)
  4. 【SICP练习】127 练习3.58
  5. Winform可读取html语言,C# Winform 用WebBrowser实现 Html 编辑功能
  6. PHP 利用cron 实现文章同步至新浪、网易等微博
  7. Ext.Net 最新版(2011-06-24)License 问题
  8. 1130: 零起点学算法37——求阶乘
  9. Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解
  10. Datawhale编程学习之数组和链表(1)
  11. 非线性动力学_第17届全国非线性振动暨第14届全国非线性动力学 和运动稳定性学术会议在南京召开...
  12. My97DatePicker组件使用方法
  13. VSCode改变字体大小
  14. 【Vue项目复习笔记】详情页的展示
  15. 第四届蓝桥杯JavaC组国(决)赛真题
  16. 2019考研上海交通大学823计算机通信网真题回忆
  17. 卧槽!我的世界也有开源版本了!!!
  18. bat脚本中如何多次键盘输入并判断_万花筒自动发布信息脚本【操作简单】
  19. Gym 101431B Vera and Banquet (后缀数组)
  20. 实战:k8s中网络策略实验(成功测试-博客输出)-20211005

热门文章

  1. mysql停止更新时间_我如何更新这个MySQL查询以获取从开始、停止、暂停和恢复事件经过的总时间...
  2. (三.0)通过FPGA实现以太网通信原理及理解
  3. ubuntu mysql主从备份_Ubuntu 16 MySQL主从备份配置
  4. mysql建表测试_总结MySQL建表、查询优化实用小技巧
  5. @property (nonatomic,retain)中的nonatom和retain是什么意思
  6. Finding all unique triplets that sums to zero[部分转载]
  7. 浅议“全局变量”、“多线程”和“编译器陷阱”
  8. Apache工具库——Apache Commons的使用
  9. String.GetEnumerator 方法的C#例子
  10. 共性的缺失——由博客想到的