OpenCV图像平移
图像平移是将图像的所有像素坐标进行水平或垂直方向移动,也就是所有像素按照给定的偏移量在水平方向上沿x轴、垂直方向上沿y轴移动。这种操作分为两种,一种是图像大小不改变,这样最后原图像中会有一部分不在图像中。还有一种就是图像大小改变。这样可以保全原图像的内容。其公式如下:
x\\
y\\
1
\end{bmatrix} \
=
\begin{bmatrix}
1 & 0 & dx \\
0 & 1 &dy \\
0 & 0 & 1
\end{bmatrix} \
\begin{bmatrix}
x0\\
y0\\
1
\end{bmatrix} \
\]
从实现角度讲,其实就是拷贝原图像中的一部分到新图像中,用OpenCV实现代码如下:
Mat imgTranslate(Mat &matSrc, int xOffset, int yOffset, bool bScale)
{
// 判断是否改变图像大小,并设定被复制ROI
int nRows = matSrc.rows;
int nCols = matSrc.cols;
int nRowsRet = 0;
int nColsRet = 0;
Rect rectSrc;
Rect rectRet;
if (bScale)
{
nRowsRet = nRows + abs(yOffset);
nColsRet = nCols + abs(xOffset);
rectSrc.x = 0;
rectSrc.y = 0;
rectSrc.width = nCols;
rectSrc.height = nRows;
}
else
{
nRowsRet = matSrc.rows;
nColsRet = matSrc.cols;
if (xOffset >= 0)
{
rectSrc.x = 0;
}
else
{
rectSrc.x = abs(xOffset);
}
if (yOffset >= 0)
{
rectSrc.y = 0;
}
else
{
rectSrc.y = abs(yOffset);
}
rectSrc.width = nCols - abs(xOffset);
rectSrc.height = nRows - abs(yOffset);
}
// 修正输出的ROI
if (xOffset >= 0)
{
rectRet.x = xOffset;
}
else
{
rectRet.x = 0;
}
if (yOffset >= 0)
{
rectRet.y = yOffset;
}
else
{
rectRet.y = 0;
}
rectRet.width = rectSrc.width;
rectRet.height = rectSrc.height;
// 复制图像
Mat matRet(nRowsRet, nColsRet, matSrc.type(), Scalar(0));
matSrc(rectSrc).copyTo(matRet(rectRet));
return matRet;
}
... prompt'''
调用代码如下:
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <string>
using namespace cv;
int main()
{
std::string strPath = "D:\\我的文档\\My Pictures\\OpenCV\\";
Mat matSrc = imread(strPath + "熊猫.jpg");
// 判断是否真确读取数据
if (matSrc.empty())
return 1;
// 平移图像
Mat matScale_0 = imgTranslate(matSrc, 50, 50, false);
Mat matScale_1 = imgTranslate(matSrc, -50, -50, false);
Mat matScale_2= imgTranslate(matSrc, 50, 50, true);
Mat matScale_3 = imgTranslate(matSrc, -50, -50, true);
// 保存图像
imwrite(strPath + "0.jpg", matScale_0);
imwrite(strPath + "1.jpg", matScale_1);
imwrite(strPath + "2.jpg", matScale_2);
imwrite(strPath + "3.jpg", matScale_3);
// 显示图像
imshow("src", matSrc);
imshow("ret_0", matScale_0);
imshow("ret_1", matScale_1);
imshow("ret_2", matScale_2);
imshow("ret_3", matScale_3);
waitKey();
return 0;
}
运行效果如下:
不改变图像大小
改变图像大小
OpenCV图像平移的更多相关文章
- OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- Opencv 图像叠加 添加水印
Opencv 图像叠加 添加水印 C++: void Mat::copyTo(OutputArray m) const C++: void Mat::copyTo(OutputArray m, Inp ...
- opencv图像读取-imread
前言 图像的读取和保存一定要注意imread函数的各个参数及其意义,尽量不要使用默认参数,否则就像数据格式出现错误(here)一样,很难查找错误原因的: re: 1.opencv图像的读取与保存; 完
- 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放
在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- 关于OpenCV图像操作的默认参数问题
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...
随机推荐
- Python 读取txt文件,排序并写回文件
# 'C:\Users\SAM\Desktop\数据竞赛\个人征信_1108\个人征信\train\bank_detail_train.txt'# 反斜杠的写法会报编码错误f=open('C:/Use ...
- use redir to make port redirecting
Step 1: install redir apt-get update apt-get install redir -y Step2 : add port mapping redir --lport ...
- STM32调试利器之ITM
原创: Osprey 鱼鹰谈单片机 2月17日 STM32 有一个代码跟踪功能,即 ITM,这个调试功能非常强大,可以替代串口输入输出功能,而且只需要占用一根 I/O 线就可以实现.当然它的好处不仅 ...
- [AngularJS] Decorator pattern for code reuse
Imaging you have a large application, inside this large application you have many small individual a ...
- MySQL基础练习---牛客网的数据以及典型题目
1 部门表departments 部门no和部门名称 2 部门员工表 dept_emp 每个部门对应的员工信息 3 部门经理表 dept_manager 每个部门的经理信息 4 员工表 employe ...
- [引用]MATLAB中的fft后为何要用fftshift
原文地址:MATLAB中的fft后为何要用fftshift fft是一维傅里叶变换,即将时域信号转换为频域. fftshift是针对频域的,将FFT的DC分量移到频谱中心,重新排列fft,fft1和… ...
- Java进阶知识14 Struts2中的S标签
1.A 开头 <s:a href=""></s:a> //超链接,类似于html里的<a></a> <s:action nam ...
- td中文字居中
<style> .table_style{width: 100%;height: auto;} .table_style tr td{text-align: center;vertical ...
- AcWing:238. 银河英雄传说(带权并查集)
有一个划分为N列的星际战场,各列依次编号为1,2,…,N. 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列. 有T条指令,每条指令格式为以下两种之一: 1.M i j,表示让第i号战 ...
- selenium知识点
1. 导包 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from se ...