Avatar billede thomaxz Nybegynder
09. februar 2008 - 14:15 Der er 12 kommentarer og
1 løsning

Gemme billede fra snapshot, samtid med visning af stream.

Jeg har søgt nette igennem og fundet forskellige løsninger for at streame vidoe fra webcam, det jeg er vil er også at tage et billede fra webcammet, jeg har bla. fundet flg.

http://channel9.msdn.com/ShowPost.aspx?PostID=95921

hvor der et svar, og det virke sådan da også, for når det tager et billeder hakker vidoeprevien helt vildt, og når jeg prøver at flytter gem funktion over i en tråd, for jeg intet data fra clipboardet.

så havde jeg fundet denne
http://www.codeproject.com/KB/audio-video/motion_detection_wc.aspx

og den kildekode og demo der følger med virker fint, men kan simpelthent ikke finde ud af hvor den gemmer billedet.

det jeg prøver er at vise en stream og så ved et interval f.esk hver 3 sekund, skal den gemme billedet til en fil.
Avatar billede nielle Nybegynder
09. februar 2008 - 18:43 #1
Hvad mener du?

Hvor den gemmer billedet på diskene?

... eller hvor den gemmer billedet i koden?


Og er det CatchIt eller CatchItV du hentyder til i det sidste link? Det eneste sted hvor jeg har fundet at der saves noget i CatchItV-koden er hvor at der hvor at  han simpelthen gemmer det image der er i formen:

pictureBox.Image.Save( sd.FileName, ImageFormat.Bmp );

Desuden bliver der genmt nogle temporære filer a og b. De bliver gemt i metiden OnCaptureDone() i biblioteket:

b.Save(Application.StartupPath+"\\Wanted\\first"+saveTime,System.Drawing.Imaging.ImageFormat.Jpeg);
a.Save(Application.StartupPath+"\\Wanted\\second"+saveTime,System.Drawing.Imaging.ImageFormat.Jpeg);

dvs. som first<tidstempel> og second<tidstempel> - hvor <tidstempel> er:

saveTime=count+"-"+percent+"-"+System.DateTime.Now.Millisecond.ToString()+".jpg";
Avatar billede thomaxz Nybegynder
09. februar 2008 - 20:33 #2
jeg bruger CatchItV, jeg har også fundet b.save, men kan ikke lige finde ud af hvor b kommer fra og hvor billeder bliver propet over i b.
Avatar billede nielle Nybegynder
10. februar 2008 - 08:11 #3
'b' får en værdi i OnCaptureDone() - i disse linjer:

    GCHandle handle = GCHandle.Alloc( savedArray, GCHandleType.Pinned );
    int scan0 = (int) handle.AddrOfPinnedObject();
    scan0 += (h - 1) * stride;
    Bitmap b = new Bitmap( w, h, -stride, PixelFormat.Format24bppRgb, (IntPtr) scan0 );
    handle.Free();

Værdien hentes fra hukommelsen - nemlig der hvor 'scan0' peger hen. 'scan0' sættes til at pege på 'savedArray' lidt længere oppe i samme kodeblok.

Dette array initialiseres (der allokeres plads) i toolBar_ButtonClick():

    savedArray = new byte[ size + 64000 ];

og det nulsilles igen i OnCaptureDone():

    savedArray=null;

Der lægges indhold i det i ISampleGrabberCB.BufferCB():

    if( (pBuffer != IntPtr.Zero) && (BufferLen > 1000) && (BufferLen <= savedArray.Length) )
        Marshal.Copy( pBuffer, savedArray, 0, BufferLen );
    else
        Trace.WriteLine( "    !!!GRAB! failed " );

Her kommer indholdet fra 'pBuffer' og det kopieres over i 'savedArray'.

Selve formen understøtter interfacet 'ISampleGrabberCB' og dette er defineret i DLL'en DShowNET.dll der følger med i projektet. Der følger ikke kildekode med for denne, men jeg gætter på at det er den han omtaler her:

1. There are two ways to talk to a web cam:
    a. Use DirectX's component called DirectShow (but unfortunately, DirectX doesn't provide DirectShow component for
          C#. NETMaster made an assembly to face this problem in his article DirectShow.NET). //Elgitaro: check this.

ISampleGrabberCB.BufferCB() er et callback, dvs. at det er den software som styre selve webcam'et som kalder den. At dømme efter navnet kommer callback'et når at webcam'et har data parat.

Jeg kan ikke finde noget sted i koden hvor at BufferCB() rent faktisk bliver sat op som et callback - det eneste der sker er at formen bliver erklæret til at implementere interfacet 'ISampleGrabberCB' så det er måske nok?
Avatar billede thomaxz Nybegynder
10. februar 2008 - 21:29 #4
Det ser sådan, ud har sat et break point på

Marshal.Copy( pBuffer, savedArray, 0, BufferLen );

i int ISampleGrabberCB.BufferCB( double SampleTime, IntPtr pBuffer, int BufferLen )

og der kommer den til, men af en elelr ande grun kommer den aldrig til this.BeginInvoke( new CaptureDone( this.OnCaptureDone ) ); og defor udføre en aldrig oncaptureond,e som gemmer bileldet.
Avatar billede nielle Nybegynder
10. februar 2008 - 22:32 #5
Virker CatchItV koden da ellers?
Avatar billede thomaxz Nybegynder
11. februar 2008 - 13:38 #6
Ja, når jeg køre koden som er i catchiv så virker det fint.
Avatar billede nielle Nybegynder
11. februar 2008 - 20:25 #7
Det lyder underligt...

Det er jo også i OnCaptureDone() at billedet bliver lagt ind i pictureBox1.Image - så hvis den aldrig kommer dertil, bliver det jo ikke vist i formen.
Avatar billede nielle Nybegynder
18. februar 2008 - 17:56 #8
Kommet vidre med denne her?
Avatar billede esj123 Nybegynder
26. februar 2008 - 14:07 #9
Jeg har prøvet at kompile det samme program men får fejl i using DShowNET;
hvordan installere jeg directshow?
Avatar billede nielle Nybegynder
26. februar 2008 - 17:25 #10
Hvilken fejl?

Måske mangler du bare at oprette en reference til DLL-filen under referencer.
Avatar billede nielle Nybegynder
03. marts 2008 - 17:37 #11
thomaxz, hvad med noget respons?
Avatar billede thomaxz Nybegynder
28. marts 2008 - 16:55 #12
Nej er ikke kommet vidre, det projekte jeg skulle bruge det til er sat., lidt på standby.
Avatar billede thomaxz Nybegynder
13. september 2009 - 18:41 #13
Lukker snart, så læg svar, hvis du vil have point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester