最近,我一直在研究针孔相机模型,但我对OpenCV提供的模型和" 计算机视觉中的多视图几何 "教科书感到困惑.
我知道下面的照片是一个简化的模型,可以切换图像平面和相机框架的位置.为了更好地说明和理解,并考虑主点(u0,v0),两帧之间的关系是x=f(X/Z)+u0
和y=f(Y/Z)+v0
.
但是,我真的很困惑,因为通常图像坐标是第四象限坐标的形式,如下所示!
我可以直接将以下定义中的(x,y)替换为上述"等效"针孔模型,这种模型并不具有说服力吗?
此外,如果一个物体位于相机坐标区域(+ X,+ Y)象限(当然,Z> f),在等效模型中,它应该出现在图像坐标的右半平面上.但是,这种物体在普通相机拍摄的图像中,应该位于左半部分.因此,对我来说这种模式是不合理的.
最后,我尝试基于原始模型推导出如下的模型.
结果是x1=-f(X/Z)
和y1=-f(Y/Z)
.
然后,我试图找到(x2,y2)-coordinate和相机坐标之间的关系.结果是x2=-f(X/Z)+u0
和y2=-f(Y/Z)+v0
.
在(x3,y3)-coordinate和相机坐标之间,结果是x3=-f(X/Z)+u0
和y3=f(Y/Z)+v0
.
无论我尝试哪种坐标系统,都没有一种形式,x=f(X/Z)+u0
并且y=f(Y/Z)+v0
由一些简历教科书提供.
此外,由于相同的原因,在(x2,y2) - 坐标或(x3,y3)坐标上的投影结果也是不合理的:相机坐标中(+ X,+ Y,+ Z)区域中的对象应该"出现"在相机拍摄的图像的左半平面上.
任何人都可以表明我误解了什么吗?
这是我在Stack上的第一篇文章,所以我很抱歉我的笨拙.如果我能改进我的问题,请告诉我.
►我想实现的目标(从长远来看):
我尝试使用OpenCV Unity激光指针来操纵我的Unity3d演示文稿.
我相信一张图片的价值超过千言万语,所以这应该说得最多:
►问题是什么:
我尝试从摄像机视图(某种梯形)到平面空间进行简单的4点校准(投影).
我认为这将是非常基本和简单的事情,但我没有OpenCV的经验,我无法使其工作.
►样品:
我做了一个不太复杂的例子,没有任何激光检测和所有其他东西.我试图重新投射到平面空间只有4点梯形.
链接到整个示例项目:https://1drv.ms/u/s!AiDsGecSyzmuujXGQUapcYrIvP7b
我的例子中的核心脚本:
using OpenCVForUnity;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class TestCalib : MonoBehaviour
{
public RawImage displayDummy;
public RectTransform[] handlers;
public RectTransform dummyCross;
public RectTransform dummyResult;
public Vector2 webcamSize = new Vector2(640, 480);
public Vector2 objectSize = new Vector2(1024, 768);
private Texture2D texture;
Mat cameraMatrix;
MatOfDouble distCoeffs;
MatOfPoint3f objectPoints;
MatOfPoint2f imagePoints;
Mat rvec;
Mat tvec;
Mat rotationMatrix;
Mat imgMat;
void …
Run Code Online (Sandbox Code Playgroud) 我使用其他数据集(没有 kitti),但我需要将其转换为 kitti 数据集格式。我无法理解 kitti 中的校准矩阵是如何计算的。例子:
calib.txt 中的相机 2 (P2) 校准矩阵:
[718.856 0 607.1928 -386.1448]
[ 0 718.856 185.2157 0 ]
[ 0 0 1 0 ]
Run Code Online (Sandbox Code Playgroud)
我知道
[718.856 0 607.1928]
[ 0 718.856 185.2157]
[ 0 0 1 ]
Run Code Online (Sandbox Code Playgroud)
-- 是 K 相机固有的。但最后一栏是什么意思?
我建议,它是与第 0 个摄像机的偏移,以像素为单位测量。从kitti传感器设置中,我知道Cam 2相对于Cam 0在X轴上负偏移0.06m。 相机像素尺寸为4.65um。但
0.06[m] / (4.65 * 10^(-6)[m]) != 386.1448 [pixels]
Run Code Online (Sandbox Code Playgroud)
那么最后一栏是什么意思呢?以及如何计算校准矩阵,就像在 kitti 中一样。
如何为我的iPhone游戏正确校准加速度计?目前,当手机在平坦的表面上时,桨叶向左漂移.高通或低通滤波器不是可接受的解决方案,因为即使在低值和高值时我也需要完全控制桨.我知道Apple有BubbleLevel样本,但我觉得很难遵循......有人可以简化这个过程吗?
我的加速度计代码如下所示:
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
float acelx = -acceleration.y;
float x = acelx*40;
Board *board = [Board sharedBoard];
AtlasSprite *paddle = (AtlasSprite *)[board.spriteManager getChildByTag:10];
if ( paddle.position.x > 0 && paddle.position.x < 480) {
paddle.position = ccp(paddle.position.x+x, paddle.position.y);
}
if ( paddle.position.x < 55 ) {
paddle.position = ccp(56, paddle.position.y);
}
if ( paddle.position.x > 435 ) {
paddle.position = ccp(434, paddle.position.y);
}
if ( paddle.position.x < 55 && x > 1 ) {
paddle.position = ccp(paddle.position.x+x, paddle.position.y); …
Run Code Online (Sandbox Code Playgroud) 我正在使用热像仪进行项目,我有点难过,以至于如何考虑计算内在函数.通常的相机会决定棋盘上的不同点或类似的东西,但热像仪不会真的能够区分这些点.有没有人对热像仪的内在函数真正的外观有什么了解?
干杯!
编辑 - 除了我目前的伟大建议,我还在考虑在白色上使用铝箔来创造热差异.让我知道你对这个想法的看法.
camera opencv calibration computer-vision camera-calibration
我正在创建一个用于显示ECG的Web应用程序,这些应用程序通常在5mm方形网格上以固定比例(10 mm/mV和25 mm/s)绘制.使用正确尺寸非常重要,因为读者会将他们在屏幕上看到的内容与可能仅存在于纸上的其他ECG进行比较.
最推荐的解决方案是使用CSS来设置div的样式,使其具有(例如)1"乘1"的绝对尺寸,并使用JavaScript获取其高度和宽度(例如,参见如何检测屏幕DPI使用PHP或JavaScript).显然,这只有在浏览器知道(或可以发现)答案并且可以被欺骗透露它时才能起作用.我在Linux,Mac OS X和Windows上测试了这种方法,使用Chrome,Firefox,MSIE,Opera,Safari和Android浏览器,设备范围从智能手机(217 dpi)到19"(108 dpi),20"和30"(101 dpi)显示器,并且在所有情况下报告的分辨率为96 dpi.我的结论是这种方法不如手表损坏准确,除非你碰巧有一个96 dpi显示器,我正在寻找为了更好的东西.
我正在考虑只显示一个可调整大小的矩形,并要求用户将其调整为已知大小.有没有人已经这样做了(如果是的话,如何),或者有人有其他建议(例如在监视器数据库中查找屏幕大小)?
我已经阅读了这里和其他地方的相关讨论,很快就会找到图形绝对大小无关紧要的原因,只有细节的数量.我理解为什么这通常是正确的,但在这种情况下并非如此.
作为机械罗盘的使用者,我注意到磁力计提供的航向经常偏离45度或更多,尽管在那种情况下没有出现校准显示.
如果我在室外测试或使用我的应用程序,我会在罗盘视图出现时校准磁力计.这是有效的,似乎这是必要的.
我不希望通过使用八字形动作执行频繁校准,在可能实现或多或少精确的标题时向我的应用程序的用户显示不准确的标题.
每次我的指南针视图出现时,是否有人知道强制显示磁力计校准视图的解决方案?
我在这里搜索了所有(?)帖子,只有一个人有类似的想法,但没有答案.
Flutter Dart 有没有办法校准手机的传感器?
就我而言,我需要罗盘传感器。这是因为我正在 Flutter 指南针包之一(flutter_compass https://pub.dev/packages/flutter_compass)的帮助下开发一个应用程序,但每天它都会在不同的地方显示北极。仅当我通过内置校准工具(三星 Galaxy S7 edge)校准指南针时,北极才再次正确。此外,所有其他 Flutter 软件包(simple_flutter_compass、flutter_sensor_compass、flutter_compass_upgrade)都没有校准选项。
然而,我看到其他指南针应用程序都从校准程序开始。
谁能给我一个关于如何做到这一点的提示?代码片段。包。使用权。进一步阅读?
编辑:如果在 Flutter 中不可能,是否有办法以某种方式将其与之前的方法分开?
我正在使用 PySpark 为业务问题实施流失分类模型,但我拥有的数据集不平衡。因此,当我训练模型时,我随机选择了一个 1 和 0 数量相等的数据集。然后我将模型应用于实时数据,预测的 1 和 0 的数量显然相等。
现在,我需要校准我的训练模型。但是我找不到在 PySpark 中做到这一点的方法。有没有人知道如何在 PySpark 中校准模型,可能类似于 CalibratedClassifierCV ?
大家好,我无法理解如何使用sklearn.calibration.CalibratedClassifierCV
.
我已经使用这种方法校准了我的二元分类器,并且结果得到了很大的改善。但是我不确定如何解释结果。 sklearn 指南指出,校准后,
方法的输出
predict_proba
可以直接解释为置信水平。例如,一个校准良好的(二元)分类器应该对样本进行分类,使得在它给出的 Predict_proba 值接近 0.8 的样本中,大约 80% 实际上属于正类。
现在我想通过对模型应用 0.6 的截止值来预测 label 来减少误报True
。如果没有校准,我就会简单地使用my_model.predict_proba() > .6
. 然而,校准后,predict_proba 的含义似乎发生了变化,所以我不确定我是否可以再这样做。
从快速测试来看,预测和预测概率似乎遵循我在校准之前期望的相同逻辑。输出:
pred = my_model.predict(valid_x)
proba= my_model.predict_proba(valid_x)
pd.DataFrame({"label": pred, "proba": proba[:,1]})
Run Code Online (Sandbox Code Playgroud)
概率高于 0.5 的所有内容都将被归类为 True,而低于 0.5 的所有内容都将被归类为 False。
您能否确认,校准后,我仍然可以predict_proba
应用不同的截止值来识别我的标签?
2 https://scikit-learn.org/stable/modules/calibration.html#calibration
python machine-learning probability calibration scikit-learn
calibration ×10
opencv ×3
camera ×2
dpi ×1
flutter ×1
ios ×1
iphone ×1
kitti ×1
magnetometer ×1
probability ×1
pyspark ×1
python ×1
scikit-learn ×1