- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在我的 OpenCV 和 OpenGL 组件之间来回切换,我不确定这两者中的哪一个应该更正这个问题。
使用 OpenCV 相机校准产生 fx、fy,纵横比大约为 1,这对应于正方形大小的图像。我的校准输出:
...
image_width: 640
image_height: 480
board_width: 6
board_height: 9
square_size: 5.
flags: 0
camera_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 6.6244874649105122e+02, 0., 3.4060477796553954e+02,
0., 6.4821741696313484e+02, 2.5815418044786418e+02,
0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
rows: 5
cols: 1
dt: d
data: [ -1.1832005538154940e-01, 1.2254891816651683e+00, 3.8133468645674677e-02, 1.3073747832019200e-02, -3.9497162757084490e+00 ]
但是,正如您在校准输出中看到的那样,我的图像宽度为 640x480。
当我在框架中检测到棋盘并使用 OpenGL 绘制棋盘时,OpenGL 在高度上呈现正常但在宽度方向上拉伸(stretch),因此它不适合棋盘的实际位置。肯定能解决它的是将校准的 fx 分量乘以 480/640,但我不知道这是否可行。
我该如何纠正这个问题?使用图像大小缩放校准值,或者在 OpenGL 中做一些事情来修复它?
编辑
捕捉和展示是有区别的。我使用经过校准的智能手机捕捉图像,该智能手机输出 640x480 的图像。
为了找到棋盘,我使用了如上所示的内部函数,它们已经过校准。
那么,不管我给OpenGL的宽高比是fx/fy,640/480还是fx/fy * 640/480,都是错误的。在 OpenGL 中投影回来的棋盘,OpenGL 投影回来的东西在宽度方向上被拉伸(stretch)。
它在 OpenGL 中看起来完全正确的唯一方法是,如果我使用 fx=640,fy=480 寻找棋盘。这也是错误的,因为现在我完全忽略了相机的内在特性……
编辑2
我的意思是,无论我如何设置传递给 gluPerspective 的纵横比,结果都不正确。
gluPerspective( /* field of view in degree */ m_fovy,
/* aspect ratio */ 1.0/m_aspect_ratio,
/* Z near */ 1.0, /* Z far */ 1000.0);
我对 m_aspect_ratio 值的尝试:
所有似乎都在搞砸宽度。请注意,在我的屏幕截图中,棋盘的原点是图像中最上层的内角:它放置正确,图像中最下层的内角也是如此。这是一个缩放问题..
编辑3
这真的非常愚蠢。我正在为 OpenGL 设置纵横比:
gluPerspective( /* field of view in degree */ m_fovy,
/* aspect ratio */ 1.0/m_aspect_ratio,
/* Z near */ 1.0, /* Z far */ 1000.0);
和设置
m_aspect_ratio = viewportpixelheight / viewportpixelwidth;
没有意识到 viewportpixelheight
和 viewportpixelwidth
是整数,所以我正在做整数除法,结果要么是 1,要么(交换它们时)是 0。
最佳答案
相机校准矩阵将世界坐标映射到图像坐标。 OpenGL 将图像坐标映射到屏幕坐标。如果您的问题在于图像的显示方式,您应该在 OpenGL 中处理它。
对于造成的困惑,我深表歉意。我试图做的是区分捕获和显示图像。你是正确的,物理相机的宽高比可以从焦距计算出来。这些焦距和宽高比由相机的硬件固定。一旦您捕获了该图像,您就可以自由地以您使用 OpenGL 选择的任何宽高比显示它。您可以随心所欲地裁剪和拉伸(stretch)图像,以更改显示内容的纵横比。相机的宽高比不一定与屏幕的宽高比相匹配。 OpenCV 使用来自物理相机的直接原始测量值来计算相机校准矩阵。如果我们假设它们是正确且不变的(如果没有缩放,这两者似乎都是合理的),那么纵横比的任何进一步变化都是 OpenGL 的责任。当我说 fx 和 fy 不能确定宽高比时,我指的是显示的宽高比,它根本不是很清楚,我很抱歉。
另外,我应该提一下,您可以根据焦距计算纵横比的原因是焦距以像素为单位表示,而这些单位在 x 轴和 y 轴上可能不同。可以找到简要说明here
我找到的关于相机矩阵中焦距的最佳解释是在 Computer Vision Algorithms and Applications 的相机内在部分。 .在 pdf 中,它从书的第 72 页、第 50 页开始。
关于opengl - 相机标定 : aspect ratio different from image aspect ratio. 如何校正?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13196893/
当我调用 png.Decode(imageFile) 时,它返回类型 image.Image。但我找不到将其转换为 image.NRGBA 或 image.RGBA 的记录方式,我可以在其上调用 At
image/jpeg 和 image/png 包有 Decode 和 Encode 函数,可以读取和写入 jpeg 和 png 图像,但 image/gif 包没有 - 只有 Decode 和 Dec
我正在尝试从一系列任意的非调色板图像创建动画 GIF。为了创建调色板图像,我需要以某种方式想出一个调色板。 // RGBA, etc. images from somewhere else var f
我在今年夏天的空闲时间使用 Go 镜像包进行一些练习。 package main import ( "os" "image" "image/png" "image/co
关闭。这个问题需要debugging details .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 Improve this question 今天
我正在尝试在 TilePane 中列出图像。当我尝试创建图像 new ImageView("address"); 时出现错误,地址如下: "file:D:/Chrysanthemum.jpeg/" 以
我有一个用于为画廊选择图像的表单,我希望允许用户仅选择 jpg、gif 和 png 图像格式。 现在,为了测试,我将图像的扩展名更改为 .bmp,例如“image1.bmp”,当我在输入文件中单击以选
我有创建图像的代码:(m_img 是 javafx.scene.image.Image) Image m_img = new Image("file:" + p_Fil.getAbsoluteFile
假设我有一个这样的 8 位灰度图像: var pixels []byte = ... width := 100 height := 100 如何将其转换为实现 image.Image 的东西? 最佳答
这段代码是我在localhost:8088 URL上的索引/主页的一部分,如果我想将用户发送到url localhost:8088/image/1,我应该写href='image/{{$image->
我正在尝试对图像进行简单的裁剪。这是代码 from PIL.Image import Image def get_image_half(image, half="upper"): if hal
我在这个问题上花了一整天,但在堆栈溢出中没有看到答案! 我试过了但是没用: >> pil_image = Image.frombytes('RGBA', wand_image.size, wa
所以,我是那些以始终使用最新版本的浏览器而自豪的人之一(当然 Internet Explorer 除外 - 我说的不是那个浏览器)。 我遇到了 this awesome CSS3 website详细介
如果 image_tag 无法从 url 加载图像,我想呈现默认图像: 因此,如果 image_tag 无法从 url 加载图像: 然后呈现默认值: 这将生成结果 HTML: 关于image -
我正在创建一个类似横幅的组件,并将图像设置为组件的背景,但我无法让它工作。我尝试了网上发布的不同建议,但没有成功,目前我不确定我的错误是否在 react 代码中,或者是 webpack 没有正确加载文
如何解决 Dart 中的这种歧义错误。 import 'dart:io'; import 'package:flutter/material.dart'; import 'package:camera
Center( child: CachedNetworkImage( imageUrl: "http:/ sosme link he
设置 www.website.com/sds/(index.htm) 以便鼠标悬停在不同位置时显示图像。 出于某种原因,当您将鼠标悬停在蓝色气球上时,图像 2.jpg 和 3.jpg(在蓝色气球上来回
社交网络在共享 URL 时可以很好地从网站中提取标题和描述,但对于图像,仍然需要创建自定义元标记:property="og:image" name="twitter:image" itemprop="
我正在尝试写一个简短的,它将读取一个 PNG 文件,并将一个 channel 与另一个 channel (R,G,B) 交换作为可能的选择。 但是,我无法找到如何从 image.At(x,y) 返回的
我是一名优秀的程序员,十分优秀!