首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Emgu CV ArucoInvoke.InterpolateCornersCharuco错误"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()“
EN

Stack Overflow用户
提问于 2019-10-11 16:02:15
回答 2查看 612关注 0票数 0

我正试图用EmguCV来检测charuco标记,并且从OpenCV网站复制和重写了示例

我的代码如下:

代码语言:javascript
运行
复制
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 <= I && int;(int)vv.size()“

corners.Size -> 12ids.values -> int[11]

这是我的图片样本:

我做错了什么?我使用的是EmguCV版本4.1.1.3497。我希望有人能帮我解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-13 12:02:45

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

改变

代码语言:javascript
运行
复制
var charucoCorners = new VectorOfVectorOfPointF();

代码语言:javascript
运行
复制
var charucoCorners = new Mat();

解决了这个问题。

票数 1
EN

Stack Overflow用户

发布于 2019-10-12 19:32:38

我尝试使用您提供的链接中的".png“图像编写代码,但没有显示任何错误。但是,当我尝试这个时:

这是".jpg",它显示。尝试使用".png“图像代替。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58344881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档