小编tim*_*mbo的帖子

OpenCV 3.0:校准不符合预期

当我使用OpenCV 3.0 calibrateCamera时,我得到的结果是我没想到的.这是我的算法:

  1. 加载30个图像点
  2. 加载30个相应的世界点(在这种情况下是共面的)
  3. 使用点校准相机,只是为了不扭曲
  4. 不扭曲图像点,但不使用内在函数(共面世界点,因此内在函数是狡猾的)
  5. 使用未失真的点来找到单应性,转换为世界点(可以这样做,因为它们都是共面的)
  6. 使用单应性和透视变换将未失真的点映射到世界空间
  7. 将原始世界点与映射点进行比较

我所拥有的点是嘈杂的,只有一小部分图像.单个视图中有30个共面点,因此我无法获得相机内在函数,但应该能够获得失真系数和单应性以创建前平行视图.

正如预期的那样,误差取决于校准标志.但是,它与我的预期相反.如果我允许所有变量调整,我会期望错误降低.我不是说我期待一个更好的模型; 我实际上期望过度拟合,但这仍然应该减少错误.我看到的是,我使用的变量越少,我的错误越低.最好的结果是直接的单应性.

我有两个可疑的原因,但它们似乎不太可能,我想在播出它们之前听到一个纯粹的答案.我已经拿出代码来做我正在谈论的事情.它有点长,但它包括加载点.

代码似乎没有错误; 我使用了"更好"的点,它完美无缺.我想强调的是,这里的解决方案不能是使用更好的点或执行更好的校准; 练习的重点是看各种校准模型如何响应不同质量的校准数据.

有任何想法吗?

添加

要清楚,我知道结果会很糟糕,我希望如此.我也明白,我可能会学习不良的失真参数,这会导致在测试尚未用于训练模型的点时导致更糟糕的结果.我不明白的是当使用训练集作为测试集时,失真模型如何有更多的错误.也就是说,如果cv :: calibrateCamera应该选择参数来减少所提供的训练点集的误差,那么它产生的错误比它刚为K!,K2,... K6,P1选择0时产生的误差更大. ,P2.不管数据与否,它至少应该在训练集上做得更好.在我说数据不适合这个模型之前,我必须确保我能用尽可能多的数据做到最好,而且我现在不能说这个.

这是一个示例图像

标有绿色针脚的点.这显然只是一个测试图像. 示例图片

这是更多的例子

在下文中,图像是从上面的大图像中裁剪出来的.该中心没有改变.当我只用绿色引脚手动标记的点并且允许K1(仅K1)从0变化时,会发生这种情况:

之前 设置图像,1920 x 1080,失真

将图像设置为1920 x 1080,不失真

我会把它归结为一个bug,但是当我使用更大的一组点来覆盖更多的屏幕时,即使是在一个平面上,它的工作也相当不错.这看起来很可怕.但是,错误并不像你从图片中看到的那样糟糕.

