remap的那些事

月14日 

今天还在看启动代码,看到target.c这里。先说说target.c的职责。target.c文件包含和目标初始化相关的

代码,如remap设置、系统时钟设置和存储器加速模块设置等,以及IRQ和FIQ的异常处理空函数。好吧,这里

看到了remap就好好查资料把它搞清楚咯!其实我前面看过这个了,只是人上了年纪就健忘还得重新温习下,

不过效果还真的不错相信以后不会忘记了!哈哈!现在分享下吧!

remap---存储器映射控制器

看到了吗?顾名思义,它是来控制映射的,不要怀疑你的直觉,就是这样!存储器映射控制器用于改变从地

址0x00000000开始的中断向量的映射。允许运行在不同存储器空间中的代码对中断进行控制。*我估计有人看

到这里会犯嘀咕了。当arm处理器上电或者reset之后,处理器从0x0取址。因此必须保证系统上电时,0x0处

有指令执行。所以,上电的时候,0x0地址处必定是rom或者flash。把ram映射到这里是为了加快启动速度、

方便更改异常向量表,加快中断响应速度。现在应该有了点大概的了解了吧。哈哈!!!

我们来看看存储器映射控制的注意事项和映射控制的对应关系

存储器映射器只从处理arm异常(中断)必须的3个数据源(flash中断向量、sram中断向量和boot block中断

向量,每个64个字节)中选择一个使用。

它们的关系如下:

mammap[1:0]=00 :boot装载程序模式。中断向量从boot block重新映射

mammap[1:0]=01 :用户flash模式。

mammap[1:0]=10 :用户ram模式。

下面给个例子,每当产生一个软中断请求,arm内核就从0x00000008处取出32位数据。当mammap[1:0]=10时,

从0x00000008的读数/取指是对0x40000008单元进行操作。其他同理。

Remap前后,不同之处就是RAM的位置变了。为了达到Remap的目的,就是加快启动的速度和异常处理速度,一
定要初始化异常堆栈和建立异常向量表的。

简而言之,地址重映射就是可以通过软件配置来改变一块存储器物理地址的一种机制或方法。


参考remap详细讲解:http://hi.baidu.com/suqiniat/blog/item/561ac6d95450dd2910df9b31.html

### OpenCV 中 `remap` 函数的具体含义与使用方法 #### 1. **`remap` 的基本概念** `remap` 是一种用于执行自定义几何变换的工具,它通过提供两个映射数组(`map_x` 和 `map_y`),将输入图像中的像素重新定位到目标图像的位置。其核心公式如下: \[ \texttt{dst}(x, y) = \texttt{src}(map_x(x, y), map_y(x, y)) \] 其中: - \( x, y \) 表示目标图像上的位置。 - \( map_x(x, y) \) 和 \( map_y(x, y) \) 定义了如何从源图像中获取对应的目标像素值。 如果 \( map_x(x, y) \) 或 \( map_y(x, y) \) 并不是整数值,则会利用插值算法计算出近似的结果[^1]。 --- #### 2. **`remap` 的参数说明** 以下是 Python 版本中调用 `cv2.remap()` 方法的主要参数及其作用: ```python import cv2 import numpy as np # 基础语法 dst = cv2.remap(src, map_x, map_y, interpolation[, dst=None[, borderMode=cv.BORDER_CONSTANT[, borderValue=[0,0,0]]]]) ``` | 参数 | 描述 | |--------------|----------------------------------------------------------------------------------------| | `src` | 输入图像 | | `map_x` | X 方向的映射矩阵,通常是一个单通道浮点型 NumPy 数组 | | `map_y` | Y 方向的映射矩阵 | | `interpolation` | 插值方式:可以选择 `cv.INTER_NEAREST`, `cv.INTER_LINEAR`, `cv.INTER_CUBIC` 等 | | `borderMode` | 边界填充模式,默认为 `cv.BORDER_CONSTANT` | | `borderValue`| 当边界外区域未定义时使用的默认颜色 | --- #### 3. **Python 实现示例** 下面展示了一个简单的例子,演示如何使用 `remap` 对图像进行扭曲变形: ```python import cv2 import numpy as np # 加载原始图像 image = cv2.imread('input_image.jpg') # 创建映射矩阵 height, width = image.shape[:2] map_x = np.zeros((height, width), dtype=np.float32) map_y = np.zeros((height, width), dtype=np.float32) for i in range(height): for j in range(width): # 自定义映射逻辑(这里简单地加上偏移量) map_x[i][j] = j + 5 * np.sin(i / 50.0) map_y[i][j] = i + 5 * np.cos(j / 50.0) # 应用 remap 进行变换 output = cv2.remap(image, map_x, map_y, cv2.INTER_LINEAR) # 显示结果 cv2.imshow('Original', image) cv2.imshow('Transformed', output) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码创建了一种波浪形的效果,展示了如何灵活调整映射关系以实现复杂的几何变换。 --- #### 4. **C# 中 Emgu CV 的 Remap 方法** 在 C# 中,Emgu CV 提供了类似的接口来完成这一功能。相比于直接操作指针的方式,Emgu 更加安全且易于理解。以下是一段基于 Emgu CV 的代码片段: ```csharp using System; using Emgu.CV; using Emgu.CV.CvEnum; class Program { static void Main(string[] args) { Mat inputImage = CvInvoke.Imread("input_image.jpg"); int height = inputImage.Rows; int width = inputImage.Cols; // 构建映射矩阵 Mat mapX = new Mat(new Size(width, height), DepthType.Cv32F, 1); Mat mapY = new Mat(new Size(width, height), DepthType.Cv32F, 1); using (Matrix<float> mx = mapX.ToMatrix()) using (Matrix<float> my = mapY.ToMatrix()) { for(int row=0;row<height;row++) { for(int col=0;col<width;col++) { float newX = col + 5f * Math.Sin(row / 50.0); // 自定义映射规则 float newY = row + 5f * Math.Cos(col / 50.0); mx[row, col] = newX; my[row, col] = newY; } } } // 执行 remap 操作 Mat result = new Mat(); CvInvoke.Remap(inputImage, result, mapX, mapY, Inter.Linear); // 展示结果 CvInvoke.Imshow("Result", result); CvInvoke.WaitKey(0); } } ``` 此代码实现了与前面 Python 示例相同的功能,但采用了更贴近 .NET 开发者的风格[^2]。 --- #### 5. **`remap` 在编程中的意义** `remap` 的主要用途在于支持高度定制化的几何变换需求。相比其他预设好的函数(如旋转、缩放等),它可以自由设计任意形式的空间映射关系。这使得该技术广泛应用于以下几个领域: - 图像矫正(校正镜头畸变)。 - 虚拟视图生成(例如全景拼接)。 - 数据增强(随机扰动训练样本)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值