Подтвердить что ты не робот

Использование веб-камеры в С#

Я делаю программу на С# для подключения к веб-камере и выполняю некоторые манипуляции с ней. У меня есть рабочее приложение, которое использует 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);

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

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

4b9b3361

Ответ 1

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

Мы решили использовать библиотеку 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 не установит).

Ответ 2

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Счастливое кодирование!