当前位置: 首页 > news >正文

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()对图像应用通用几何变换。其原型如下&#xff1a; void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation&#xff0c; int borderMode BORDER_CONSTANT&#xff0c; const Scalar & borde…...

Python基础课堂最后一课23——正则对象

文章目录 前言一、正则对象是什么&#xff1f;二、正则表达式基本分类1.普通字符2.元字符 总结 前言 很开心能和你们一些学习进步&#xff0c;在这一个多月的时间中&#xff0c;是你们让我坚持了下来&#xff0c;完成了python基础课堂编写&#xff0c;不管如何&#xff0c;我们…...

【算法训练营】凸包,图(Python实现)

凸包 描述 给定n个二维平面上的点&#xff0c;求他们的凸包。 输入 第一行包含一个正整数n。 接下来n行&#xff0c;每行包含两个整数x,y&#xff0c;表示一个点的坐标。 输出 令所有在凸包极边上的点依次为p1,p2,...,pm&#xff08;序号&#xff09;&#xff0c;其中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 关联查询 唯一索引如何创建&#xff0c;语句 更新表字段语句 查看字段类型 --redis 使用场景 数据结构 设置超时时间 linux 常用命令 发布版本 安装一个东西&#xff0c;发现一个东西安装的很慢&#xff0c;如何切换ip地的源&#xff1f;-&g…...

微信小程序一次性订阅requestSubscribeMessage授权和操作详解

一次性订阅&#xff1a;用户订阅一次发一次通知 一、授权 — 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容器初次见面

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 什么是STL2. STL的版本…...

记OnlyOffice的两个大坑

开发版&#xff0c;容器部署&#xff0c;试用许可已安装。 word&#xff0c;ppt&#xff0c;excel均能正常浏览。 自带的下载菜单按钮能用。 但config里自定义的downloadAs方法却不一而足。 word能正常下载&#xff0c;excel和ppt都不行。 仔细比对调试了代码。发现app.js…...

分享几个Google Chrome谷歌浏览器历史版本下载网站

使用selenium模块的时候&#xff0c;从官网下载的谷歌浏览器版本太高&#xff0c;驱动不支持&#xff0c;所以需要使用历史的谷歌浏览器版本 &#xff0c;这里备份一下以防找不到了。 驱动下载地址&#xff1a;https://registry.npmmirror.com/binary.html?pathchromedriver 文…...

备考2025年AMC8竞赛:吃透2000-2024年600道真题(免费赠送真题)

我们继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。 即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么…...

考研复试C语言篇

第一章 概述 1.1什么是程序 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的合集。 1.4C语言的特点 代码级别的跨平台&#xff1a;由于标准的存在&#xff0c;使得几乎同样的C代码可用于多种操作系统&#xff0c;也适用于多种机型。使允许直接访问物理地址…...

