【问题标题】:Emgu CV ArucoInvoke.InterpolateCornersCharuco gives error "Emgu.CV.Util.CvException: 'OpenCV: 0 <= i && i < (int)vv.size()'"Emgu CV ArucoInvoke.InterpolateCornersCharuco 给出错误“Emgu.CV.Util.CvException: 'OpenCV: 0 <= i && i < (int)vv.size()'”
【发布时间】:2019-10-13 20:02:45
【问题描述】:

我正在尝试使用 EmguCV 检测 charuco 标记,并且我已经从 OpenCV 网站复制并重写了 example

我的代码如下:

Mat cameraMatrix = new Mat(new Size(3, 3), Emgu.CV.CvEnum.DepthType.Cv32F, 1);
Emgu.CV.Matrix<float> matrix = new Emgu.CV.Matrix<float>(3, 3);
matrix.Data[0, 0] = 925.6412f;
matrix.Data[0, 2] = 640.055f;
matrix.Data[1, 1] = 925.4835f;
matrix.Data[1, 2] = 338.2524f;
matrix.Data[2, 2] = 1;
cameraMatrix = matrix.Mat;
Mat distCoefficients = new Mat(new Size(5, 1), Emgu.CV.CvEnum.DepthType.Cv32F, 1);
Emgu.CV.Matrix<float> matrix2 = new Emgu.CV.Matrix<float>(5, 1);
matrix2.Data[0, 0] = 0;
matrix2.Data[1, 0] = 0;
matrix2.Data[2, 0] = 0;
matrix2.Data[3, 0] = 0;
matrix2.Data[4, 0] = 0;
distCoefficients = matrix2.Mat;
var image = new Image<Bgr, byte>("test.png");
var imageOut = new Image<Bgr, byte>(image.Width, image.Height);
var dictionary = new Dictionary(Dictionary.PredefinedDictionaryName.Dict4X4_100);
var detectorParameters = DetectorParameters.GetDefault();
var rejected = new VectorOfVectorOfPointF();
var board = new CharucoBoard(5, 5, 0.04f, 0.03f, dictionary);
VectorOfInt ids = new VectorOfInt();
VectorOfVectorOfPointF corners = new VectorOfVectorOfPointF();
ArucoInvoke.DetectMarkers(image, dictionary, corners, ids, detectorParameters, rejected);
if (ids.Size> 0)
{
    var charucoIds = new VectorOfInt();
    var charucoCorners = new VectorOfVectorOfPointF();
    ArucoInvoke.InterpolateCornersCharuco(corners, ids, image, board, charucoCorners, charucoIds, cameraMatrix, distCoefficients);
    // if at least one charuco corner detected
    if (charucoIds.Size > 0)
    {
        ArucoInvoke.DrawDetectedCornersCharuco(imageOut, charucoCorners, charucoIds, new MCvScalar(0, 255, 0));
        Mat rvec = new Mat();
        Mat tvec = new Mat();
        bool valid = ArucoInvoke.EstimatePoseCharucoBoard(charucoCorners, charucoIds, board, cameraMatrix, distCoefficients, rvec, tvec);       
        if (valid)
            ArucoInvoke.DrawAxis(imageOut, cameraMatrix, distCoefficients, rvec, tvec, 0.1f);
    }
}
imageOut.Save("out.png");

ArucoInvoke.InterpolateCornersCharuco 方法中我得到了异常:

OpenCV: 0

corners.Size -&gt; 12ids.values -&gt; int[11]

这是我的示例图片:

我做错了什么?我正在使用 EmguCV 版本 4.1.1.3497。我希望有人可以帮助我解决这个问题。

【问题讨论】:

    标签: c# opencv emgucv


    【解决方案1】:

    经过一些测试,我找到了解决方案。由于某种原因,检测到的 charuco 角的输出类型不正确。

    变化

    var charucoCorners = new VectorOfVectorOfPointF();
    

    var charucoCorners = new Mat();
    

    解决了问题。

    【讨论】:

      【解决方案2】:

      我使用您提供的链接中的“.png”图像尝试了您的代码,但没有显示任何错误。然而,当我用这个尝试它时: 这是“.jpg”,它显示了。尝试改用“.png”图片。

      【讨论】:

      • 感谢您查看问题。但是,我用来测试的图像实际上是一个png,它只是上传的图像是jpg。网站上的原始图片也不适合我。
      • 你能放这张“png”图片吗?
      • 你可以找到png here
      猜你喜欢
      • 2021-05-17
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2023-03-17
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多