Защо изображението на уеб камерата изглежда по-тъмно, отколкото когато е стартирано от друго приложение?

Използвам API на Windows, за да направя снимка с прикачената уеб камера.

Всичко работи добре, освен че заснетата снимка е много тъмна. Ако стартирам уеб камерата в друго приложение и след това снимам с моето приложение, всичко работи добре. какво правя грешно

Ето кода, който използвам:

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 евентуално sa dea drumu la bec :))   -  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-Preamp от 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