OpenCV 进行透视变换
背景:
平时在拍照片时难免不小心把照片拍歪了,这时候可以使用透视变换矫正拍歪的照片!
环境:
运行环境: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 进行透视变换相关推荐
- 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”
使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...
- OpenCV:透视变换
一.话说透视变换 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping).我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维 ...
- 【Python+OpenCV 图像透视变换 warpPerspective函数】
Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...
- python opencv 实现透视变换——将侧视图进行正投影
python opencv 实现透视变换--将侧视图进行正投影 这个方法可以将倾斜拍摄的四边形图片投影成矩形,在图像处理工程里经常要用,之前写过一个C语言版本的,可以搜我博客:透视变换 但是pytho ...
- 【OpenCV】透视变换 Perspective Transformation(续)
透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cp ...
- 【OpenCV】透视变换 Perspective Transformation
透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: Mat ...
- 使用opencv的透视变换裁剪倾斜人脸
需求 人脸检测以后,有了检测框,需要将眼睛扶正,并裁剪,然后resize成需要的大小. 人脸检测结果如下: 其中蓝色是检测框,内部的红色框是我根据长宽扩展的正方形,绿色框是根据眼睛倾斜角度计算的正方形 ...
- 基于opencv实现透视变换(Python)
透视变换 文章目录 透视变换 1.导入opencv等相关库,并封装一个显示图像的函数,方便后面显示图像 2.读取图片 3.设置输出图片的宽高 4.设置透视变换前后顶点位置✨✨✨ 5.调用opencv中 ...
- OPenCV 图像透视变换矫正
图像透视变换矫正 Fu Xianjun. All Rights Reserved. 文章目录 前言 一.图像透视变换矫正是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断 ...
- 【OpenCV】透视变换应用——实现鸟瞰图与贴图
透视变换是3D转换,透视变换的本质是将图像投影到一个新的视平面: 据此,我们可以使用透视变化来实现鸟瞰图和图形贴图的效果: 一.鸟瞰图 实现前: 实现效果: 1.准备一个空的mat对象 用于保存转换后 ...
最新文章
- template.process(root, out)的用法(shiro项目中来的九)
- linux free 命令 显示内存使用情况
- ListListObject list = new ArrayListListObject(); 求回答补充问题 list.get(position).add(Object);为什么会...
- Vue精确到小数点后两位
- P2514-[HAOI2010]工厂选址【贪心】
- 即时大数据流处理=即时风暴
- SqlServer学习之触发器
- python中plot和bar要求的格式不一样_在Python中matplotlib中匹配的图形大小,包括和不包含make_axes_locatable- divider colorbars...
- 走捷径修Bug却引起全球大宕机,Salesforce哭着处理了“肇事”工程师
- 这些年无处安放的博客
- 安卓案例:利用相对布局实现注册页面
- html hint标签,htmlhint
- bzoj 2194 快速傅立叶之二
- Android抓包方法(二) 之Tcpdump命令+Wireshark
- salt 服务启动失败
- 手机html设计规范,手机网页设计尺寸规范具体是多少?
- 在Intellij IDEA中使用Debug
- 一位百度AI工程师的求职经历(offer/面经/干货/感悟)
- Android初级教程短信防火墙
- 华为OD机试 - 按身高和体重排队(Java) | 机试题算法思路 【2023】