// Load image points
    std::vector<cv::Point2f> im_points;
    im_points.push_back(cv::Point2f(1206, 1454));
    im_points.push_back(cv::Point2f(1245, 1443));
    im_points.push_back(cv::Point2f(1284, 1429));
    im_points.push_back(cv::Point2f(1315, 1456));
    im_points.push_back(cv::Point2f(1352, 1443));
    im_points.push_back(cv::Point2f(1383, 1431));
    im_points.push_back(cv::Point2f(1431, 1458));
    im_points.push_back(cv::Point2f(1463, 1445));
    im_points.push_back(cv::Point2f(1489, 1432));
    im_points.push_back(cv::Point2f(1550, 1461));
    im_points.push_back(cv::Point2f(1574, 1447));
    im_points.push_back(cv::Point2f(1597, 1434));
    im_points.push_back(cv::Point2f(1673, 1463));
    im_points.push_back(cv::Point2f(1691, 1449));
    im_points.push_back(cv::Point2f(1708, 1436));
    im_points.push_back(cv::Point2f(1798, 1464));
    im_points.push_back(cv::Point2f(1809, 1451));
    im_points.push_back(cv::Point2f(1819, 1438));
    im_points.push_back(cv::Point2f(1925, 1467));
    im_points.push_back(cv::Point2f(1929, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv camera-calibration

41
推荐指数
1
解决办法
1708
查看次数

使用Java NIO直接访问Windows磁盘

我正在使用一个使用Java NIO的库,以便直接将文件映射到内存,但我无法直接读取磁盘.

可以直接使用FileInputStreamUNC 读取磁盘,例如

File disk = new File("\\\\.\\PhysicalDrive0\\");
try (FileInputStream fis = new FileInputStream(disk);
    BufferedInputStream bis = new BufferedInputStream(fis)) {
    byte[] somebytes = new byte[10];
    bis.read(somebytes);
} catch (Exception ex) {
    System.out.println("Oh bother");
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法将其扩展到NIO:

File disk = new File("\\\\.\\PhysicalDrive0\\");
Path path = disk.toPath();
try (FileChannel fc = FileChannel.open(path, StandardOpenOption.READ)){
    System.out.println("No exceptions! Yay!");
} catch (Exception ex) {
    System.out.println("Oh bother");
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪(由原因决定)是:

java.nio.file.FileSystemException: \\.\PhysicalDrive0\: The parameter is incorrect.

at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at …
Run Code Online (Sandbox Code Playgroud)

java nio disk unc drive

8
推荐指数
1
解决办法
1898
查看次数

给出R中可以处理的离散CDF的分位数函数

例如,我有一个带CDF的离散函数,如下所示:

cdf <- c(0.00, 0.35, 0.71, 0.92, 1.00, 1.00, 1.00, 1.00)
Run Code Online (Sandbox Code Playgroud)

我可以使用以下行创建一种分位数函数...

result <- which(cdf == min(cdf[cdf > x]))
Run Code Online (Sandbox Code Playgroud)

...其中x是累积概率.例如,qfunction(0.9)= 4,qfunction(0.99)= 5.

这个解决方案似乎很好(虽然不优雅),直到我想处理矢量.因此,如果x = c(0.9,0.99),我的函数就会崩溃.这似乎是人们在R中做了很多事情,但我还没有找到解决方案.R不是我的主要语言.

任何帮助,将不胜感激.

r cdf

4
推荐指数
1
解决办法
356
查看次数

如何在dplyr的do()输出上使用coef()

我的问题几乎dplyr 0.3.0.9000中回答如何正确使用do(),但并不完全.

我有一些看起来像这样的数据:

> head(myData)
   Sequence Index  xSamples ySamples
6         0     5 0.3316187 3.244171
7         0     6 1.5131778 2.719893
8         0     7 1.9088933 3.122991
9         0     8 2.7940244 3.616815
10        0     9 3.6500311 3.519641
Run Code Online (Sandbox Code Playgroud)

序列实际上在0到9999之间.在每个序列中,xSamples和ySamples都应该相对于Index是线性的.计划是按顺序对myData进行分组,然后在每个组上使用lm()via do().代码就像这样(从帮助中无耻地解除):

library(dplyr)
myData_by_sequence <- group_by(myData, Sequence)
models <- myData_by_sequence %>% do(mod = lm(xSamples ~ Index, data = .))
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我得到的结果就是这个...

> head(models)
Source: local data frame [10000 x 2]

  Sequence     mod
1        0 <S3:lm>
2        1 <S3:lm> …
Run Code Online (Sandbox Code Playgroud)

r lm dplyr

3
推荐指数
1
解决办法
296
查看次数

标签 统计

r ×2

c++ ×1

camera-calibration ×1

cdf ×1

disk ×1

dplyr ×1

drive ×1

java ×1

lm ×1

nio ×1

opencv ×1

unc ×1