- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个紧密的循环,我在其中获取相机图像,对其进行去畸变,然后根据某种变换(例如透视变换)对其进行变换。我已经想出为每个操作使用 cv::remap(...)
,这已经比使用普通矩阵操作更有效。
以我的理解,应该可以将查找映射合并为一个,并在每次循环迭代中仅调用一次重新映射。有没有规范的方法来做到这一点?我不想自己实现所有插值。
注意:该过程应该适用于不同大小的 map 。在我的特殊情况下,不失真保留了图像尺寸,而其他变换将图像缩放到不同的尺寸。
说明代码:
// input arguments
const cv::Mat_<math::flt> intrinsic = getIntrinsic();
const cv::Mat_<math::flt> distortion = getDistortion();
const cv::Mat mNewCameraMatrix = cv::getOptimalNewCameraMatrix(intrinsic, distortion, myImageSize, 0);
// output arguments
cv::Mat undistortMapX;
cv::Mat undistortMapY;
// computes undistortion maps
cv::initUndistortRectifyMap(intrinsic, distortion, cv::Mat(),
newCameraMatrix, myImageSize, CV_16SC2,
undistortMapX, undistortMapY);
// computes undistortion maps
// ...computation of mapX and mapY omitted
cv::convertMaps(mapX, mapY, skewMapX, skewMapY, CV_16SC2);
for(;;) {
cv::Mat originalImage = getNewImage();
cv::Mat undistortedImage;
cv::remap(originalImage, undistortedImage, undistortMapX, undistortMapY, cv::INTER_LINEAR);
cv::Mat skewedImage;
cv::remap(undistortedImage, skewedImage, skewMapX, skewMapY, cv::INTER_LINEAR);
outputImage(skewedImage);
}
最佳答案
您可以在 undistortMapX 和 undistortMapY 上应用重映射。
cv::remap(undistortMapX, undistrtSkewX, skewMapX, skewMapY, cv::INTER_LINEAR);
cv::remap(undistortMapY, undistrtSkewY, skewMapX, skewMapY, cv::INTER_LINEAR);
你可以使用:
cv::remap(originalImage , skewedImage, undistrtSkewX, undistrtSkewY, cv::INTER_LINEAR);
之所以可行,是因为 skewMaps 和 undistortMaps 是图像中的坐标数组,所以它应该类似于获取位置的位置......
编辑(回复评论):
我想我需要做一些澄清。 remap() 函数根据旧图像的像素计算新图像中的像素。在线性插值的情况下,新图像中的每个像素都是旧图像中 4 个像素的加权平均值。根据提供的 map 中的值,权重因像素而异。如果该值或多或少是整数,则大部分权重取自单个像素。因此,新图像将与原始图像一样清晰。另一方面,如果该值远非整数(即整数 + 0.5),则权重相似。这将产生平滑效果。要了解我在说什么,请查看未失真的图像。您会看到图像的某些部分比其他部分更清晰/更平滑。
现在回到有关将两个重新映射操作合二为一时发生的情况的解释。组合图中的坐标是正确的,即 skewedImage 中的像素是从具有正确权重的 originalImage 的正确 4 个像素计算得出的。但它与两次重映射操作的结果并不相同。 undistortedImage 中的每个像素都是 originalImage 的 4 个像素的加权平均值。这意味着 skewedImage 的每个像素都是 originalImage 的 9-16 个像素的加权平均值。结论:使用单个 remap() 可能不会 得到与两次使用 remap() 相同的结果。
关于两种可能的图像(单重映射()与双重映射())中哪一种更好的讨论是相当复杂的。通常最好进行尽可能少的插值,因为每次插值都会引入不同的伪像。特别是如果图像中的伪影不均匀(某些区域变得比其他区域更平滑)。在某些情况下,这些伪像可能会对图像产生良好的视觉效果——比如减少一些抖动。但如果这是你想要的,你可以通过更便宜和更一致的方式实现这一点。例如,在重新映射之前对原始图像进行平滑处理。
关于c++ - 如何将两个 remap() 操作合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29944709/
我有一堆不同大小的(灰度)图像,我调整它们的大小以确保一个维度相同并填充另一个维度(a la this answer)。然而,我在第 4 行(第二到下面代码的最后一行)。我将如何解决这个问题? 我尝试
现在我有了图像 A,我想将它重新映射到与图像 A 大小不同的图像 B。 对于每个像素坐标 (x, y),它在图像 B 上具有坐标 (r, theta)。 谁能告诉我如何实现它,最好有示例代码?因为我不
我得到了一个非常简单的二进制掩码。 1 = Sunday 2 = Saturday 4 = Friday 8 = Thursday 16 = Wednesday 32 = Tuesday 64 = M
我正在试用 userns-remap Docker 在容器内创建文件的功能 root用户并拥有此文件的所有者为 test主机上的用户。 我已将以下内容添加到 /etc/docker/daemon.js
cv::remap(imageA, dst1, map_x, map_y, cv::INTER_LINEAR,
我有一个紧密的循环,我在其中获取相机图像,对其进行去畸变,然后根据某种变换(例如透视变换)对其进行变换。我已经想出为每个操作使用 cv::remap(...),这已经比使用普通矩阵操作更有效。 以我的
我目前正在为一对立体相机编写 openCV 程序。完成相机校准和立体校准。 下一步是从我获得的 2 张图像中找到特征在空间中的位置。这就是为什么我必须对图像进行立体校正并在之后进行计算的原因。 我在
在 docker 中,在容器内创建的文件在从主机检查它们时往往具有不可预测的所有权。默认情况下,卷上文件的所有者是 root (uid 0),但是一旦非 root 用户帐户参与到容器中并写入文件系统,
我有一个比图像小 4 倍的网格,我想用来自网格的信息扭曲图像,但是,当使用 cv2.remap 时,它会使扭曲像素化(见下图)。我怎样才能使失真更平滑? 原文: 期望的输出: 我的输出: 我的代码:
我有一个键盘,在空格键旁边有一个神秘的 LNG 键,AltGr 通常位于该位置。有没有办法让AltGr(Alt)出来? 这是 LNG 键被按下并释放一次的 xev 控制台输出: KeyPress ev
我正在使用“dup”克隆一个事件记录模型(称为项目)。它有几个协会;一个项目有很多步骤,步骤有很多图片和视频等。 我发现当我克隆一个项目时,它会成功地创建该项目的相应步骤、图像和视频的克隆。但是,图像
(Mac)是否可以重新映射大写锁定以执行除操作系统预期用途以外的任何其他操作?我曾尝试在Karabiner和“系统偏好设置”>“键盘”>“修改键”中使用它,但是没有运气。这并不是使它成为修饰键,而只是
这是我应该问的问题,而不是这个: Emacs evil: space as a prefix key in motion state 我想定义一堆用于移动、移动、打开和关闭窗口和缓冲区的命令,这些命令
我正在尝试为我的 Aurelia(+ webpack + TypeScript)网站设置单元测试。我的 karma.conf.js 如下所示(类似于 aurelia-navigation 骨架中所做的
我遇到了以下简单代码的段错误: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #inclu
我把答案里的代码拿走了https://stackoverflow.com/a/10374811/4828720来自 Image transformation in OpenCV并尝试使它适应我的形象。
我有一个 11 x 11 顶点的网格。这个想法是每个点(顶点)都保存变形图像中该像素的归一化浮点位置。例如。如果我想拉伸(stretch)左上边缘,我写在第一个顶点 (-0.1, -0.1)。 我有网
运行后cat -t ,我测试了以下情况: ctrl + tab只加了一个tab空间 ctrl + /添加 ^_ ctrl + `添加 ^@ ctrl + shift + backspace向左删除(与
在this article Jeroen 解释了一个使用 XML 文件将 Java Bean getter 和 setter 重新映射到 .NET 属性的示例。 如果我想将名为 showDialog(
我想为插入模式下的导航映射以下内容: # 向左移动 # 向下移动 # 向上移动 # 向右移动 因此,我将以下内容添加到我的 .vimrc 中: inoremap inoremap in
我是一名优秀的程序员,十分优秀!