OpenCV 图像重映射函数remap()实例详解
OpenCV 图像重映射函数remap()对图像应用通用几何变换。其原型如下:
void remap(InputArray src,
OutputArray dst,
InputArray map1,
InputArray map2,
int interpolation,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar()
)
参数:
src 源图像。
dst 输出目标图像。它的大小与 map1 相同,类型与 src 相同。
map1 (x,y) 点或仅 x 值的第一个映射具有 CV_16SC2 、 CV_32FC1 或 CV_32FC2 类型。
map2 y 值的第二个映射分别具有 CV_16UC1、CV_32FC1 类型或无类型(如果映射 1 是 (x,y) 点,则为空映射)。
interpolation 插值方法,可选: INTER_NEAREST, INTER_LINEAR , INTER_CUBIC, INTER_LANCZOS4, INTER_NEAREST_EXACT INTER_MAX WARP_FILL_OUTLIERS , WARP_INVERSE_MAP
borderMode 像素外推法。当 borderMode=BORDER_TRANSPARENT 时,意味 着目标图像中与源图像中的“异常值”相对应的像素不会被该函数修改。可为:BORDER_CONSTANT ,BORDER_REPLICATE,BORDER_REFLECT,BORDER_WRAP ,BORDER_REFLECT_101 ,BORDER_TRANSPARENT ,BORDER_REFLECT101 ,BORDER_DEFAULT,BORDER_ISOLATED
borderValue 在边界恒定的情况下使用的值。默认值为 0。
OpenCV的remap函数的主要用途是重新映射图像中像素的位置或值。用它可以实现图像镜像、形态改变、特效制作、图像分割等。下面以例演示 其用法。先写一个示例程序,读入一张图片然后,用remap函数分别获取水平镜像图片,示例程序代码如下:
// RemapTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.png");if (src.empty()){cout << "Cann't load Image!";return -1;}imshow("原始图像:",src);Mat srcx(src.rows, src.cols, CV_32F); // x 方向Mat srcy(src.rows, src.cols, CV_32F); // x 方向for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = src.cols - j - 1;srcy.at<float>(i, j) = i;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("水平镜像:", src);waitKey(0);return 1;
}
试运行,结果如下:

获取垂直镜像,其代码如下:
// RemapTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.png");if (src.empty()){cout << "Cann't load Image!";return -1;}imshow("原始图像:",src);Mat srcx(src.rows, src.cols, CV_32F); // x 方向Mat srcy(src.rows, src.cols, CV_32F); // x 方向//水平镜像/*for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = src.cols - j - 1;srcy.at<float>(i, j) = i;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("水平镜像:", src);*///垂直镜像for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = j;srcy.at<float>(i, j) = src.rows -i -1;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("垂直镜像:", src);waitKey(0);return 1;
}
试运行结果如下:
再写一段改变图形形状的代码,代码如下:
// RemapTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.png");if (src.empty()){cout << "Cann't load Image!";return -1;}imshow("原始图像:",src);Mat srcx(src.rows, src.cols, CV_32F); // x 方向Mat srcy(src.rows, src.cols, CV_32F); // x 方向//水平镜像/*for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = src.cols - j - 1;srcy.at<float>(i, j) = i;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("水平镜像:", src);*///垂直镜像/*for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = j;srcy.at<float>(i, j) = src.rows -i -1;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("垂直镜像:", src);*///改变图像形状for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = j;srcy.at<float>(i, j) = i + 5.0 * cos(i / 5.0);}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("改变图形形状:", src);waitKey(0);return 1;
}
割裂效果呈现,实现的程序代码如下:
// RemapTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.png");if (src.empty()){cout << "Cann't load Image!";return -1;}imshow("原始图像:",src);Mat srcx(src.rows, src.cols, CV_32F); // x 方向Mat srcy(src.rows, src.cols, CV_32F); // x 方向//水平镜像/*for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = src.cols - j - 1;srcy.at<float>(i, j) = i;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("水平镜像:", src);*///垂直镜像/*for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = j;srcy.at<float>(i, j) = src.rows -i -1;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("垂直镜像:", src);*///改变图像形状/*for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = j;srcy.at<float>(i, j) = i + 5.0 * cos(i / 5.0);}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("改变图形形状:", src);*///割裂效果呈现for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = j + 10.0 * tan(j / 5.0);;srcy.at<float>(i, j) = i;}}remap(src, src, srcx, srcy, INTER_LINEAR);imshow("割裂效果:", src);waitKey(0);return 1;
}
试运行,结果如下:

