相机校准的目的是找到内在和外在参数:
长度,失真等),我可以得到这些值,没问题。
AccessViolationException
。 执行这种校准的一种方法是
从3D点和2D点之间的对应关系中找到
对calibration function的调用如下所示:
Mat[] rotationVectors = new Mat[1];
Mat[] translationVectors = new Mat[1];
double error = CvInvoke.CalibrateCamera(realCorners,
detectedCorners,
calibrationImages[0].Image.Size,
cameraMatrix,
distortionCoefficients,
0,
new MCvTermCriteria(30, 0.1),
out rotationVectors,
out translationVectors);
Console.WriteLine(rotationVectors[0].Size); // AccessViolationException
translation
-/ rotationVector
产生不同的结果,这使我怀疑仅使用一张图像是一个问题。 cameraMatrix
和distortionCoefficients
都可以访问并包含值。 (我只尝试发布代码的相关部分)为什么我在
AccessViolationException
和rotationVectors
上得到一个translationVectors
? 我放置了一个断点,发现内部
Data
属性是null
。查看VS调试器的屏幕截图:这就解释了为什么我无法访问它。但是为什么首先是
null
? 最佳答案
这是因为EmguCV中的错误。你在打电话
public static double CalibrateCamera(
MCvPoint3D32f[][] objectPoints,
PointF[][] imagePoints,
Size imageSize,
IInputOutputArray cameraMatrix,
IInputOutputArray distortionCoeffs,
CvEnum.CalibType calibrationType,
MCvTermCriteria termCriteria,
out Mat[] rotationVectors,
out Mat[] translationVectors)
在此方法中有一个调用
public static double CalibrateCamera(
IInputArray objectPoints,
IInputArray imagePoints,
Size imageSize,
IInputOutputArray cameraMatrix,
IInputOutputArray distortionCoeffs,
IOutputArray rotationVectors,
IOutputArray translationVectors,
CvEnum.CalibType flags,
MCvTermCriteria termCriteria)
IOutputArray rotationVectors
应该复制到Mat[] rotationVectors
。对于translationVectors,也是一样。问题出在this循环中。有
for (int i = 0; i < imageCount; i++)
{
rotationVectors[i] = new Mat();
using (Mat matR = rotationVectors[i]) // <- bug
matR.CopyTo(rotationVectors[i]);
translationVectors[i] = new Mat();
using (Mat matT = translationVectors[i]) // <- bug
matT.CopyTo(translationVectors[i]);
}
并且应该有
for (int i = 0; i < imageCount; i++)
{
rotationVectors[i] = new Mat();
using (Mat matR = rVecs[i])
matR.CopyTo(rotationVectors[i]);
translationVectors[i] = new Mat();
using (Mat matT = tVecs[i])
matT.CopyTo(translationVectors[i]);
}
最后,要获得旋转和平移值,您可以使用
DataPointer
复制数据var rotation = new Matrix<float>(rotationVectors[0].Rows, rotationVectors[0].Cols, rotationVectors[0].DataPointer);
关于c# - 在emgu CV中进行摄像机校准后,如何访问旋转和平移矢量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33127581/