Использование веб-камеры в C # - PullRequest
22 голосов
/ 24 октября 2008

Я делаю программу на C # для подключения к веб-камере и выполнения некоторых манипуляций с ней. У меня есть рабочее приложение, которое использует win32 api (avicap32.dll) для подключения к веб-камере и отправки на нее сообщений, которые отправляют в буфер обмена. Проблема в том, что, несмотря на то, что доступ к нему можно получить из краски, чтение его из программы приводит к нулевым указателям.

Это код, который я использую для подключения веб-камеры:

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0);

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

И вот что я использую, чтобы скопировать изображение в буфер обмена:

SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);

SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);
tempObj = Clipboard.GetDataObject();
tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

Есть некоторая проверка ошибок, которую я удалил из кода, чтобы сделать ее короче.

Заранее спасибо:)

Ответы [ 6 ]

17 голосов
/ 24 октября 2008

Я недавно начал заниматься хобби в этой области.

Мы остановились на использовании библиотеки OpenCV с оболочкой opencvdotnet . Он поддерживает захват кадров с веб-камеры:

using (var cv = new OpenCVDotNet.CVCapture(0))
{
    var image = cv.CreateCompatibleImage();
    // ...
    cv.Release();
}

А если вы выполняете манипуляции с изображениями, алгоритмы обработки изображений OpenCV были включены в сборку OpenCVDotNet.Algs.

Если вы решили пойти по этому пути, обязательно установите OpenCV версии 1.0 (и установите его в «c: \ program files \ opencv», если вы используете 64-разрядную версию Vista, или «mklink OpenCV 'c: \ program files (x86) \ OpenCV` "из правильного каталога, иначе opencvdotnet не будет установлен).

6 голосов
/ 24 октября 2008

Существует два способа передачи данных камеры в ваше приложение: DirectShow и WIA. Microsoft рекомендует использовать WIA , а интерфейс для WIA довольно прост, чтобы обернуть ваш мозг вокруг. Я создал и опубликовал настольную библиотеку WIA с открытым исходным кодом , основанную на работе, которую я проделал некоторое время назад.

Теперь проблема с WIA в некоторых случаях в том, что это слишком просто. Например, если вы хотите настроить свойства камеры (например, частоту кадров, разрешение и т. Д.), То WIA падает. Microsoft устарела DirectShow, но они действительно не дали нам никакой замены, обладающей всеми ее возможностями, и я обнаружил, что она продолжает нормально работать на всех существующих платформах (она очень укоренилась, поэтому я не могу представить, что поддержка исчезнет) в ближайшее время).

Существует очень хорошая библиотека DirectShow на SourceForge . Единственная «проблема» с ним в том, что он действительно сложный, и это связано с тем фактом, что DShow так чертовски сложен и запутан с самого начала. Существует множество вещей, которые может сделать обертка, которые нелегко реализовать, но они предоставляют примеры для многих распространенных случаев, таких как показ видео или захват кадра. Если вы хотите добавить наложения или вставить другие фильтры, он может это сделать, но имейте в виду, что это совсем не так просто.

2 голосов
/ 09 ноября 2010

Взгляните на эту статью: http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

Это намного проще, чем установка и использование OpenCVNetWrapper.

0 голосов
/ 26 июля 2012

Об этом также спрашивали в Как получить изображения с веб-камеры в C #? , и вам может пригодиться следующее (извините за спам, но это действительно помогает ответить на вопрос):

Я только что выпустил полный исходный код моего приложения для Windows CamTimer (написанного на .NET / C #). Загрузите / просмотрите полный код (с работающими примерами веб-камеры) на https://github.com/johanssonrobotics/CamTimer

Удачного кодирования!

0 голосов
/ 15 февраля 2011

захват OpenCV, захват EMGU и все другие библиотеки захвата, которые я пробовал
у всех одна и та же проблема: вы не можете подняться выше 640x480 программно
(без открытия окна источника видео окна).

Я предлагаю использовать это (что работает):
https://github.com/ofTheo/videoInput

0 голосов
/ 24 октября 2008

Вы пробовали Clipboard.GetImage ()? Вы также можете попробовать различные методы Clipboard.Contains * (), чтобы узнать, в каком формате хранятся данные в буфере обмена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...