背景:

平时在拍照片时难免不小心把照片拍歪了,这时候可以使用透视变换矫正拍歪的照片!

环境:

运行环境:Win10 x64

OpenCV 版本: 4.5.1

源代码:

/******************************************************************************* @brief : 使用透视变换矫正图片* @usage : 用鼠标在原图上依次点击 左上-> 右上->右下->左下四个角点,*          然后按回车,即可得的变换后的图像,变换后的图像会自动保存* @author: QiDianMaker*****************************************************************************/
#include <iostream>
#include <string>
#include <cmath>
#include <opencv2/opencv.hpp>using Points = cv::Point2f[4];// 全局变量
Points src_points;
Points dst_points;
cv::Mat src, dst;// 鼠标回调函数声明
void on_mouse(int event, int x, int y, int flags, void* ustc);int main()
{const std::string image_name{ "image.jpg" };::src = cv::imread(image_name);if (src.empty()) {std::cerr << "could not load image...\n";return -1;}cv::Mat src_copy;::src.copyTo(src_copy);cv::namedWindow("Input", cv::WINDOW_AUTOSIZE);cv::setMouseCallback("Input", on_mouse, 0);cv::imshow("Input", ::src);cv::waitKey();// 计算欧式距离auto distance = [](cv::Point2f p1, cv::Point2f p2) -> float {return std::hypotf((p1.x - p2.x), (p1.y - p2.y));};cv::Size2f dst_size(distance(src_points[0], src_points[1]),distance(src_points[1], src_points[2]));std::cout << "dst_size = " << dst_size << std::endl;::dst_points[0] = cv::Point2f(0.0f, 0.0f);::dst_points[1] = cv::Point2f(dst_size.width, 0.0f);::dst_points[2] = cv::Point2f(dst_size.width, dst_size.height);::dst_points[3] = cv::Point2f(0.0f, dst_size.height);// 进行透视变换auto warp_matrix = cv::getPerspectiveTransform(::src_points, ::dst_points);cv::warpPerspective(src_copy, ::dst, warp_matrix, dst_size,cv::INTER_CUBIC, cv::BORDER_CONSTANT);cv::imshow("Output", ::dst);cv::imwrite("./out_" + image_name, ::dst);std::cout << "Save successful!" << std::endl;cv::waitKey();
}void on_mouse(int event, int x, int y, int flags, void* ustc)
{const auto point_color = cv::Scalar(0, 0, 255);  // 红色const auto line_color = cv::Scalar(0, 255, 0);   // 绿色static int idx = 0;if (event == cv::EVENT_FLAG_LBUTTON) {::src_points[idx] = cv::Point2i(x, y);cv::circle(::src, ::src_points[idx], 2, point_color, 2, 2);std::cout << "Point" << idx + 1 << ": " << src_points[idx] << std::endl;if (idx > 0)cv::line(::src, ::src_points[idx-1], ::src_points[idx], line_color, 2, 2);if (idx == 3)cv::line(::src, ::src_points[3], ::src_points[0], line_color, 2, 2);cv::imshow("Input", ::src);++idx;}
}

运行效果:

OpenCV 进行透视变换相关推荐

  1. 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”

    使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...

  2. OpenCV:透视变换

    一.话说透视变换 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping).我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维 ...

  3. 【Python+OpenCV 图像透视变换 warpPerspective函数】

    Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...

  4. python opencv 实现透视变换——将侧视图进行正投影

    python opencv 实现透视变换--将侧视图进行正投影 这个方法可以将倾斜拍摄的四边形图片投影成矩形,在图像处理工程里经常要用,之前写过一个C语言版本的,可以搜我博客:透视变换 但是pytho ...

  5. 【OpenCV】透视变换 Perspective Transformation(续)

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cp ...

  6. 【OpenCV】透视变换 Perspective Transformation

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: Mat ...

  7. 使用opencv的透视变换裁剪倾斜人脸

    需求 人脸检测以后,有了检测框,需要将眼睛扶正,并裁剪,然后resize成需要的大小. 人脸检测结果如下: 其中蓝色是检测框,内部的红色框是我根据长宽扩展的正方形,绿色框是根据眼睛倾斜角度计算的正方形 ...

  8. 基于opencv实现透视变换(Python)

    透视变换 文章目录 透视变换 1.导入opencv等相关库,并封装一个显示图像的函数,方便后面显示图像 2.读取图片 3.设置输出图片的宽高 4.设置透视变换前后顶点位置✨✨✨ 5.调用opencv中 ...

  9. OPenCV 图像透视变换矫正

    图像透视变换矫正 Fu Xianjun. All Rights Reserved. 文章目录 前言 一.图像透视变换矫正是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断 ...

  10. 【OpenCV】透视变换应用——实现鸟瞰图与贴图

    透视变换是3D转换,透视变换的本质是将图像投影到一个新的视平面: 据此,我们可以使用透视变化来实现鸟瞰图和图形贴图的效果: 一.鸟瞰图 实现前: 实现效果: 1.准备一个空的mat对象 用于保存转换后 ...

最新文章

  1. template.process(root, out)的用法(shiro项目中来的九)
  2. linux free 命令 显示内存使用情况
  3. ListListObject list = new ArrayListListObject(); 求回答补充问题 list.get(position).add(Object);为什么会...
  4. Vue精确到小数点后两位
  5. P2514-[HAOI2010]工厂选址【贪心】
  6. 即时大数据流处理=即时风暴
  7. SqlServer学习之触发器
  8. python中plot和bar要求的格式不一样_在Python中matplotlib中匹配的图形大小,包括和不包含make_axes_locatable- divider colorbars...
  9. 走捷径修Bug却引起全球大宕机,Salesforce哭着处理了“肇事”工程师
  10. 这些年无处安放的博客
  11. 安卓案例:利用相对布局实现注册页面
  12. html hint标签,htmlhint
  13. bzoj 2194 快速傅立叶之二
  14. Android抓包方法(二) 之Tcpdump命令+Wireshark
  15. salt 服务启动失败
  16. 手机html设计规范,手机网页设计尺寸规范具体是多少?
  17. 在Intellij IDEA中使用Debug
  18. 一位百度AI工程师的求职经历(offer/面经/干货/感悟)
  19. Android初级教程短信防火墙
  20. 华为OD机试 - 按身高和体重排队(Java) | 机试题算法思路 【2023】

热门文章

  1. MDT ADK AIK
  2. VS语音信号处理(7) C语言调用SoundTouch进行变速不变调工程集成调试
  3. unity中连接Xbox手柄设置及按键检测
  4. 十八掌全套大数据课程免费送
  5. jacob word 转pdf
  6. Matlab程序代码,智能微电网PSO优化算法,多目标调度,粒子群算法,综合能源系统优化,机组最优组合,光伏出力预测
  7. 【小制作】WIFI智能窗帘的制作
  8. 长安汽车上半年净利大跌3成,却是三年来首次实质性盈利
  9. 分子动力学模拟 心得 适合新手!!!
  10. html5基于canvas制作酷炫,应用HTML5 Canvas制作酷炫科技背景动画特效