Как я могу обнаружить лица на тепловизионных изображениях FLIR --- OpenCv HaarCascade --frontalface_alt2 не работает - PullRequest
0 голосов
/ 20 марта 2020

Мне нужно определить лица на тепловизионных изображениях FLIR. Пробовали с YOLOv3 Dee pNet для обнаружения объекта на тепловых изображениях.

Это было хорошо при обнаружении, но скорость была слишком низкой. Если он использует процессор, это занимает около 1,5 секунд на изображение. Размер обрабатываемого изображения составляет 640 * 480, 320 * 240. Это не зависит от размера изображения. Но мне нужна производительность в реальном времени около 30 ~ 60 мс на изображение.

Поэтому я попробовал использовать детектор лица OpenCV Haarcascade с haarcascade_frontalface_alt2. xml. Но его производительность была слишком плохой, так что он почти не может обнаружить лица на инфракрасных изображениях, но может успешно работать, когда человек носит стекло.

Вот его код.

Mat img = new Mat(@"D:\Thermal\001.png", LoadImageType.Color);
//_capture.Retrieve(img);
Image<Bgr, byte> bgrImage = img.ToImage<Bgr, byte>();
Image<Gray, byte> grayImage = img.ToImage<Gray, byte>();
byte[,,] pDataBgr = bgrImage.Data;
byte[,,] pDataGray = grayImage.Data;

for (int y = 0; y < grayImage.Height; y++)
{
    for (int x = 0; x < grayImage.Width; x++)
    {
        if (pDataGray[y, x, 0] < 100)
        { pDataBgr[y, x, 0] = 0; pDataBgr[y, x, 1] = 0; pDataBgr[y, x, 2] = 0; }
    }
}

Mat image = bgrImage.Mat;
string faceFileName = "haarcascade_frontalface_alt2.xml";
List<Rectangle> faces = new List<Rectangle>();
using (CascadeClassifier face = new CascadeClassifier(faceFileName))
{
    using (UMat ugray = new UMat())
    {
        CvInvoke.CvtColor(image, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);

        //normalizes brightness and increases contrast of the image
        CvInvoke.EqualizeHist(ugray, ugray);

        //Detect the faces  from the gray scale image and store the locations as rectangle
        //The first dimensional is the channel
        //The second dimension is the index of the rectangle in the specific channel
        Rectangle[] facesDetected = face.DetectMultiScale(
           ugray,
           1.2,
           10,
           new Size(30, 30));

        faces.AddRange(facesDetected);
    }
}

Мой проект написанный с C#. Net Framework 4.0.

...