OpenCV图片矫正

server/2024/12/18 0:48:07/

计算机视觉领域,图片矫正是一项非常重要的技术,特别是在处理因拍摄角度问题导致的图像失真时。

实验原理

图片矫正主要依赖于透视变换(Perspective Transformation)。透视变换是一种几何变换,可以将图像中的一个四边形区域映射到另一个四边形区域。这在处理如拍摄角度不正导致的图像扭曲时非常有用。

透视变换矩阵

透视变换的核心是找到一个变换矩阵,这个矩阵可以将原图像中的点映射到目标图像中的点。OpenCV 提供了 cv2.getPerspectiveTransform 函数来计算这个变换矩阵。我们需要指定原图像中的四个点和目标图像中的四个点,这八个点将用于计算变换矩阵。

变换应用

一旦我们有了变换矩阵,就可以使用 cv2.warpPerspective 函数将原图像变换为目标图像。这个函数会应用透视变换矩阵,生成校正后的图像。

实验代码

下面是使用 OpenCV 进行图片矫正的完整代码:

import cv2
import numpy as np# 1、读取一张图片
img = cv2.imread("./youhua.png")# 2、获取透视变换矩阵
# 原图中的四个点(按顺时针或逆时针顺序选择四个顶点)
points1 = np.array([[175, 143], [642, 35], [88, 494], [659, 553]],dtype=np.float32)
# 目标图中的四个点(新的图像区域的四个顶点)
points2 = np.array([[0, 0], [img.shape[1], 0], [0, img.shape[0]], [img.shape[1], img.shape[0]]],dtype=np.float32)
# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(points1, points2)# 3、透视变换
# 应用透视变换矩阵进行图像矫正
img_warp = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))# 显示原图和矫正后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Corrected Image', img_warp)
cv2.waitKey(0)
cv2.destroyAllWindows()


实验现象

  1. 原图显示:首先,代码读取并显示原始图像,这张图像可能因为拍摄角度问题而显得扭曲。

  2. 矫正后图像显示:应用透视变换后,图像中的扭曲部分被矫正,图像看起来更加正视。

注意事项

  • 点的选择:选择原图像中的四个点时,需要确保这些点能够构成一个四边形,并且这个四边形的大致形状应该与目标图像中的四边形相匹配。
  • 图像尺寸:在进行透视变换时,目标图像的尺寸需要与原图保持一致,否则可能会导致图像被拉伸或压缩。


http://www.ppmy.cn/server/151037.html

相关文章

每日十题八股-2024年12月16日

1.垃圾回收算法哪些阶段会stop the world? 2.minorGC、majorGC、fullGC的区别,什么场景触发full GC 3.垃圾回收器 CMS 和 G1的区别? 4.什么情况下使用CMS,什么情况使用G1? 5.G1回收器的特色是什么? 6.GC只会对堆进行GC吗&#x…

RabbitMQ中的Work Queues模式

在现代分布式系统中,消息队列(Message Queue)是实现异步通信和解耦系统的关键组件之一。RabbitMQ 是一个广泛使用的开源消息代理软件,支持多种消息传递模式。其中,Work Queues(工作队列)模式是一…

【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )

文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…

【QT常用技术讲解】使用QMovie+QLabel播放gif动态图片,实现“正在加载”功能(源代码在资源中下载)

前言 界面在实现事件等待时,通过会显示一个转圈圈的动态图片,表示“正在加载”,事件完成之后关闭图片,QT中可以使用QMovieQLabel完成gif动态图片的播放及关闭的效果。 效果图 功能讲解 1、加载动画 void MainWindow::addloadgi…

vue3中的v-model如何自定义修饰符

子组件封装 <script setup lang"ts"> import { defineModel } from "vue"const firstName defineModel("first-name") // 自定义组件修饰符&#xff0c;首字母大写 const [lastName, lastNameModifiers] defineModel("last-name&q…

3D 生成重建036-HyperDiffusion直接生成nerf几何

3D 生成重建036-HyperDiffusion直接生成nerf几何 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 作者提出了一种名为HyperDiffusion的新型方法&#xff0c;用于直接生成隐式神经辐射场&#xff0c;方法是预测其权重空间中的参数。与以往需要对神经网络的单个实例进行优…

FedAdam算法:供给方信用,数据质量;更新一致性

FedAdam算法:供给方信用,数据质量;更新一致性 FedAdam算法概述 FedAdam是一种联邦学习(Federated Learning)算法。联邦学习是一种机器学习技术,它允许在多个设备或数据中心(称为客户端)上训练模型,而无需将数据集中到一个中央服务器,从而保护数据隐私。FedAdam主要用于…

Python+OpenCV系列:图像的运算

文章目录 PythonOpenCV系列&#xff1a;图像的加权和、覆盖1. 图像加权和&#xff08;加权融合&#xff09;2. 图像覆盖&#xff08;区域叠加&#xff09;3. 应用场景4. 总结 PythonOpenCV系列&#xff1a;图像的加权和、覆盖 在图像处理中&#xff0c;图像的加权和与覆盖是两…