我正在使用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;
最佳答案
我不想给自己的问题一个答案,但也许将来有人会觉得有用。
问题是网络摄像头在启动时会逐渐调整其亮度,因此您必须首先捕获一些虚拟帧才能获得正常的图片...这是我现在使用的:
var
i : Integer;
...
begin
...
for i := 0 to 24 do
begin
SendMessage(hand, WM_CAP_GRAB_FRAME, 0, 0);
Sleep(200)
end;
...
end;
就像魅力一样,有点怪异,我希望设备也可以使用WaitForInputIdle函数...
关于delphi - 为什么网络摄像头图像看上去比从其他应用程序启动时更暗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9297766/