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); // y 方向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); // y 方向//水平镜像/*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); // y 方向//水平镜像/*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); // y 方向//水平镜像/*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;
}

 试运行,结果如下:

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

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

相关文章

回答自己一年前的一个问题,python如何动态拼接sql

首先谈谈应用场景吧&#xff0c;前提是针对查询接口做接口自动化&#xff0c;接口校验的脚本中&#xff0c;一般以响应报文作为预期值&#xff0c;通过sql查出的数据库值作为实际值&#xff0c;二者对比通过则认为接口输出正确。而sql从何而来呢&#xff0c;对于查询接口一般是…

perl 用 XML::DOM 解析 Freeplane.mm文件,生成测试用例.csv文件

Perl 官网 www.cpan.org 从 https://strawberryperl.com/ 下载网速太慢了 建议从 https://download.csdn.net/download/qq_36286161/87892419 下载 strawberry-perl-5.32.1.1-64bit.zip 约105MB 解压后安装.msi&#xff0c;装完后有520MB&#xff0c;建议安装在D:盘。 运行 …

HarmonyOS NEXT应用开发—组件堆叠

介绍 本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数&#xff0c;精准捕获滚动动作的发生。当滚动时&#xff0c;实时地调节组件的透明度、高度等属性&#xff0c;从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组…

Web核心,HTTP,tomcat,Servlet

1&#xff0c;JavaWeb技术栈 B/S架构:Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…

安装snap再安装flutter再安装localsend@Ubuntu(FreeBSD下未成功)

Localsend介绍 localsend是一个跨平台的文件传送软件&#xff0c;可以在Windows、MacOS、Linux、Android和IOS下互相传送文件&#xff0c;只要在同一个局域网即可。 localsend官网&#xff1a;LocalSend 尝试安装localsend&#xff0c;发现需要使用flutter&#xff0c; 安装f…

阿里二面:什么情况会发生Full GC?如何避免频繁Full GC?

阿里二面&#xff1a;什么情况会发生Full GC&#xff1f;如何避免频繁Full GC&#xff1f; Minor GC、Major GC 和 Full GC区别&#xff1f; Minor GC、Major GC和Full GC是垃圾回收中的三个重要概念&#xff0c;它们描述了垃圾回收的不同阶段和范围&#xff1a; Minor GC&am…

自定义协议

应用层 有许多现成的协议(HTTP协议做网站必备),也有许多需要程序员自定义的协议. 1.自定义协议 自定义协议: 1.明确传递的信息是什么 2.约定好信息按照什么样的格式来组织成二进制字符串 举个例子: 当我们点外卖时,打开软件,会显示商家列表,列表中有很多项,每一项都包含了一…

Tuxera NTFS 2023安装使用教程 Tuxera NTFS破解版 Tuxera NTFS for Mac优惠

对于必须在Windows电脑和Mac电脑之间来回切换的Mac朋友来说&#xff0c;跨平台不兼容一直是一个巨大的障碍&#xff0c;尤其是当我们需要使用NTFS格式的硬盘在Windows和macOS之间共享文件时。因为Mac默认不支持写入NTFS磁盘。 为了解决这一问题&#xff0c;很多朋友会选择很便捷…

Selenium基础

1. selenium简介 用于实现自动化测试的 python 包&#xff0c;使用前需要安装对应浏览器驱动 from time import sleep from selenium import webdriver option webdriver.ChromeOptions() # 指定chrome存储路径的二进制形式 option.binary_locationD:\Chrome\Google\Chrome\Ap…

企业计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密工具流程

随着网络技术的不断应用与发展&#xff0c;越来越多的企业开始利用网络开展各项工作业务&#xff0c;网络为企业的发展与生产生活提供了极大便利。但网络中的勒索病毒攻击企业服务器的事件频发&#xff0c;给企业的数据安全带来了严重威胁&#xff0c;数据安全问题一直是企业关…

pytorch CV入门 - 汇总

初次编辑&#xff1a;2024/2/14&#xff1b;最后编辑&#xff1a;2024/3/9 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorch 更多的内容可以参考本作者其他专栏&#xff1a; Pytorch基础&#xff1a;https…

智慧城市革命,物联网技术如何改变城市治理与生活方式

随着科技的不断进步&#xff0c;智慧城市已经成为现代城市发展的重要方向之一。物联网技术作为智慧城市的重要支撑&#xff0c;正深刻改变着城市的治理模式和居民的生活方式。本文将探讨智慧城市革命&#xff0c;以及物联网技术如何改变城市治理与生活方式&#xff0c;同时介绍…

Python Web开发记录 Day12:Django part6 用户登录

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡《竹枝词》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、登录界面2、用户名密码校验3、cookie与session配置①cookie与session②配置…

STM32CubeMX与HAL库开发教程八(串口应用/轮询/中断/DMA/不定长数据收发)

目录 前言 初识串口-轮询模式 串口中断模式收发 串口DMA模式 蓝牙模块与数据包解析 前言 前面我们简单介绍过串口的原理和初步的使用方式&#xff0c;例如怎么配置和简单的收发&#xff0c;同时我们对串口有了一个初步的了解&#xff0c;这里我们来深入的来使用一下串口 …

Linux服务器(RedHat、CentOS系)安全相关巡检shell脚本

提示&#xff1a;巡检脚本可以使用crontab定时执行&#xff0c;人工根据执行结束时间点统一收集报告文件即可。 #!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format echo >server_security_inspection_r…

【计算机网络】https的工作原理以及和http的区别

目录 前言 1. HTTP协议存在的问题 2. 什么是HTTPS协议&#xff1f; 3. HTTP和HTTPS有哪些区别&#xff1f; 4. HTTPS的工作原理 加密方式 前言 在日常的Web项目练习中&#xff0c;我们会发现老师会让我们在打开服务器之后使用 http://localhost/...进行项目效果测试和预览…

2.26OS分类,中断(内,外),系统调用,操作系统结构、引导,虚拟机(两类VMM),进程

外核可以申请分配连续的磁盘块以支持频繁的随机访问&#xff0c;其它的方式是采用虚拟存储 分层结构

iPhone 的健康数据采用的是 FHIR 传输格式

虽然感觉 FHIR 的数据传输格式还是有点繁琐的&#xff0c;但貌似现在也是唯一的事实上的标准。 通过 iPhone 健康上面查看的数据来看&#xff0c;有关健康的数据还是使用 FHIR 的数据传输格式。 不管怎么样&#xff0c;针对老旧的数据传输格式来看&#xff0c;FHIR 至少目前还是…

实现HBase表和RDB表的转化(附Java源码资源)

实现HBase表和RDB表的转化 一、引入 转化为HBase表的三大来源&#xff1a;RDB Table、Client API、Files 如何构造通用性的代码模板实现向HBase表的转换&#xff0c;是一个值得考虑的问题。这篇文章着重讲解RDB表向HBase表的转换。 首先&#xff0c;我们需要分别构造rdb和hba…

学习开发小程序的起航日记

2024年3月16日 不知不觉中三月份还只剩了一半的光景&#xff0c;我想写的内容还很多没有写&#xff0c;或者更应该说&#xff0c;是想积累的还有很多。现在最应该去完善Java的内容&#xff0c;可还是想先等等。想等搞清楚小程序部分&#xff0c;想等积累完小程序的内容。 这几…