OpenCV(十二):图像透视变换

news2024/11/20 8:28:38

目录

1.透视变换介绍

2.计算透视变换矩阵getPerspectiveTransform()

3.透视变换函数warpPerspective()

4.demo


1.透视变换介绍

透视变换是一种将原始图像映射到目标图像平面上的投影变换,又称为四点变换。

透视变换矩阵的一般形式如下所示:

| A B C |

| D E F |

| G H I |

通过透视变换矩阵来实现,以下是透视变换的数学公式:

对于原始图像中的点 P(x, y),经过透视变换后得到的新坐标 P'(x', y') 可以通过以下公式计算:

x' = (A * x + B * y + C) / (G * x + H * y + I)

y' = (D * x + E * y + F) / (G * x + H * y + I)

其中,(x, y) 是原始图像中点的坐标,(x', y') 是透视变换后点的新坐标。

矩阵元素 A、B、C、D、E、F、G、H 和 I 是透视变换矩阵的元素,它们决定了透视变换的具体变换方式。

2.计算透视变换矩阵getPerspectiveTransform()

CV_EXPORTS_W Mat getPerspectiveTransform(InputArray src, 

InputArray dst, 

int solveMethod = DECOMP_LU

);

  • src[]:原图像中的四个像素坐标。
  • dstl]:目标图像中的三个像素坐标。
  • solveMethod:计算透视变换矩阵方法的选择标志。

其中计算方法标志:

3.透视变换函数warpPerspective()

通过将透视变换矩阵应用于原始图像,可以获得投影后的图像。

CV_EXPORTS_W void warpPerspective( InputArray src,

OutputArray dst,

InputArray M,

Size dsize,

int flags = INTER_LINEAR,

int borderMode = BORDER_CONSTANT,

const Scalar& borderValue = Scalar());

  • src:输入图像
  • dst:透视变换后输出图像,与src数据类型相同,但是尺寸与dsize相同
  • M:3X3的变换矩阵。
  • dsize:输出图像的尺寸。
  • flags:插值方法标志。
  • borderMode:像素边界外推方法的标志
  • borderValue:填充边界使用的数值,默认情况下为0

4.demo

 

            (原图)                              (透视变换处理后的图片)

#include <jni.h>

#include <string>

#include <android/bitmap.h>

#include <opencv2/opencv.hpp>

#include <iostream>

using namespace cv;

using namespace std;

extern "C"

JNIEXPORT void JNICALL

Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz,

jobject bitmap) {

AndroidBitmapInfo info;

void *pixels;



CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);

//判断图片是位图格式有RGB_565 、RGBA_8888

CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||

info.format == ANDROID_BITMAP_FORMAT_RGB_565);

CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);

CV_Assert(pixels);


//将bitmap转化为Mat类

Mat image(info.height, info.width, CV_8UC4, pixels);


// 输入图像的四个角点

Point2f src[4];

src[0] = Point2f(0, 0); // 左上角

src[1] = Point2f(image.cols, 0); // 右上角

src[2] = Point2f(image.cols, image.rows); // 右下角

src[3] = Point2f(0, image.rows); // 左下角


// 输出图像的四个角点

Point2f dst[4];

dst[0] = Point2f(image.cols * 0.2, image.rows * 0.2); // 输出图像左上角

dst[1] = Point2f(image.cols * 0.8, image.rows * 0.2); // 输出图像右上角

dst[2] = Point2f(image.cols * 0.8, image.rows * 0.8); // 输出图像右下角

dst[3] = Point2f(image.cols * 0.2, image.rows * 0.8); // 输出图像左下角


// 计算透视变换矩阵

Mat perspectiveMatrix = getPerspectiveTransform(src, dst);

Mat outputImage;

// 执行透视变换

warpPerspective(image, outputImage, perspectiveMatrix, image.size());

imwrite("/sdcard/DCIM/outputImage.jpg",outputImage);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/955348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

城市内涝积水监测预警系统 yolov8

