Я долго пытался реализовать обнаружение поз в EmguCV безуспешно. У меня есть успешная программа на C ++ с использованием OpenCV. Когда я попытался перевести его в C#, я не смог go над «BlobFromImage», потому что я получил исключение («Нарушение прав доступа») ... Я пробовал несколько вещей, я компилирую в x64, и изображение правильное (я могу показать его без проблем как изображение). До этого я использовал Mat вместо UMat, но это то же самое. Версия Emgu: 4.2.0.3662 (также пробовал с другими версиями, но по-прежнему выдает ту же ошибку. Если это может помочь, см. Код ниже:
private void Prova()
{
VideoCapture cap = new VideoCapture(videoFile);
if (!cap.IsOpened)
{
Debug.WriteLine("Unable to connect to camera");
return;
}
UMat frame;
int frameWidth = (int)cap.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameWidth);
int frameHeight = (int)cap.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameHeight);
VideoWriter video = new VideoWriter("Output-Skeleton-Davide-MPI-GPU-168.avi", VideoWriter.Fourcc('M', 'J', 'P', 'G'), new System.Drawing.Size(frameWidth, frameHeight), false);
Net net = Emgu.CV.Dnn.DnnInvoke.ReadNetFromCaffe("./pose_deploy_linevec.prototxt", "./pose_iter_160000.caffemodel");
net.SetPreferableBackend(Emgu.CV.Dnn.Backend.Default);
net.SetPreferableTarget(Emgu.CV.Dnn.Target.OpenCL);
frame = cap.QueryFrame().GetUMat(Emgu.CV.CvEnum.AccessType.ReadWrite);
if (frame.Rows != 0 && frame.Cols != 0)
{
// Exception thrown here...
Emgu.CV.UMat inpBlob = Emgu.CV.Dnn.DnnInvoke.BlobFromImage(frame).GetUMat(Emgu.CV.CvEnum.AccessType.ReadWrite);
net.SetInput(inpBlob);
}
}
Я знаю, что я мог бы вызвать код c ++ из C#, но я бы предпочел сделать это только из C#. Большое спасибо