ubuntu22.04@laptop OpenCV Get Started: 005_rotate_and_translate_image

ubuntu22.04@laptop OpenCV Get Started: 005_rotate_and_translate_image

  • 1. 源由
  • 2. translate/rotate应用Demo
  • 3 translate_image
    • 3.1 C++应用Demo
    • 3.2 Python应用Demo
    • 3.3 平移图像过程
  • 4. rotate_image
    • 4.1 C++应用Demo
    • 4.2 Python应用Demo
    • 4.3 旋转图像过程
  • 5. 总结
  • 6. 参考资料

1. 源由

图像的平移和旋转是图像编辑中最基本的操作之一。两者都属于广义仿射变换的范畴。

因此,在研究更复杂的变换之前,首先学习使用OpenCV中提供的函数旋转和平移图像。

2. translate/rotate应用Demo

005_rotate_and_translate_image是OpenCV平移和旋转的示例程序。

确认OpenCV安装路径:

$ find /home/daniel/ -name "OpenCVConfig.cmake"
/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/
/home/daniel/OpenCV/opencv/build/OpenCVConfig.cmake
/home/daniel/OpenCV/opencv/build/unix-install/OpenCVConfig.cmake$ export OpenCV_DIR=/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/

3 translate_image

3.1 C++应用Demo

C++应用Demo工程结构:

005_rotate_and_translate_image/CPP$ tree .
.
└── translate_image├── CMakeLists.txt├── image.jpg└── translate_image.cpp2 directories, 6 files

C++应用Demo工程编译执行:

$ cd translate_image
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
$ cd ..
$ ./build/translate_image

3.2 Python应用Demo

Python应用Demo工程结构:

005_rotate_and_translate_image/Python$ tree .
.
├── image.jpg
├── image_translation.py
├── requirements.txt
└── rotate_image.py0 directories, 4 files

Python应用Demo工程执行:

$ workoncv-4.9.0
$ python image_translation.py

3.3 平移图像过程

引入平移矩阵对图像进行移动:

  • t x t_x tx: X方向,正数向右移动;反之向左移动。
  • t y t_y ty: Y方向,正数向下移动;反之向上移动。

在这里插入图片描述

C++:

// get tx and ty values for translation
float tx = float(width) / 4;
float ty = float(height) / 4;
// create the translation matrix using tx and ty
float warp_values[] = { 1.0, 0.0, tx, 0.0, 1.0, ty };
Mat translation_matrix = Mat(2, 3, CV_32F, warp_values);// we will save the resulting image in translated_image matrix
Mat translated_image;
// apply affine transformation to the original image using translation matrix
warpAffine(image, translated_image, translation_matrix, image.size());

Python:

# get tx and ty values for translation
tx, ty = width / 4, height / 4 # you divide by value of your choice
# create the translation matrix using tx and ty, it is a NumPy array 
translation_matrix = np.array([[1, 0, tx],[0, 1, ty]
], dtype=np.float32)# apply the translation to the image
translated_image = cv2.warpAffine(src=image, M=translation_matrix, dsize=(width, height)
)

4. rotate_image

4.1 C++应用Demo

C++应用Demo工程结构:

005_rotate_and_translate_image/CPP$ tree .
.
└── rotate_image├── CMakeLists.txt├── image.jpg└── rotate_image.cpp2 directories, 6 files

C++应用Demo工程编译执行:

$ cd rotate_image
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
$ cd ..
$ ./build/rotate_image

4.2 Python应用Demo

Python应用Demo工程结构:

005_rotate_and_translate_image/Python$ tree .
.
├── image.jpg
├── image_translation.py
├── requirements.txt
└── rotate_image.py0 directories, 4 files

Python应用Demo工程执行:

$ workoncv-4.9.0
$ python rotate_image.py

4.3 旋转图像过程

沿旋转中心点进行角度旋转,采用线性代数矩阵运算:

  • 旋转中心点:采用了图片的重心
  • 旋转角度:示例为45度

