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://www.hqwc.cn/news/461063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字IC实践项目(9)— Tang Nano 20K: I2C OLED Driver

Tang Nano 20K: I2C OLED Driver 写在前面的话硬件模块RTL电路和相关资源报告SSD1306 OLED 驱动芯片SSD1306 I2C协议接口OLED 驱动模块RTL综合实现 总结 写在前面的话 之前在逛淘宝的时候偶然发现了Tang Nano 20K,十分感慨国产FPGA替代方案的进步之快;被…

【漏洞复现】多语言药房管理系统MPMS文件上传漏洞

Nx01 产品简介 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口,客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库,并根据到期、产品等各种参数提供各种报告。 Nx02 漏洞描述 …

一条 SQL 更新语句是如何执行的?

之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢? 我们先从一条更新语句讲起,首先创建一个表,这个表有一个主键…

ubuntu22.04安装部署03: 设置root密码

一、前言 ubuntu22.04 安装完成以后,默认root用户是没有设置密码的,需要手动设置。具体的设置过程如下文内容所示: 相关文件: 《ubuntu22.04装部署01:禁用内核更新》 《ubuntu22.04装部署02:禁用显卡更…

MySQL数据库⑥_内置函数(日期函数+字符串函数+数学函数等)

目录 1. 日期函数 2. 字符串函数 3. 数学函数 4. 其它函数 本篇完。 1. 日期函数 MySQL常用的日期函数如下: 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时间date(datetime)获取d…

了解海外云手机的多种功能

随着社会的高度发展,海外云手机成为商家不可或缺的工具,为企业出海提供了便利的解决方案。然而,谈及海外云手机,很多人仍不了解其强大功能。究竟海外云手机有哪些功能,可以为我们做些什么呢? 由于国内电商竞…

Qlik Sense : Lookup函数

LookUp - 脚本函数 Lookup() 用于查找已经加载的表格,并返回与在字段 match_field_name 中第一次出现的值 match_field_value 对应的 field_name 值。表格可以是当前表格或之前加载的其他表格。 语法: lookup(field_name, match_field_name, match_…

OpenCV-33 开运算和闭运算

目录 一、开运算 二、闭运算 三、形态学梯度 开运算和闭运算都是腐蚀和膨胀的基本应用。 一、开运算 开运算 腐蚀膨胀(腐蚀之后再膨胀) 开运算提供了另一种去除噪声的思路。(腐蚀先进行去噪,膨胀再还原图像) 通过API --- morphologyE…

Vue + Element UI el-table + sortablejs 行、列拖拽排序

实现Element UI中的el-table表格组件的行和列的拖拽排序 使用 Vue3 Element Plus UI sortablejs 安装sortablejs pnpm install sortablejs行拖拽 基本实现 效果 <script setup> import { onMounted, ref } from "vue"; import Sortable from "sort…

Elasticsearch(四)

是这样的前面的几篇笔记&#xff0c;感觉对我没有形成知识体系&#xff0c;感觉乱糟糟的&#xff0c;只是大概的了解了一些基础知识&#xff0c;仅此而已&#xff0c;而且对于这技术栈的学习也是为了在后面的java开发使用&#xff0c;但是这里的API学的感觉有点乱&#xff01;然…

排序算法---堆排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 堆排序&#xff08;Heap Sort&#xff09;是一种基于二叉堆数据结构的排序算法。它将待排序的元素构建成一个最大堆&#xff08;或最小堆&#xff09;&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换位置&#xff0c…

Mac电脑到手后的配置

一、Homebrew 1、Homebrew安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 桌面的Old_Homebrew文件夹&#xff0c;没有你需要的可以删除。 2、Homebrew卸载 /bin/zsh -c "$(curl -fsSL https://gitee.com/c…