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

Я использую Windows API, чтобы сделать снимок с подключенной веб-камерой.

Все работает нормально, за исключением того, что изображение очень темное. Если я запускаю веб-камеру в другом приложении, а затем делаю снимок своим приложением, все работает нормально. Что я делаю неправильно?

Вот код, который я использую:

procedure TWebCam.Execute; //different thread
var
  hand: THandle;
  fname: AnsiString;
const
  WM_CAP_START = $0400;
  WM_CAP_DRIVER_CONNECT = $0400 + 10;
  WM_CAP_DRIVER_DISCONNECT = $0400 + 11;
  WM_CAP_SAVEDIB = $0400 + 25;
  WM_CAP_GRAB_FRAME = $0400 + 60;
  WM_CAP_STOP = $0400 + 68;
  WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
  WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
  WM_CAP_SET_SCALE = WM_CAP_START + 53;
begin
  FreeOnTerminate := True;
  fname := AnsiString(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) +
    'capture.bmp');
  if FileExists(String(fname)) then DeleteFile(string(fname));
  hand := capCreateCaptureWindowA('CapWindow32', WS_CHILD and WS_VISIBLE, 0, 0,
    0, 0, frmMain.Handle, 0);
  if hand <> 0 then
  begin
    if SendMessage(hand, WM_CAP_DRIVER_CONNECT, 0, 0) <> 0 then
    begin
      SendMessage(hand,WM_CAP_SET_PREVIEWRATE,66,0); //tried some stuff that are not required but without any success
      SendMessage(hand, WM_CAP_SET_PREVIEW, 1, 0);
      Sleep(5000);
      SendMessage(hand, WM_CAP_GRAB_FRAME, 0, 0);
      SendMessage(hand, WM_CAP_SAVEDIB, 0, NativeInt(PAnsichar(fname)));
      SendMessage(hand, WM_CAP_DRIVER_DISCONNECT, 0, 0);
      SendMessage(hand, $0010, 0, 0);
      SendMessage(frmMain.Handle,WM_USER + 24,0,0); //notify main thread
    end
    else
    begin
      SendMessage(hand, $0010, 0, 0);
      Synchronize(NoWebcam);
    end;
  end
  else
    Synchronize(NoWebcam);
end;

person opc0de    schedule 15.02.2012    source источник
comment
Я думаю, что после WM_CAP_DRIVER_CONNECT вам нужно отправить еще одно сообщение, которое заставит светиться светодиод веб-камеры (:   -  person    schedule 15.02.2012
comment
@DorinDuminica в конечном итоге са деа барабану ла бек :))   -  person opc0de    schedule 15.02.2012
comment
@AndreasRejbrand det var ett skämt ... du är alltid kränkande och sarkastiska ... har du vänner?   -  person opc0de    schedule 15.02.2012
comment
@AndreasRejbrand думал, что вы проголосовали за него просто из-за простой шутки ... извините, я не хотел быть грубым ... просто мне не нравится, что каждый раз, когда я публикую вопрос, проголосовали против, и я даже не знаю причину ... мои извинения   -  person opc0de    schedule 15.02.2012
comment
Возможно, это может помочь.   -  person kobik    schedule 15.02.2012
comment
Также может быть способ изменить уровень предусилителя ISO/Exposure/CCD из API.   -  person Warren P    schedule 16.02.2012


Ответы (1)


Я ненавижу давать ответы на свои вопросы, но, возможно, кому-то это будет полезно в будущем.

Дело в том, что веб-камера прогрессивно регулирует яркость при запуске, поэтому для получения нормальной картинки нужно сначала сделать несколько фиктивных кадров... Вот что я сейчас использую:

var
 i : Integer;
...
begin
...
   for i := 0 to 24 do
   begin
     SendMessage(hand, WM_CAP_GRAB_FRAME, 0, 0);
     Sleep(200)
   end;
...
end;

Работает как шарм, немного хакерский, я бы хотел, чтобы функция WaitForInputIdle существовала и для устройств...

person opc0de    schedule 15.02.2012