在这里插入图片描述

C++:

double angle = 45;// get the center coordinates of the image to create the 2D rotation matrix
Point2f center((image.cols - 1) / 2.0, (image.rows - 1) / 2.0);
// create the rotation matrix using the image center
Mat rotation_matix = getRotationMatrix2D(center, angle, 1.0);// we will save the resulting image in rotated_image matrix
Mat rotated_image;
// apply affine transformation to the original image using the 2D rotaiton matrix
warpAffine(image, rotated_image, rotation_matix, image.size());

Python:

# dividing height and width by 2 to get the center of the image
height, width = image.shape[:2]
center = (width/2, height/2)# the above center is the center of rotation axis
# using cv2.getRotationMatrix2D() to get the rotation matrix
rotate_matrix = cv2.getRotationMatrix2D(center=center, angle=45, scale=1)# rotate the image using cv2.warpAffine
rotated_image = cv2.warpAffine(src=image, M=rotate_matrix, dsize=(width, height))

5. 总结

通过对NumPy二维数组操作,对图像进行旋转和移动。

  • getRotationMatrix2D(center, angle, scale)
  • center: 旋转中心点
  • angle: 旋转角度
  • scale: 缩放尺寸
  • warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
  • src: 源图像数组
  • M: 转换矩阵
  • dsize: 输出图像尺寸
  • dst: 输出图像
  • flags: 插值方法, INTER_LINEAR or INTER_NEAREST
  • borderMode: 像素外推方法
  • borderValue: 在恒定边界的情况下使用的值,默认值为0

6. 参考资料

【1】ubuntu22.04@laptop OpenCV Get Started
【2】ubuntu22.04@laptop OpenCV安装
【3】ubuntu22.04@laptop OpenCV定制化安装

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

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

相关文章

MATLAB环境下用于提取冲击信号的几种解卷积方法

卷积混合考虑了信号的时延,每一个单独源信号的时延信号都会和传递路径发生一 次线性瞬时混合;解卷积的过程就是找一个合适的滤波器,进行反卷积运算,得到源信号的近似解。 声音不可避免的会发生衍射、反射等现象,所以&…

数字图像处理实验记录七(彩色图像处理实验)

一、基础知识 经过前面的实验可以得知,彩色图像中的RGB图像就是一个三维矩阵,有3个维度,它们分别存储着R元素,G元素,B元素的灰度信息,最后将它们合起来,便是彩色图像。 这一次实验涉及CMYK和HS…

中小型网络系统总体规划与设计方法

目录 1.基于网络的信息系统基本结构 2.网络需求调研与系统设计原则 3.网络用户调查 4.网络节点地理位置分布情况 5.网络需求详细分析 6.应用概要分析 7.网络工程设计总体目标与设计原则 8.网络结构与拓扑构型设计方法 9.核心层网络结构设计 10.接入核心路由器 11.汇聚…

2.8学习总结

2.8 1.二叉树的前序遍历 2.二叉树的中序遍历 3.二叉树的后序遍历 4.⼆叉树的层序遍历 5.⼆叉树的层序遍历2 6.二叉树的右视图 7.二叉树的层平均值 8.N叉树的层序遍历 9.每个树行中找最大值 10.填充每个节点的下一个右侧节点指针 11.填充每个节点的下一个右侧节点指针2 12.生命之…

知乎高赞:为什么别选计算机专业?

在知乎看到一个这样的问题:“为什么别选计算机专业?” 这个话题有756人关注,以及1,721,580人次浏览。以下是一位匿名用户的高赞回答,内容可能比较主观化,仅代表作者个人观点,如果有不同意见欢迎留言区交流…

【AIGC风格prompt深度指南】掌握绘画风格关键词,实现艺术模仿的革新实践

[小提琴家]ASCII风格,点,爆炸,光,射线,计算机代码 由冰和水制成的和平标志]非常详细,寒冷,冰冻,大气,照片逼真,流动,16K 胡迪尼模拟火和水&#x…

