Пытаюсь сделать распознавание с помощью библиотеки Emgu. Добавил все opencv.dll в проект, с указанием скопировать в проект Добавил ссылки на emgu. Судя по тому, что с использованием Emgu нет проблем, то дело в .dll opencv Что я упускаю?
Visual studio 2017. Версия Emgu: emgucv-windesktop 3.2.0.2682-сuda
1 ответ 1
Используй CascadeClassifier вместо HaarCascade и VideoCapture вместо Capture .
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# emgucv или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.13.35763
Обнаружение лиц при помощи Emgu CV
Автор: admin от 26-03-2012, 06:37, посмотрело: 4052
Вступление
Недавно я опубликовал пост , в комментариях которого разместили результат обнаружения лиц на смартфоне. Данное ПО некорректно проанализировало изображение, не обнаружило одного человека (см. рисунок ниже). Я решил исследовать данную тему, действительно ли алгоритмы ошибаются при поиске лиц людей разных рас в нормальных условиях освещенности.
В рамках данной статьи решил использовать Emgu CV , как вариант OpenCV на .NET. Изображение для анализа я нашел на TinEye . В заключении будет продемонстрирован результаты работы приложения на Emgu CV и других сервисов по обнаружению лиц.
Пишем приложение
Для начала необходимо загрузить Emgu CV, например отсюда . Я выбрал версию 2.3.0 вод Windows. В OpenCV алгоритм поиска лиц базируется на методе Viola Jones. В основе лежит классификатор, который базируется на каскаде признаков. При правильной тренировке каскада, метод может давать хорошие результаты, но обучается очень долго. Более подробно теория данного метода описана на Хабре здесь . OpenCV идет уже вместе с обученным классификатором для поиска лиц, поэтому «минус» проблема.
Далее необходимо создать новый проект C# и подключить требуемые сборки Emgu CV
Теперь указываем нужные пространства имен
Создайте обработчик событий (например, нажатие на кнопку) и вставьте туда код
HaarCascade haarCascade = new HaarCascade("haarcascade_frontalface_alt.xml");
Image image = new Image("test.jpg");
Image grayImage = image.Convert();
var detectedFaces = grayImage.DetectHaarCascade(haarCascade)[0];
foreach (var face in detectedFaces)
image.Draw(face.rect, new Bgr(0, 0, 255), 1);
Здесь все просто. Из xml-файла загружается натренированный каскад. Исходный файл test.jpg после загрузки преобразуется в изображение с градациями серого. Метод DetectHaarCascade определяет на изображении лица. Далее красным прямоугольником отмечаются области на изображении, где расположены лица. Выходной файл имеет название result.jpg.
Заключение
Наше приложение формирует такой результат
Результаты работы сторонних сервисов
Для фотоаппарата Canon пришлось делать несколько снимков, т.к. ограничение на количество лиц
Как видно, первый и третий проекты дают схожий результат. Это говорит о том, что codejungle использует OpenCV (кстати, это написано на сайте). Проекты, основанные на OpenCV не обнаружили лицо человека в верхнем ряду справа, вероятнее из-за наклона головы. Фотоаппарат Canon обнаружил все лица, но группами (из-за ограничения). Наиболее лучшие показатели продемонстрировал проект betaface , найдены все лица, определены наклоны головы, также определяет многие другие параметры.
Современные алгоритмы обнаруживают лицо в большинстве случаев без проблем. Все проекты обнаружили то лицо, что не обнаружил смартфон. Это, скорее всего была случайность, что смартфон не обнаружил лицо, нежели индивидуальность объекта. С Emgu CV можно легко внедрить детектор лиц в свое приложение на платформе .NET.
После своей последней статьи про использование библиотеки Emgu CV я решил слегка усложнить задачу. Я решил не просто выводить видео с веб камеры, а заставить программу распознавать человеческие лица. Данный пример не является научным пособием и он не очень сильно оптимизирован, это всего-навсего простой пример. С ним можно поиграться (если вас зацепило), что я вам советую.
В данной статье будет использоваться метод Виолы-Джонса. Советую почитать статью — лучшее что я видел.
Подготовка
Итак, запускаем Visual Studio, создаем новый проект Windows Forms. Я назву свой FaceDetection. Далее нужно добавить нужные библиотеки: нажимаем правой кнопкой мыши в Обозревателе решений на Ссылки -> Добавить ссылку, выбираем вкладку Обзор. Идем по адресу «ваша_папка_с_EmguCV/bin», выделяем файлы «Emgu.CV.dll», «Emgu.CV.UI.dll», «Emgu.CV.Util.dll».
Настройка формы
Берем инструмент ImageBox, кидаем его на форму и растягиваем, форма элемента — желательно квадратная, добавляем одну кнопку.
Сам код
Ссылка на файлы к коду (закинуть в папочку Debug).Пожалуй, в комментариях все расписано, больше объяснять не буду.
Алгоритм работает, на этом все.
8 комментариев
Автор, где ты взял компонент imagebox? Есть picturebox, но код не срабатывает если написать так:
pictureBox1.Image = image;
Image img = new Image(image.ToBitmap());
pictureBox1.Image = img.ToBitmap();
[. ] детекции лица: link (сайт странный, открывать со включенным антивирусом) [. ]
у меня ругается на Capture myCapture = new Capture();
Ругается на создание экземпляра класса HaarCascade. Пишет, что такой класс не найден.
Вопрос к автору статьи: Какую версию Emgu вы используете. Просто в версии 3.4.3 класса Capture не существует. Так же невозможно использовать метод QueryFrame() класса Capture для присвоения экземпляру класса Image. А еще нет метода DetectHaarCascade() для класса Image.
Привет всем. Ну что тут скажешь, очередной недоделаный код. У вас вечно будет, как ненормальный рости память, пока не произойдет переполнение.. И так по новой. Дурость. В новой Емгу 4.. пишеться не Capture Capture, а V >
Есть много методов написать иначе.. Как пример:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Emgu.CV;
namespace // название проекта!
<
public partial class Form1 : Form // созданой формы
<
public Form1()
<
InitializeComponent();
/* Памятка для ленивых.
///
/// Auto detect
///
Any = 0,
///
/// Video For Windows (obsolete, removed)
///
Vfw = 200,
///
/// V4L/V4L2 capturing support
///
V4L = 200,
///
/// Same as CAP_V4L
///
V4L2 = V4L,
///
/// IEEE 1394 drivers
///
Firewire = 300,
///
/// IEEE 1394 drivers
///
IEEE1394 = Firewire,
///
/// IEEE 1394 drivers
///
DC1394 = Firewire,
///
/// IEEE 1394 drivers
///
CMU1394 = Firewire,
///
/// QuickTime (obsolete, removed)
///
QT = 500,
///
/// Unicap drivers (obsolete, removed)
///
Unicap = 600,
///
/// DirectShow (via videoInput)
///
DShow = 700,
///
/// PvAPI, Prosilica GigE SDK
///
Pvapi = 800,
///
/// OpenNI (for Kinect)
///
OpenNI = 900,
///
/// OpenNI (for Asus Xtion)
///
OpenNIAsus = 910,
///
/// XIMEA Camera API
///
XiApi = 1100,
///
/// AVFoundation framework for iOS (OS X Lion will have the same API)
///
AVFoundation = 1200,
///
/// Smartek Giganetix GigEVisionSDK
///
Giganetix = 1300,
///
/// Microsoft Media Foundation (via videoInput)
///
Msmf = 1400,
///
/// Microsoft Windows Runtime using Media Foundation
///
Winrt = 1410,
///
/// Intel Perceptual Computing SDK
///
IntelPerc = 1500,
///
/// OpenNI2 (for Kinect)
///
Openni2 = 1600,
///
/// OpenNI2 (for Asus Xtion and Occipital Structure sensors)
///
Openni2Asus = 1610,
///
/// gPhoto2 connection
///
Gphoto2 = 1700,
///
/// GStreamer
///
Gstreamer = 1800,
///
/// Open and record video file or stream using the FFMPEG library
///
Ffmpeg = 1900,
///
/// OpenCV Image Sequence (e.g. img_%02d.jpg)
///
Images = 2000,
///
/// Aravis SDK
///
Aravis = 2100,
///
/// Built-in OpenCV MotionJPEG codec
///
OopencvMjpeg = 2200,
///
/// Intel MediaSDK
///
IntelMfx = 2300,
///
/// XINE engine (Linux)
///
Xine = 2400,
Capture Capture1 = new Capture(700);//камера usb
Mat a = new Mat();
private void programma(object sender, EventArgs e)
<
PictureBox qw= new PictureBox();
Camera(qw, e);
pictureBox1.Image = qw.Image;
private void Camera( PictureBox qwe, EventArgs e)
<
var fibNumbers = new List < 200 >;
foreach (int element in fibNumbers)
<
// к форме подкидываем таймер! timer1 в его свойствах ставим «события Elapsed» Enable :True, и привязываем в событиях Tick:programma
// запускаем проект и о чуда и камера фурычит и Мат создается и в оперативке 62 мб. И оно не растет!! Странно!!
так как работает в отдельном потоке поглащая процессоры равномерно.. А вот как по ссылкев этом коде смотреть iptv и как вызвать исключения. Это будет для вас домашним заданием..