Emgu CV ArucoInvoke.InterpolateCornersCharuco выдает ошибку "Emgu.CV.Util.CvException: 'OpenCV: 0 <= i && i <(int) vv.size ()'" - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь обнаружить маркеры charuco с помощью EmguCV, и я скопировал и переписал пример с веб-сайта OpenCV.

Мой код выглядит следующим образом:

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 && i <(int) vv.size () "</p>

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

Вот мой пример изображения:

Charuco marker test image

Что я делаю не так? IЯ использую EmguCV версии 4.1.1.3497. Я надеюсь, что кто-то может помочь мне с этой проблемой.

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

После некоторого тестирования я нашел решение. По какой-то причине тип вывода обнаруженных углов чарука был неправильным.

Изменение

var charucoCorners = new VectorOfVectorOfPointF();

на

var charucoCorners = new Mat();

решило проблему.

0 голосов
/ 12 октября 2019

Я попробовал ваш код с изображением ".png" по указанной вами ссылке, и он не показал никаких ошибок. Однако, когда я попробовал это с этим: your image, который является ".jpg", это показало. Попробуйте вместо этого использовать изображение ".png".

...