城市内涝积水监测预警系统通过yolov8网络深度学习框架&#xff0c;算法一旦识别到道路出现积水&#xff0c;城市内涝积水监测预警系统会立即发出预警信号。并及时通知相关人员。YOLO检测速度非常快。标准版本的YOLO可以每秒处理 45 张图像&#xff1b;YOLO的极速版本每秒可以处…

具有 70V 总线故障保护功能的ISO1042BQDWVRQ1、ISO1042BQDWVQ1、ISO1042QDWVRQ1汽车类隔离式 CAN 收发器

一、目标应用 • 起动机/发电机 • 电池管理系统 (BMS) • 直流/直流转换器 • 车载充电器 (OBC) 和无线充电器 • 逆变器和电机控制 二、器件规格 1、ISO1042BQDWVRQ1 完全版 收发器&#xff0c;隔离式 1/1 CANbus 8-SOIC 类型&#xff1a;收发器&#xff0c;隔离式 协议&a…

day30 日期转换

一&#xff1a;Date Date类&#xff1a; 这个类是java.util.Date getTime() : 获取内部维护的long值 Date date new Date(); long time date.getTime(); setTime()&#xff1a;按照指定的long值&#xff08;表示的时间&#xff09;设置Date表示的时间 time 60*60*24*1000;…

项目实践:类平面抓取点计算(占位,后面补充)

文章目录 文章目录&#xff1a;3D视觉个人学习目录微信&#xff1a;dhlddxB站: Non-Stop_

贯穿嵌入式开发的编程语言?

有个朋友和我说嵌入式行业中有没有什么神技巧&#xff0c;所谓的一招鲜吃遍天一般&#xff0c;那还真的有&#xff0c;在嵌入式开发中&#xff0c;C语言是最广泛使用的编程语言之一&#xff0c;覆盖范围几乎涵盖了整个领域。视频后方有免费的嵌入式学习资料&#xff0c;入门和进…

PHP 接入微信支付分

♦ 背景 最近项目中需要接入【微信支付分】的服务&#xff0c; 本文以 【免确认订单模式】&#xff1a;即先享模式&#xff08;评估不通过不可使用服务&#xff09;的使用 在此做一下实现步骤&#xff0c;希望能对小伙伴有所帮助&#xff0c;欢迎指摘 … 实现语言&#xff1a;P…

【NLP】手把手使用PyTorch实现Transformer以及Transformer-XL

手把手使用PyTorch实现Transformer以及Transformer-XL Abstract of Attention is all you need使用PyTorch实现Transformer1. 构建Encoder-Decoder模型1.1 导入依赖库1.2 创建Encoder-Decoder类1.3 创建Generator类 2. 构建Encoder2.1 定义复制模块的函数2.2 创建Encoder2.3 构…

语言基础篇3——学习第一步,Python环境搭建

环境搭建 基础环境搭建 https://www.python.org/downloads/&#xff0c;以Python3.11.5为例&#xff1a; Install for Windows 提供安装程序或者压缩包&#xff0c;安装程序点击下一步即可&#xff0c;压缩包解压即可&#xff0c;注意配置根目录到系统环境变量PATH。 Ins…

uniapp项目实战系列(3):底部导航栏与头部导航栏的配置

目录 系列往期文章&#xff08;点击跳转&#xff09;uniapp项目实战系列(1)&#xff1a;导入数据库&#xff0c;启动后端服务&#xff0c;开启代码托管&#xff08;点击跳转&#xff09;uniapp项目实战系列(2)&#xff1a;新建项目&#xff0c;项目搭建&#xff0c;微信开发工具…

MySQL— 基础语法大全及操作演示!!!(事务)

MySQL—— 基础语法大全及操作演示&#xff08;事务&#xff09; 六、事务6.1 事务简介6.2 事务操作6.2.1 未控制事务6.2.2 控制事务一6.2.3 控制事务二 6.3 事务四大特性6.4 并发事务问题6.5 事务隔离级别 MySQL— 基础语法大全及操作演示&#xff01;&#xff01;&#xff01…

docker 部署springboot(成功、截图)

