У меня есть проблема, чтобы указать тип переменных для ConvexityDefects в EmguCv 3.0.
Я не могу найти замену Vec4i для объявления «дефектов».
VectorOfVectorOfInt defects = new VectorOfVectorOfInt()
-> Это просто очередная попытка найти подходящий тип.
Каждый раз, когда у меня есть фатальная ошибка:
Исключение: «System.ArgumentException» в mscorlib.dll
Не найдено подходящего каталога для загрузки неуправляемых модулей
Возникло исключение: Emgu.CV.Util.CvException в Emgu.CV.dll
и программа перемещает меня сюда, чтобы соответствовать CvException:
private static int CvErrorHandler(
int status,
IntPtr funcName,
IntPtr errMsg,
IntPtr fileName,
int line,
IntPtr userData)
{
try
{
SetErrStatus(Emgu.CV.CvEnum.ErrorCodes.StsOk); //clear the error status
return 0; //signal the process to continue
}
finally
{
String funcNameStr = Marshal.PtrToStringAnsi(funcName);
String errMsgStr = Marshal.PtrToStringAnsi(errMsg);
String fileNameStr = Marshal.PtrToStringAnsi(fileName);
throw new CvException(status, funcNameStr, errMsgStr, fileNameStr, line);
}
}
Буду благодарен за вашу помощь.
Часть моего кода:
using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
{
CvInvoke.FindContours(grayImg, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);
int count = contours.Size;
for (int i = 0; i < count; i++)
{
using (VectorOfPoint contour = contours[i])
using (VectorOfVectorOfInt defects = new VectorOfVectorOfInt())
using (VectorOfPoint approxContour = new VectorOfPoint())
using (VectorOfPoint hull = new VectorOfPoint())
{
CvInvoke.ApproxPolyDP(contour, approxContour, 50, true);
CvInvoke.ConvexHull(contour, hull, false);
CvInvoke.Polylines(openCvImg, hull, true, new MCvScalar(0, 255, 0), 1, LineType.AntiAlias);
CvInvoke.ConvexityDefects(contour, hull, defects);
}
largest_contour_index = i;
}
CvInvoke.DrawContours(openCvImg, contours, largest_contour_index, new MCvScalar(0, 0, 255), 1, LineType.EightConnected);
}
У меня была точно такая же проблема … Я нашел решение в модульных тестах EmguCv (модульные тесты часто являются вашей лучшей документацией)
Тест называется TestConvexityDefacts и находится в файле AutoTestVarious в проекте Emgu.CV.Test.
Вот ссылка (но это не официальный репо)
Тестовый файл EmguCv
Официальный репозиторий здесь: git: //git.code.sf.net/p/emgucv/code emgucv
Решение состоит в том, чтобы использовать Mat, как IOutputArray. Получить данные из него не так просто; / Но этот модульный тест поможет.
Имейте в виду, что из матрицы вы получите индексы очков. Чтобы получить координаты точки, вам нужно использовать этот индекс для вектора контура точек.
Матрица имеет 3 столбца — начальная точка, конечная точка и самая дальняя точка.
Также у меня была проблема с корпусом VectorOfPoint в качестве входных данных в ConvexityDefects — мне пришлось изменить его на VectorOfInt — если бы я не сделал, метод ConvexityDefects выдал какое-то исключение …
Других решений пока нет …