相关文章:
OpenCV 图像重映射函数remap()实例详解
OpenCV 图像重映射函数remap()对图像应用通用几何变换。其原型如下: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode BORDER_CONSTANT, const Scalar & borde…...
Python基础课堂最后一课23——正则对象
文章目录 前言一、正则对象是什么?二、正则表达式基本分类1.普通字符2.元字符 总结 前言 很开心能和你们一些学习进步,在这一个多月的时间中,是你们让我坚持了下来,完成了python基础课堂编写,不管如何,我们…...
【算法训练营】凸包,图(Python实现)
凸包 描述 给定n个二维平面上的点,求他们的凸包。 输入 第一行包含一个正整数n。 接下来n行,每行包含两个整数x,y,表示一个点的坐标。 输出 令所有在凸包极边上的点依次为p1,p2,...,pm(序号),其中m表…...
webpack5零基础入门-6webpack处理图片资源
1.在webpack5中file-loader和url-loader为内置模块 通过在加载器中配置rule即可激活 {test: /\.(png|jpe?g|gif|webp)$/,type: asset} 2.使用webpack进行打包 执行npx webpack 可以看到图片资源打包后都被放到了dist文件目录下 3.使用webpack进行图片格式转换为base64 优势…...
计算机基础知识QA
目录 数据库 --mysql 关联查询 唯一索引如何创建,语句 更新表字段语句 查看字段类型 --redis 使用场景 数据结构 设置超时时间 linux 常用命令 发布版本 安装一个东西,发现一个东西安装的很慢,如何切换ip地的源?-&g…...
微信小程序一次性订阅requestSubscribeMessage授权和操作详解
一次性订阅:用户订阅一次发一次通知 一、授权 — requestSubscribeMessage Taro.requestSubscribeMessage({tmplIds: [], // 需要订阅的消息模板的id的集合success (res) {console.log("同意授权", res)},fail(res) {console.log(拒绝授权, res)}})点击或…...
ARM 汇编指令:(三)运算处理指令
目录 一.add指令 二.sub指令 三.MUL指令 一.add指令 add用于执行实现两个寄存器或寄存机或寄存器与立即数的相加操作。它可以用于整数、浮点数等各种数据类型的加法运算。 ADD{cond}{S} Rd,操作数,操作数 1.不带进位加法指令add add r1, r2, #4 //r1 r2 4 add r1, r2 …...
【C++庖丁解牛】STL简介 | string容器初次见面
🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. 什么是STL2. STL的版本…...
记OnlyOffice的两个大坑
开发版,容器部署,试用许可已安装。 word,ppt,excel均能正常浏览。 自带的下载菜单按钮能用。 但config里自定义的downloadAs方法却不一而足。 word能正常下载,excel和ppt都不行。 仔细比对调试了代码。发现app.js…...
分享几个Google Chrome谷歌浏览器历史版本下载网站
使用selenium模块的时候,从官网下载的谷歌浏览器版本太高,驱动不支持,所以需要使用历史的谷歌浏览器版本 ,这里备份一下以防找不到了。 驱动下载地址:https://registry.npmmirror.com/binary.html?pathchromedriver 文…...
备考2025年AMC8竞赛:吃透2000-2024年600道真题(免费赠送真题)
我们继续来随机看五道AMC8的真题和解析,根据实践经验,对于想了解或者加AMC8美国数学竞赛的孩子来说,吃透AMC8历年真题是备考最科学、最有效的方法之一。 即使不参加AMC8竞赛,吃透了历年真题600道和背后的知识体系,那么…...
考研复试C语言篇
第一章 概述 1.1什么是程序 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的合集。 1.4C语言的特点 代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,也适用于多种机型。使允许直接访问物理地址…...
Docker架构深度解析:守护进程、客户端与存储驱动的协同作战(下)
🐇明明跟你说过:个人主页 🏅个人专栏:《Docker幻想曲:从零开始,征服容器宇宙》 🏅 🔖行路有良友,便是天堂🔖 目录 四、命名空间和控制组 1、Linux命名空…...
【强化学习笔记一】初识强化学习(定义、应用、分类、性能指标、小车上山案例及代码)
文章目录 第1章 初识强化学习1.1 强化学习及其关键元素1.2 强化学习的应用1.3 强化学习的分类1.3.1 按任务分类1.3.2 按算法分类 1.4 强化学习算法的性能指标1.5 案例:基于Gym库的智能体/环境接口1.5.1 安装Gym库1.5.2 使用Gym库1.5.3 小车上山1.5.3.1 有限动作空间…...
安卓面试准备汇总
java相关 面试-java基础相关-CSDN博客 android 基础相关 安卓基础面试题-CSDN博客 kotlin相关 android pms,cms,wms相关知识 android fragmework层的知识 项目相关的...
C#+datax实现定时增量同步
要使用C#和DataX实现定时增量同步,你可以使用以下步骤: 1. 安装DataX:首先,确保你已经安装了DataX。你可以从DataX的官方仓库中获取最新版本。 2. 配置DataX 任务:创建一个DataX任务,定义源(sou…...
VUE实现Provide的计算属性
通过此篇可以学到: 如何使用Providerinject进行“跨代”传值如何实现一个计算属性的Provider如何解决告警“injection "xxxxx" not found. ” 一、描述 目前需要创建一个计算属性传入Provide,并且能够被其他组件Inject 二、实现 父组件 .…...
Spring Schedule:Spring boot整合Spring Schedule实战讲解定时发送邮件的功能
🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…...
Midjourney绘图欣赏系列(十)
Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…...
【C语言】人生重开模拟器
前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…...
代码质量与测试框架:front-end-roadmap教你编写高质量前端代码
代码质量与测试框架:front-end-roadmap教你编写高质量前端代码 【免费下载链接】front-end-roadmap Tell you how to learn front end development ~ 项目地址: https://gitcode.com/gh_mirrors/fr/front-end-roadmap front-end-roadmap是一个专注于前端开发…...
AI绘画新体验:灵毓秀-牧神-造相Z-Turbo快速入门,小白也能画古风女神
AI绘画新体验:灵毓秀-牧神-造相Z-Turbo快速入门,小白也能画古风女神 1. 认识灵毓秀-牧神-造相Z-Turbo 1.1 什么是灵毓秀-牧神-造相Z-Turbo 灵毓秀-牧神-造相Z-Turbo是一款专门用于生成《牧神记》中灵毓秀角色图像的AI绘画模型。它基于Xinference框架部…...
微信小程序对接实战:快速开发集成通义千问1.5-1.8B模型的AI聊天应用
微信小程序对接实战:快速开发集成通义千问1.5-1.8B模型的AI聊天应用 你是不是也想过,给自己的微信小程序加上一个智能聊天助手?比如,做一个能解答用户问题的客服机器人,或者一个能陪你闲聊、帮你写文案的创意伙伴。听…...
Intv_AI_MK11大模型微调实战:使用自有数据定制专属AI
Intv_AI_MK11大模型微调实战:使用自有数据定制专属AI 1. 为什么需要微调大模型 想象一下,你买了一套高级西装,虽然剪裁精良,但总感觉少了点个人特色。大模型就像这套西装,通用性强但缺乏针对性。微调就是为它"量…...
云容笔谈·东方红颜影像生成系统Python爬虫实战:自动化采集图像数据训练集
云容笔谈东方红颜影像生成系统Python爬虫实战:自动化采集图像数据训练集 最近在尝试训练一个专注于东方人物风格的AI绘画模型,最头疼的问题就是数据。网上图片虽然多,但风格杂乱、质量参差不齐,手动一张张找、一张张筛࿰…...
李慕婉-仙逆-造相Z-Turbo模型安装包制作教程
李慕婉-仙逆-造相Z-Turbo模型安装包制作教程 1. 开篇:为什么需要制作安装包 如果你已经体验过李慕婉-仙逆-造相Z-Turbo模型的文生图能力,可能会发现每次部署都需要重复安装依赖、配置环境。制作安装包就是为了解决这个问题,让模型可以一键安…...
Open UI5 源代码解析之841:VerticalLayout.js
源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.ui.layout\src\sap\ui\layout\VerticalLayout.js VerticalLayout 文件解析 本文围绕 VerticalLayout.js 在 OpenUI5 项目中的角色与实现展开,重点说明该控件在布局体系中的定位、元数据设计、渲染协作、…...
LeetCode 二叉搜索树双神题通关!有序数组转平衡 BST + 验证 BST,小白递归一把梭
前言 二叉搜索树(BST)是算法刷题的高频必考知识点!今天给大家带来两道最经典、最基础的 BST 题目,全程用最简单的递归实现,代码干净、思路直白,不用死记硬背,看完就能直接写! 一道教…...
别再折腾了!Windows 10/11 下用 Anaconda 一键搞定 OpenPose Python 环境(附 CUDA 11.8 配置)
告别环境配置噩梦:Anaconda三分钟部署OpenPose全攻略 当你在深夜第三次重装CUDA驱动时,是否怀疑过人生?作为计算机视觉领域的里程碑式工具,OpenPose的人体姿态识别能力令人惊叹,但其复杂的环境配置却让无数开发者折戟沉…...
安全测试基础知识点
安全测试不是让你当黑客,是让你知道哪些地方容易被人钻空子。下面这些漏洞,大部分都是因为没校验用户输入或者没做权限控制。 1. XSS:别人在你网页里插了一段JS 啥情况会出? 你把用户填的东西直接显示在页面上,比如搜索框里输入 ,页面弹窗了。更危险的是偷cookie、跳转…...
