#emgucv
#emgucv
Вопрос:
Я использую EMGUCV для распознавания и распознавания лиц, и используется версия «3.3.0», а используемая IP-камера — CP Plus bullet camera.
Я могу выполнять обнаружение и распознавание, но видео в реальном времени при распознавании очень медленное, почти на 10-15 секунд отстает от фактического потока. Не уверен, что это связано с кодом.
Ниже приведен код, который я сделал до сих пор. Не уверен, как я могу ускорить процесс.
Form_Load()
{
_videoCapture = new VideoCapture("rtsp://uname:pwd@19.18.1.40:554");
Application.Idle = new EventHandler(FrameGrabber_Standard);
}
private void FrameGrabber_Standard(object sender, EventArgs e)
{
try
{
Image<Bgr, Byte> currentFrame = _videoCapture.QueryFrame().ToImage<Bgr, Byte>().Resize(640, 480, Inter.Cubic);
if (currentFrame != null)
{
Image<Gray, byte> gray_frame = currentFrame.Convert<Gray, Byte>();
List<Rectangle> listFaces = new List<Rectangle>();
detectfacensobj.DetectFaces(currentFrame, listFaces); //the actual face detection happens here
foreach (Rectangle face in listFaces)
{
faceResult = currentFrame.Convert<Bgr, byte>();
if (Eigenfaces.IsTrained)
{
Image<Gray, byte> grayFaceResult = faceResult.Convert<Gray, byte>();
var result = Eigenfaces.eigenFaceRecognizer.Predict(grayFaceResult.Resize(200, 200, Inter.Cubic));
if (result.Label != -1)
{
CvInvoke.PutText(currentFrame, Eigenfaces.eigenlabels[result.Label], new System.Drawing.Point(face.X - 2, face.Y - 2), FontFace.HersheyComplex, 1.0, new Bgr(Color.Orange).MCvScalar);
}
}
currentFrame.Draw(face, new Bgr(Color.Red), 2);
}
captureImageBox.Image = currentFrame.Bitmap;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public bool DetectFaces(IInputArray image, List<Rectangle> listfaces)
{
bool isDetect = false;
try
{
using (UMat grayImage = new UMat())
{
CvInvoke.CvtColor(image, grayImage, ColorConversion.Bgr2Gray);
CvInvoke.EqualizeHist(grayImage, grayImage);
Rectangle[] facesDetected = faceCascadeClass.DetectMultiScale(grayImage, 1.1, 3, new Size(20, 20));
if (facesDetected.Length == 0)
{
isDetect = false;
}
else
{
isDetect = true;
listfaces.AddRange(facesDetected);
}
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Erro" ex.Message);
}
return isDetect;
}
```````````````````
Комментарии:
1. Как вы оцениваете тот факт, что вы так сильно отстаете? Я не вижу счетчика кадров. Вы работаете в режиме отладки или выпуска? Вы компилируете для x64, x86 или ANY_CPU? Я бы предложил x64, если у вас 64-разрядная ОС. Я бы поставил несколько секундомеров в стратегическом месте, чтобы получить некоторые фактические измерения времени, сколько времени занимает процесс. Я бы, конечно, отправлял какой-то оператор трассировки в файл журнала или консоль каждый раз, когда вызывается обработчик событий.
2. Достаточно ли у вас памяти, процессора и графического процессора, поскольку я вижу, что вы используете UMat. Нам нужна дополнительная информация, прежде чем кто-либо сможет вмешаться и помочь.
3. Спасибо за ответы. Я смотрю на видео в реальном времени, которое я показываю в приложении, и вот как я могу сказать, что оно медленное… Также, как вы предположили, это может быть и в том случае, когда я запускаю сборку debug / any_cpu. Я запущу его в сборке release / 64, чтобы увидеть, есть ли какая-либо разница. У меня довольно хороший ноутбук, 16 ГБ оперативной памяти.Графический процессор Nvidia K1100M.