Hi,
ja es gibt hier in der Delphi-Praxis so einen schnellen Algorithmus der zwei Bilder auf Unterschide untersucht:
Delphi-Quellcode:
type
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray =
array [0..50000000]
of TRGBTriple;
function CompareImages(Image1,Image2:TBitmap):Int64;
var x,y:integer;
P1,P2:PRGBTripleArray;
summe1,summe2:integer;
begin
result := 0;
summe1 := 0;
summe2 := 0;
for y := 0
to Image1.Height -1
do
begin
P1 := Image1.ScanLine[y];
P2 := Image2.ScanLine[y];
if not CompareMem(p1,p2,Image1.Width*SizeOf(TRGBTriple))
then
begin
for x := 0
to Image1.Width-1
do
begin
inc(summe1,
RGB(P1[x].rgbtRed,P1[x].rgbtGreen,P1[x].rgbtBlue));
inc(summe2,
RGB(P2[x].rgbtRed,P2[x].rgbtGreen,P2[x].rgbtBlue));
if summe1 <> summe2
then
begin
summe1 := 0;
summe2 := 0;
inc(result);
end;
end;
end;
end;
Application.ProcessMessages;
end;
Aufruf könnte so sein:
ShowMessage(IntToStr(CompareImages(Image1.Picture.Bitmap,Image2.Picture.Bitmap)));
Du musst dann halt das Webcambild abspeichern und in einem Image laden was aber auch ganz einfach geht:
Delphi-Quellcode:
function SaveWebcamPictureDIB(pFileName: PChar;WebcamHandle: THandle):Boolean;
const WM_CAP_FILE_SAVEDIB = WM_USER + 25;
begin
if IsWindow(WebcamHandle) then
result := (SendMessage(WebcamHandle,WM_CAP_FILE_SAVEDIB,0,LPARAM(pFileName)) <> 0)
else
result := false;
end;
Afuruf könnte dann so sein:
SaveWebcamPictureDIB(PChar('C:\test.jpg'),VideoHandle);
Dann ist es wenigstens schonmal abgespeichert, jetzt kannst du es ja über:
Image1.Picture.LoadFormFile('C:\test.jpg');
einfach laden und vergleichen!
Alles klar?
Der Code mit dem Speichern funktioniert nur wenn du das mit dem Webcam Stream über die Variante hier in der Codelib gemacht hast!
MFG Lars Wiltfang