我正在使用网络摄像头进行人脸识别。每次检测到面部时,系统将连续处理数据。我正在使用EmguCV
,一个OpenCV
包装器。代码正在运行并且能够处理数据。但有一次,系统在执行System.AccessViolationException
函数时抛出Emgu.CV.Face.FaceRecognizer.Predict(IInputArray image)
异常,并且
它总是停在那里。
以下是导致问题的代码的一部分:
public void recognizeUser(Bitmap userImage, out string label, out int confidentLevel)
{
Image<Gray, byte> imgToRecognize = new Image<Gray, byte>(userImage).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic);
Image<Gray, byte> grayFrame = imgToRecognize.Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic);
var lbphResult = _lbphRecognizer.Predict(imgToRecognize); // Exception occurs here.
label = lbphResult.Label.ToString();
confidentLevel = (int)lbphResult.Distance;
}
这是我得到的错误:
System.AccessViolationException :'尝试读取或写入受保护的内存。这通常表明其他内存已损坏。'
这是堆栈跟踪:
at Emgu.CV.ContribInvoke.CvFaceRecognizerPredict(IntPtr recognizer, IntPtr image, Int32& label, Double& distance)
at Emgu.CV.Face.FaceRecognizer.Predict(IInputArray image)
这是一种错误还是我错过了什么?或者是因为有这么多数据被同时处理?任何帮助将不胜感激。
2017年12月19日更新:以下是我捕获数据的方式:
private void PerformDetection()
{
while (true)
{
DetectionResult[] detectionResult = detection.DoDetection(detectionEngineId); // Capture the face
foreach (var detResult in detectionResult)
{
string label = "0";
int confidentLevel = 0;
lock (detResult)
{
if (!IsTrainRecognition)
{
Bitmap imgToRecognize = (Bitmap)detResult.FaceImage.Clone();
_recognition.recognizeUser(imgToRecognize, out label, out confidentLevel); // Call the function above.
if (confidentLevel < 40)
{
IsTrainRecognition = true;
// Start training new face.
}
}
else
{
// Keep training until 10 image are trained and updated in YAML file.
}
// Saving the detection data in local database.
}
}
}
}