排序算法的时间复杂度存在下界问题

对于几种常用的排序算法,无论是归并排序、快速排序、以及更加常见的冒泡排序等,这些排序算法的时间复杂度都是大于等于O(n*lg(n))的,而这些排序算法存在一个共同的行为,那就是这些算法在对元素进行排序的时候,都会进行…

CODE V的API 之 ThirdAberration(初级像差的获取)数据的获取(4)

像差的变化数据提取 文章目录 像差的变化数据提取前言一、主要目标二、主要代码1.VBA代码2.CODE V macro 输出结果 前言 在优化过程中,相差的观察非常重要,尤其是镜片变多以后哪一面的曲率,厚度以及非球面系数的变化对像差的影响需要总结&am…

从0开始学Docker ---Docker安装教程

Docker安装教程 本安装教程参考Docker官方文档,地址如下: https://docs.docker.com/engine/install/centos/ 1.卸载旧版 首先如果系统中已经存在旧的Docker,则先卸载: yum remove docker \docker-client \docker-client-latest…

仰暮计划|“第一次看到电视上播放的电影,那种震撼和喜悦仍然留在我的记忆中”

首 我是陈香妹,家在浙江省温州市瑞安市湖岭镇。 在上个世纪,我亲身经历过许多动荡和改变。那是一个充满希望和艰辛的时代,我曾见证了许多社会的变革和人们的奋斗。 01. 上世纪50年代,我还是一个十多岁的小姑娘,正处…

【JS逆向八】逆向某企查网站的headers参数,并模拟生成 仅供学习

逆向日期:2024.02.07 使用工具:Node.js 加密方法:未知 / 标准库Hmac-SHA512 文章全程已做去敏处理!!! 【需要做的可联系我】 可使用AES进行解密处理(直接解密即可):AES加…

【Java八股面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…

【新书推荐】7.1节 立即寻址方式

本节内容:立即寻址方式的操作数包含在指令中,作为指令的一部分,跟在操作码后存放在代码段。这种操作数称为立即数。 ■立即寻址方式的实现:8086计算机中,立即数可以是8位,也可以是16位。按照高高低低的原则…

STM32控制JQ8400语音播报模块

时间记录:2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚,正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚,3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…

IO流 - 缓冲流

IO流 - 缓冲流 字节缓冲流 对原始流进行包装,以提高原始流读写数据的性能 字节输入缓冲流 字节输出缓冲流字符输入缓冲流字符输出缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter 字节缓冲流的作用 提高字节流读取数据的性能 原理…

基于STM32CubeMX的GPIO配置和代码生成教程

GPIO(通用输入输出)是STM32微控制器中常用的外设之一,用于处理数字输入和输出。使用STM32CubeMX可以方便地配置GPIO并生成相应的初始化代码,本文将向您介绍如何使用STM32CubeMX进行GPIO配置,并提供示例代码。 ✅作者简…

JS第一天、数据类型检测、内存释放

复习: 以下类型都是 object console.log(typeof new Object); console.log(typeof new Array()); console.log(typeof new Date()); console.log(typeof new RegExp()); console.log(typeof new String()); console.log(typeof new Number()); console.log(typeof…

GEE入门篇|栅格数据集概述(五):其他数据集

目录 其他数据集 1.网格化人口计数数据集 2.数字高程模型 其他数据集 Earth Engine数据目录中还有许多其他类型的数据集可供浏览并用于自己的分析。其中包括全球网格化人口计数、地形和地球物理数据,现在让我们了解其中两个数据集。 1.世界网格化人口计数数据集…

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…

【C语言】模拟实现库函数qsort

qsort的头文件是stdlib.h 他的四个参数分别是要进行排序的数组base的首地址,base数组的元素个数,每个元素的大小,以及一个函数指针,这个函数指针指向了一个函数,这个函数的参数是两个void*类型的指针,返回类…