【Emgu CV教程】5.5、几何变换之Remap()重映射

重映射的意思就是把原始图像中某位置的像素放置到目标图像指定位置的过程,在Emgu CV中,Remap()重映射函数可以实现图像的缩放、翻转等操作,函数定义如下:

public static void Remap(IInputArray src,  // 输入图像IOutputArray dst,  // 输出图像IInputArray map1, // 输入图像每个像素点在输出图像中对应位置的x坐标系数矩阵IInputArray map2, // 输入图像每个像素点在输出图像中对应位置的y坐标系数矩阵Inter interpolation, // 插值方法BorderType borderMode = BorderType.Constant,  // 边界模式MCvScalar borderValue = default(MCvScalar) // 边界值
)

函数用起来很简单,代码如下:

CvInvoke.Remap(dstMat, dstMat, mapX, mapY, Inter.Linear);

但是,个人认为这个函数用处不大,而且比较难使用。
1、map1和map2对应关系,需要开发人员自己定义,有难度。
2、在C#中,修改Mat类型变量值很麻烦,不像C++配合OpenCV一样,可以直接修改Mat变量值。

关于如何定义Mat类型的mapX和mapY,目前我也没实现呢,读者们可以参考OpenCV里面关于remap函数的说明,我先把OpenCV官方的C++演示代码贴上啊,读者们可以试着转成C#的。

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
void update_map( int &ind, Mat &map_x, Mat &map_y );
int main(int argc, const char** argv)
{CommandLineParser parser(argc, argv, "{@image |chicky_512.png|input image name}");std::string filename = parser.get<std::string>(0);Mat src = imread( samples::findFile( filename ), IMREAD_COLOR );if (src.empty()){std::cout << "Cannot read image: " << filename << std::endl;return -1;}Mat dst(src.size(), src.type());Mat map_x(src.size(), CV_32FC1);Mat map_y(src.size(), CV_32FC1);const char* remap_window = "Remap demo";namedWindow( remap_window, WINDOW_AUTOSIZE );int ind = 0;for(;;){update_map(ind, map_x, map_y);remap( src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) );imshow( remap_window, dst );char c = (char)waitKey( 1000 );if( c == 27 ){break;}}return 0;
}
void update_map( int &ind, Mat &map_x, Mat &map_y )
{for( int i = 0; i < map_x.rows; i++ ){for( int j = 0; j < map_x.cols; j++ ){switch( ind ){case 0:if( j > map_x.cols*0.25 && j < map_x.cols*0.75 && i > map_x.rows*0.25 && i < map_x.rows*0.75 ){map_x.at<float>(i, j) = 2*( j - map_x.cols*0.25f ) + 0.5f;map_y.at<float>(i, j) = 2*( i - map_x.rows*0.25f ) + 0.5f;}else{map_x.at<float>(i, j) = 0;map_y.at<float>(i, j) = 0;}break;case 1:map_x.at<float>(i, j) = (float)j;map_y.at<float>(i, j) = (float)(map_x.rows - i);break;case 2:map_x.at<float>(i, j) = (float)(map_x.cols - j);map_y.at<float>(i, j) = (float)i;break;case 3:map_x.at<float>(i, j) = (float)(map_x.cols - j);map_y.at<float>(i, j) = (float)(map_x.rows - i);break;default:break;} // end of switch}}ind = (ind+1) % 4;
}

注意哈,update_map函数可以设计出四种mapX和mapY的对应关系,分别实现:
1.原始图像长宽个缩小一半并居中显示
2.原始图像上下翻转
3.原始图像左右翻转
4.原始图像上下左右一同翻转

OpenCV介绍的网址是:
remap函数介绍

不建议在Emgu CV里面使用Remap()函数,读者们简单看看就可以了。

原创不易,请勿抄袭。共同进步,相互学习。

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

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

相关文章

WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除?

不知道各位WordPress站长在后台操作时&#xff0c;是否有注意到每一个页面底部左侧都有一个“感谢使用 WordPress 进行创作。”&#xff0c;其中WordPress还是带有nofollow标签的链接&#xff1b;而页面底部右侧都有一个WordPress版本号&#xff0c;如下图中的“6.4.2 版本”。…

Python 3 列表数据类型基本用法

介绍 列表 是 Python 中的一种数据结构&#xff0c;是一个可变、有序的元素序列。列表中的每个元素或值被称为一个项。就像字符串是在引号之间定义的字符一样&#xff0c;列表是通过在方括号 [ ] 之间放置值来定义的。 列表非常适合在需要处理许多相关值时使用。它们使您能够…

chisel入门初步1——基4的booth编码的单周期有符号乘法器实现

基4的booth编码乘法器原理说明 基2的booth编码 本质来说就是一个裂项重组&#xff0c;乘法器最重要的设计是改变部分积的数量&#xff0c;另外在考虑有符号数的情况下&#xff0c;最高位符号位有特别的意义。 &#xff08;注&#xff1a;部分积是指需要最后一起加和的所有部分…

js实例继承的例子和优缺点

构造继承是一种继承方式&#xff0c;通过使用构造函数来实现继承。在JavaScript中&#xff0c;构造继承是最早的继承方式之一&#xff0c;但随着ES6引入了类和基于类的继承方式&#xff0c;构造继承的应用逐渐减少。 构造继承的优点&#xff1a; 简单易用&#xff1a;构造继承…

使用的uview 微信高版本 头像昵称填写能力

<template><view><button class"cu-btn block bg-blue margin-tb-sm lg" tap"wxGetUserInfo">一键登录</button><view><!-- 提示窗示例 --><u-popup :show"show" background-color"#fff">&…

关于C#中的async/await的理解

1. 使用async标记的方法被认为是一个异步方法&#xff0c;如果不使用await关键字&#xff0c;调用跟普通方法没有区别 static async Task Main(string[] args){Console.WriteLine("主线程id&#xff1a;" Thread.CurrentThread.ManagedThreadId);TestAwait();Consol…

翻译: Streamlit从入门到精通六 实战缓存Cache请求数据

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四翻译…

从matlab的fig图像文件中提取数据

这里用的是openfig&#xff08;&#xff09;函数打开的fig文件 →→→【matlab 中 fig 数据提取】 很简洁 →→→【MATLAB提取 .fig 文件中的数据】 这个给出了包含多个曲线的情况 →→→【提取matlab fig文件里的数据和legend】 chatgpt给出的方法 打开fig文件并保存数据 我的…

StarRocks 生成列:百倍提速半结构化数据分析

半结构化分析主要是指对 MAP&#xff0c;STRUCT&#xff0c;JSON&#xff0c;ARRAY 等复杂数据类型的查询分析。这些数据类型表达能力强&#xff0c;因此被广泛应用到 OLAP 分析的各种场景中&#xff0c;但由于其实现的复杂性&#xff0c;对这些复杂类型分析将会比一般简单类型…

【单片机】改写DS2431芯片的地址码,地址ROM,DS2431芯片解密

对DS2431里面的128字节可以进行任意读写&#xff0c;方式可以看这里&#xff1a;https://blog.csdn.net/x1131230123/article/details/132248958 但DS2431芯片的地址码是光刻不可修改的&#xff0c;所以只有使用模拟芯片。 原理&#xff1a; https://www.dianyuan.com/article…

K8S Informer机制原理解读 | 架构设计

在Kubernetes系统中&#xff0c;组件之间通过HTTP协议进行通信&#xff0c;在不依赖任何中间件的情况下需要保证消息的实时性、可靠性、顺序性等。那么Kubernetes是如何做到的呢&#xff1f;答案就是Informer机制。Kubernetes的其他组件都是通过client-go的Informer机制与Kuber…

elemeentui el-table封装

elemeentui el-table封装 <template><div style"height: 100%;"><el-table ref"sneTable" element-loading-text"加载中" element-loading-spinner"el-icon-loading"element-loading-background"rgba(45,47,79…

限制API接口访问速率

文章目录 依赖注解aophelperTest 免责声明&#xff1a;本人无意侵权&#xff0c;奈何找不到原文作者&#xff0c;也找不到网址&#xff0c;于是自己记录一下&#xff0c;如果有侵权之嫌&#xff0c;请联系我删除文章 依赖 <!-- https://mvnrepository.com/artifact/com.goo…

在SpringBoot 3.2.1中使用JPA报错

在SpringBoot 3.2.1中使用JPA报错 最近在对接大模型&#xff0c;需要把机器人信息持久化到数据库&#xff0c;使用最简单的方式就是JPA了&#xff0c;所以我在pom.xml文件中引入了下面的依赖。 <dependency><groupId>org.springframework.boot</groupId>&l…

Java线程池配置由繁至简,找到适合自己的天命线程池

Java线程池配置由繁至简&#xff0c;找到适合自己的天命线程池 任务队列workQueue和饱和策略handler什么时候登场&#xff1f; 首先这里有几道经常考的线程池面试题&#xff1a; 简单介绍下线程池&#xff0c;核心数从corePoolSize 到maximumPoolSize 的变化过程&#xff1f;…

我用 ChatGPT 做了一次探索性数据分析,真的太太太实用了!

ChatGPT 经过短短1年时间的发展&#xff0c;其功能越来越强&#xff0c;现在已经是大多数企业和个人不可或缺的助手。特别是最新的 GPT-4 版本&#xff0c;专门在左边菜单栏给出了两个工具&#xff08;一个是数据分析&#xff0c;另一个是根据文字描述生成图片&#xff09;&…

教育的本质与教师发展:对能力大赛模板化现象的深度反思与批判——以快速技术迭代背景下的教学策略为审视视角

在我国当前的教育体系中&#xff0c;教师能力大赛等活动在一定程度上确实扮演了提升教师专业素养、推动教学改革的角色。它们通过竞争机制激发了教师自我提升的动力&#xff0c;并提供了一个展示教师教学才华的平台。然而&#xff0c;随着时间推移&#xff0c;此类活动却呈现出…

天拓分享:汽车零部件制造企业如何利用边缘计算网关和数网星平台实现数控机床数据采集分析

一、项目背景 某汽车零部件制造企业为了提高生产效率、降低能耗和提高产品质量&#xff0c;决定引入TDE边缘计算网关和数网星工业互联网平台&#xff0c;对数控机床进行数据采集与分析。 二、解决方案 1、设备选型与配置&#xff1a;考虑到企业生产需求和数控机床的特性&…

Opencv小项目——手势数字刷TIKTOK

​ 写在前面&#xff1a; 很久没更新了&#xff0c;之前的实习的记录也算是烂尾了&#xff0c;但是好在自己的实习记录还是有的&#xff0c;最近也忙碌了很多&#xff0c;终于放假了&#xff0c;今天下午正好没事&#xff0c;闲来无事就随便做个小玩意吧。 思来想去&#xff…

yolo9000:Better, Faster, Stronger的目标检测网络

目录 一、回顾yolov1二、yolov2详细讲解2.1 Better部分创新点&#xff08;1&#xff09;Batch Normalization(批量归一化)&#xff08;2&#xff09;High Resolution Classifier---高分辨率分类器&#xff08;3&#xff09;Anchor Boxes---锚框&#xff08;4&#xff09;Dimens…