Delphi 为什么网络摄像头的图像比它';是从另一个应用程序开始的吗?

Delphi 为什么网络摄像头的图像比它';是从另一个应用程序开始的吗?,delphi,webcam,Delphi,Webcam,我正在使用Windows API使用附带的网络摄像头拍照 除了拍摄的照片很暗外,所有作品都很好。如果我在另一个应用程序中启动网络摄像头,然后用我的应用程序进行捕获,一切正常。我做错了什么 以下是我使用的代码: procedure TWebCam.Execute; //different thread var hand: THandle; fname: AnsiString; const WM_CAP_START = $0400; WM_CAP_DRIVER_CONNECT = $

我正在使用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;
过程TWebCam.Execute//不同的线程
变量
手:桑德尔;
fname:AnsiString;
常数
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\U CAP\U SET\U PREVIEWRATE=WM\U CAP\U START+52;
WM_CAP_SET_SCALE=WM_CAP_START+53;
开始
FreeOnTerminate:=真;
fname:=AnsiString(包括RailingPathDelimiter(提取文件路径(ParamStr(0)))+
“capture.bmp”);
如果文件存在(字符串(fname)),则删除文件(字符串(fname));
hand:=capCreateCaptureWindowA('CapWindow32',WS_子项和WS_可见,0,0,
0,0,frmMain.Handle,0);
如果手是0,那么
开始
如果发送消息(手动,WM\U CAP\U驱动程序\U CONNECT,0,0)0,则
开始
发送消息(手动,WM\U CAP\U SET\U PREVIEWRATE,66,0)//尝试了一些不需要但没有成功的东西
SendMessage(手动,WM\U CAP\U SET\U预览,1,0);
睡眠(5000);
发送消息(手动,WM\U CAP\U GRAP\U帧,0,0);
SendMessage(hand,WM_CAP_SAVEDIB,0,NativeInt(PAnsichar,fname));
SendMessage(手动,WM\U CAP\U驱动器\U断开,0,0);
SendMessage(hand,$0010,0,0);
SendMessage(frmMain.Handle,WM_USER+24,0,0)//通知主线程
结束
其他的
开始
SendMessage(hand,$0010,0,0);
同步(NoWebcam);
结束;
结束
其他的
同步(NoWebcam);
结束;

我不想给自己的问题一个答案,但也许将来有人会发现它很有用

问题是,当网络摄像头启动时,它会逐渐调整亮度,所以你必须先捕获一些虚拟帧,以获得正常的图片。。。以下是我现在使用的:

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

像一个迷人的作品,有点黑客,我希望一个WaitForInputIdle功能存在的设备太

我认为在“WM_CAP_DRIVER_CONNECT”之后,您需要发送另一条消息,使网络摄像头的LED发光(:@DorinDuminica最终sa dea drumu la bec:)@AndreasRejbrand det var ett skämt。。。杜阿尔蒂德·克兰坎德·奥赫·萨卡斯蒂斯卡。。。安德瑞杰布兰德认为你只是为了一个简单的玩笑而对它投了低票。。。对不起,我不是故意粗鲁的。。。只是我不喜欢每次我发布的问题都被否决,我不知道原因。。。我的道歉可能会有所帮助。