C # Camera Capture с использованием только библиотеки по умолчанию - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь разработать приложение для устройства Win 10, которое будет работать на устройстве с заводскими настройками (с использованием windows 10 build 15063). Это приложение должно иметь доступ к оборудованию (поэтому я не могу использовать UWP, потому что UWP работает в режиме «песочницы»), а также иметь возможность делать снимки, используя все камеры, которые есть на устройстве (с помощью какого-либо средства выбора камеры). Моя главная проблема заключается в том, что мне разрешено использовать только встроенную библиотеку .NET для установки и запуска приложения, поэтому я не могу использовать сторонние фреймворки для упрощения захвата камеры (из соображений безопасности в приложении также должно содержаться целое приложение). один .exe файл) и Windows.media.capture работает только в UWP, что для меня бесполезно.

Кто-нибудь может знать, какую библиотеку по умолчанию я могу использовать для создания достаточно простого приложения, чтобы иметь возможность захвата камеры?

1 Ответ

0 голосов
/ 06 июля 2018

Вы можете использовать WIN32API для достижения того, что ищете, но это немного сложно.

Взгляните на capCreateCaptureWindowW из библиотеки avicap32.dll.

Попробуйте адаптировать этот код в соответствии с вашими потребностями ( в нем могут быть ошибки, но это хорошее начало. )

public class Camera
{
 [DllImport("kernel32.dll")]
 private static extern void Sleep(int dwMilliseconds);

 [DllImport("kernel32.dll")]
 private static extern int Beep(int dwFreq, int dwDuration);

 [DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowW")]
 private static extern int capCreateCaptureWindow(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, int hWndParent
 private const int WS_VISIBLE = 0x10000000;
 private const int WS_CHILD = 0x40000000;

 [DllImport("user32.dll", EntryPoint = "SendMessageW")]
 private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);

 [DllImport("user32.dll", EntryPoint = "SendMessageW")]
 private static extern int SendMessageFL(int hwnd, int wMsg, int wParam, string lParam);

 [DllImport("user32.dll", EntryPoint = "SendMessageW")]
 private static extern int SendMessageSD(int hwnd, int wMsg, string wParam, int lParam);

 private const int WM_USER = 0x400;
 private const int WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10);
 private const int WM_CAP_START = WM_USER;
 private const int WM_CAP_FILE_SAVEDIBA = (WM_CAP_START + 25);
 private const int WM_CAP_SET_SCALE = WM_USER + 53;
 private const int WM_CAP_SET_PREVIEW = WM_USER + 50;
 private const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;
 private const int WM_CAP_FILE_SAVEDIB = WM_USER + 25;
 private const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;

 private string _camtitle;   // a pointer to HDCAM
 private int hWebcam;
 private const int nDevice = 0;
 private const int nFPS = 50;
 private string _filename;   // image.bmp filename



 public int getCAM(string cam_title, int cam_x, int cam_y, int cam_width, int cam_height, IntPtr HWNDparent, int cam_ID)
 {
     _camtitle = cam_title;
     hWebcam = capCreateCaptureWindow(cam_title, WS_VISIBLE + WS_CHILD, cam_x, cam_y, cam_width, cam_height, HWNDparent.ToInt32(), cam_ID);
     return hWebcam;
 }

 public string NewFileNAME()
 {
     DateTime DT = new DateTime();
     DT.Date.ToString();
     return "file-" + DT.Date.ToString();

 }
 public void startCAM()
 {
     SendMessage(hWebcam, WM_CAP_DRIVER_CONNECT, nDevice, 0);
     SendMessage(hWebcam, WM_CAP_SET_SCALE, 1, 0);
     SendMessage(hWebcam, WM_CAP_SET_PREVIEWRATE, nFPS, 0);
     SendMessage(hWebcam, WM_CAP_SET_PREVIEW, 1, 0);
 }

 public void captureCAM(string BMPfilename)
 {
     _filename = BMPfilename;
     SendMessageFL(hWebcam, WM_CAP_FILE_SAVEDIBA, 0, _filename);
 }

 public void stopCAM()
 {
     SendMessageSD(hWebcam, WM_CAP_DRIVER_DISCONNECT, _camtitle, 0);
 }
}

Или вы можете использовать Windows 10 API и вызывать их из приложения Windows Form / WPF. Я верю, что ссылка поможет вам

Обновление (Полезные ссылки)

Веб-камера, многопоточность и VFW

Фрагменты кода - захват изображения с веб-камеры в C #

Как создать захват веб-камеры (VB .NET)

Захват с веб-камеры в CSharp

...