Docker架构深度解析:守护进程、客户端与存储驱动的协同作战(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker幻想曲&#xff1a;从零开始&#xff0c;征服容器宇宙》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 四、命名空间和控制组 1、Linux命名空…...

【强化学习笔记一】初识强化学习(定义、应用、分类、性能指标、小车上山案例及代码)

文章目录 第1章 初识强化学习1.1 强化学习及其关键元素1.2 强化学习的应用1.3 强化学习的分类1.3.1 按任务分类1.3.2 按算法分类 1.4 强化学习算法的性能指标1.5 案例&#xff1a;基于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实现定时增量同步&#xff0c;你可以使用以下步骤&#xff1a; 1. 安装DataX&#xff1a;首先&#xff0c;确保你已经安装了DataX。你可以从DataX的官方仓库中获取最新版本。 2. 配置DataX 任务&#xff1a;创建一个DataX任务&#xff0c;定义源&#xff08;sou…...

VUE实现Provide的计算属性

通过此篇可以学到&#xff1a; 如何使用Providerinject进行“跨代”传值如何实现一个计算属性的Provider如何解决告警“injection "xxxxx" not found. ” 一、描述 目前需要创建一个计算属性传入Provide&#xff0c;并且能够被其他组件Inject 二、实现 父组件 .…...

Spring Schedule:Spring boot整合Spring Schedule实战讲解定时发送邮件的功能

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…...

Midjourney绘图欣赏系列(十)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…...

【C语言】人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…...

跳棋游戏中的多重捕获实现

跳棋(Checkers)是许多棋类爱好者喜爱的一款游戏,它的规则简单,但策略深度却非常丰富。今天我们来讨论跳棋游戏中的一个复杂而有趣的功能——多重捕获的实现。在本文中,我们将深入探讨如何在JavaScript中编写一个可以检测并执行多重捕获的函数。 基本概念 在跳棋游戏中,…...

1990-2025年企业基金退出事件数据

数据介绍 企业投资机构通过公开招募&#xff0c;并购&#xff0c;同行转售等退出方式转让基金份额、底层项目股权、IPO、回购、清算等方式&#xff0c;从所投基金或项目中收回资金、实现收益或止损离场的完整交易与流程。 数据整理1990至2025年企业基金退出事件数据&#xff…...

nuScenes 3D标注数据深度解析:从Box字段到可视化,理解自动驾驶感知的基石

nuScenes 3D标注数据深度解析&#xff1a;从Box字段到可视化&#xff0c;理解自动驾驶感知的基石 自动驾驶技术的快速发展离不开高质量数据集的支撑&#xff0c;而nuScenes作为业界公认的标杆级数据集&#xff0c;其丰富的3D标注信息为感知算法研发提供了坚实基础。本文将带您深…...

CLIP ViT-H-14图像编码服务实战:构建可解释AI系统中的视觉注意力模块

CLIP ViT-H-14图像编码服务实战&#xff1a;构建可解释AI系统中的视觉注意力模块 1. 项目概述 CLIP ViT-H-14图像编码服务是基于CLIP ViT-H-14(laion2B-s32B-b79K)模型构建的视觉特征提取解决方案。这项服务将先进的视觉-语言预训练模型转化为实用的工程化工具&#xff0c;为…...

次元画室结合Transformer架构:提升图像生成连贯性与细节

次元画室结合Transformer架构&#xff1a;提升图像生成连贯性与细节 你有没有遇到过这样的情况&#xff1f;想用AI画师创作一个漫画故事&#xff0c;第一格主角穿着红色外套&#xff0c;到了第三格&#xff0c;外套颜色莫名其妙变成了蓝色&#xff0c;或者背景里的建筑细节对不…...

使用OpenGL纹理数组实现高精度实时Lut滤镜

之前写过的文章(使用OpenGL实现滤镜转换的一种思路_轮子初级玩家-CSDN博客)&#xff0c;我把一整个Lut滤镜图作为单个纹理贴图&#xff0c;把图像原颜色采样后当作坐标&#xff0c;然后从lut纹理中查找出替换颜色实现滤镜功能&#xff0c;这是最简易的一种滤镜实现方式&#xf…...

JDK-02 | 我为什么越来越喜欢用 Java 的 Text Blocks

这是专栏第 2 篇。 如果第一篇 record 是在“模型表达”上让我轻松,Text Blocks 则是在“日常编码和代码审查”上让我明显省力。 我先给结论:Text Blocks 不只是少写几个 +,它真正解决的是多行文本在代码中的可读性、可评审性和可回归性。 一、我为什么会认真用这个特性 …...

别再手动算不确定度了!用C++代码一键搞定科大奥锐虚拟仿真实验(附完整代码)

用C解放物理实验&#xff1a;不确定度计算的自动化实践 物理实验报告中最令人头疼的部分莫过于那些繁琐的不确定度计算。每次测量完数据&#xff0c;面对满纸的数字和公式&#xff0c;总有一种被数学淹没的窒息感。记得上学期做"长度与固体密度测量"实验时&#xff0…...

煤矸石自动分离机设计【论文+CAD图纸】

煤矸石作为煤炭开采与洗选过程中产生的固体废弃物&#xff0c;其成分复杂、粒度分布不均&#xff0c;传统人工分选效率低且精度难以保证。煤矸石自动分离机的设计以机械结构优化与物料特性分析为核心&#xff0c;通过多级筛分与智能识别技术的结合&#xff0c;实现煤矸石与煤炭…...

【RK3588 Mali610 适配 Qt6 】

主要适配RK3588 Mali610GPU 准备文件 准备文件 1、Qt6源码 2、必须安装的依赖文件 3、缺失的文件fbdev_window.h 其中第三项比较重要,关系到编译初期能够识别到GPU库。 fbdev_window.h内容如下: /** This confidential and proprietary software may be used only as* auth…...