Вопрос

Я делаю программу на 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);

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

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

Это было полезно?

Решение

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

Мы решили использовать библиотеку 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: \). программные файлы (x86) \ OpenCV` " из правильного каталога, иначе opencvdotnet не будет установлен).

Другие советы

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

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

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

Посмотрите на эту статью: http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

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

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

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

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

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

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

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

scroll top