1.新建sringboot工程并打包 2.编写Dockerfile文件 # 基础镜像使用java FROM openjdk:8 # 作者 MAINTAINER feng # VOLUME 指定了临时文件目录为/tmp。 # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件&#xff0c;并链接到容器的/tmp VOLUME /tmp # 将jar包添加…

什么是数据丢失防护(DLP)

数据丢失防护 &#xff08;DLP&#xff09; 是一种安全策略&#xff0c;旨在保护企业的关键数据免遭未经授权的用户盗窃、丢失或访问。一个好的 DLP 系统是用于数据发现和分类、数据传输和访问控制、策略和事件管理以及细致的审核和警报的工具的组合。 数据丢失的原因是什么 …

Databricks 入门之sql(二)常用函数

1.类型转换函数 使用CAST函数转换数据类型&#xff08;可以起别名&#xff09; SELECTrating,CAST(timeRecorded as timestamp) FROMmovieRatings; 支持的数据类型有&#xff1a; BIGINT、BINARY、BOOLEAN、DATE 、DECIMAL(p,s)、 DOUBLE、 FLOAT、 INT、 INTERVAL interva…

嵌入式学习之popen函数

相比于system输出的好处&#xff0c;popen可以直接输出运行结果 14.进程总结 需要重点掌握进程配合相关概念&#xff0c;创建进程函数fork的使用&#xff0c;理解进程创建发生了什么事&#xff0c;exec族函数&#xff0c;exec族函数配合fork使用。

2009-2022年商业银行资产利息相关数据

2009-2022年商业银行资产利息相关数据 1、时间&#xff1a;2009-2022年 2、来源&#xff1a;整理自wind 3、指标&#xff1a;利息支出、资产总计、员工总数、固定资产、存款总额、应付职工薪酬、营业支出、营业收入、扣除人员开支后的营业支出 银行&#xff1a;平安银行兰州…

富而喜悦九仔短短10秒的拥抱让百万网友直呼“太可爱!”

现如今网络发展速度非常快&#xff0c;各种各样的走红层出不穷&#xff0c;甚至有很多人都是一夜之间爆红的&#xff0c;出名的速度非常快。近期&#xff0c;在新浪微博的热榜中&#xff0c;有一个富而喜悦九仔的话题横空出世&#xff0c;微博博主富而喜悦外事部小九&#xff0…

取暖器UL1278测试项目及注意事项!!!

UL1278是可移动的挂墙式或吊顶式室内电暖器的标准&#xff0c;适用于额定电压不超过600V的可移动的且挂墙式或吊顶式的电暖器。不适用于固定式电暖器&#xff0c; 管道式电暖器&#xff0c;中心加热的炉。 取暖器UL认证UL1278标准测试项目&#xff1a; 泄露电流试验&#xff…

8月编程排行榜榜首还是它?敬了不起的Python

近日 TIOBE 公布了2023年8月的编程指数信息&#xff0c;跟着战战一起看看排行详情吧~ 全球知名编程社区TIOBE&#xff0c;每月都会公布编程语言的最新变化&#xff0c;8月编程语言排行榜已出&#xff01;话不多说&#xff0c;一起来看看吧&#xff01; TIOBE 8 月 TOP 15 编程…

Plasticine: 面向并行模式的可重配架构

本文基于对并行模式的分层架构、数据局部性和控制流的抽象&#xff0c;提出了Plasticine架构&#xff0c;从而为并行模式计算提供更好的灵活性和更低的能耗支持。原文: Plasticine: A Reconfigurable Architecture For Parallel Patterns 摘要 近年来&#xff0c;由于可重配架构…

深度解读智能媒体服务的重组和进化

统一“顶设”的智能媒体服务。 邹娟&#xff5c;演讲者 大家好&#xff0c;首先欢迎各位来到LVS的阿里云专场&#xff0c;我是来自阿里云视频云的邹娟。我本次分享的主题为《从规模化到全智能&#xff1a;智能媒体服务的重组与进化》。 本次分享分为以上四部分&#xff0c;一是…