none
Comment indiquer la zone interne (client) d'une form ? RRS feed

Réponses

  • Bonjour Aurel, Jacques,

    J'ai opté pour une solution intermédiaire, j'affiche dans le bandeau la différence de proportion, qui, quand elle est à 0,0 est proportionnée (avec menu popUp l'expliquant en aide).

    *

    Pour Jacques :

    Est-ce que tu peux me faire un nettoyage de code, j'ai l'impression qu'il y a en trois fois de trop, mais je ne saurais ?

    Voici le fichier (zipé dans son dossier) :

    http://c.h.a.r.g.e.free.fr/WebCam.zip

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse Aurel Bera vendredi 8 février 2013 08:18
    mercredi 6 février 2013 22:07
  • Résumé des épisodes précédents : après avoir abandonné la piste Video For Windows (avicap32.dll), je suis parti sur ce projet qui capture la webcam directement sur la feuille (sizeable).

    A noter que sur la page, le livre ISBN: 0-7356-1821-6 y est recommandé. Je crains qu'il n'ai pas été traduit, mais tu peux toujours te renseigner auprès de Microsoft Press.

    Dans un premier temps, la seule modification que j'y ai apporté est de faire la capture dans une PictureBox afin de pouvoir placer d'autres contrôles sur la feuille (Boutons). Puis dans un second temps, j'ai ajouté la sauvegarde d'une image, un menu, et rendu la fenêtre non sizeable. Effectivement c'est un choix.

    Comme Aurel Bera, je pense que tu pourrai repartir sur deux fils :

    • Enregistrement Video
    • Comparaison d'image

    Je n'ai pas de réponses toutes faites. Le 1er point doit se trouver dans DirectShow, mais je ne sait pas s'il est intégré dans DirectShowLib-2005.dll qui permet d'interfacer DS à VB.Net.

    Pour le second point, la capture d'image est opérationnelle dans la dernière version que j'ai posté. Enregistrer des images à intervalle régulier via un timer tu dois savoir faire. Par contre comparer des images ... Sans aucun mouvements, un simple changement de luminosité produira une image différente. Si le but est de détecter un mouvement par exemple, ça risque de ne pas être simple.

    Pour terminer :

    MCC = Microsoft Commmunity Contributor (voir en bas de page)

    Je ne me suis inscrit à rien, ni postulé à quoi que ce soit. C'est attribué comme ça, pour 3 mois éventuellement renouvelable. On ne gagne rien.


    Cordialement, Jacques

    • Marqué comme réponse EhJoe vendredi 8 février 2013 21:03
    vendredi 8 février 2013 13:02
  • Bonsoir Jacques,

    Ok, je poserais les questions une à une.

    Pour l'enregistrement en film ce n'est pas possible, tu imagines la taille d'un film constitué de 30 images secondes au format bmp ? Ce que j'aimerais si c'est possible, c'est que ça filme réellement, si c'est possible, wmv, avis...

    Donc résolu, à bientôt et cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse EhJoe vendredi 8 février 2013 21:03
    vendredi 8 février 2013 21:03

Toutes les réponses

  • Bonjour EhJoe,

    Pas sûr de bien comprendre. S'il s'agit de définir la taille de zone cliente d'une fenêtre, les propriétés ClientSize.Width et ClientSize.Height étant en lecture seule, il faut récupérer la taille de la bordure et de la barre de titre :

        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            SetClientFormSize(400, 300)
        End Sub
    
        Private Sub SetClientFormSize(ByVal NewWidth As Integer, ByVal NewHeight As Integer)
            Dim BorderWidth As Integer
            Dim TitleHeight As Integer
    
            BorderWidth = (Me.Width - Me.ClientSize.Width) / 2
            TitleHeight = Me.Height - (Me.ClientSize.Height + (BorderWidth * 2))
            Me.Width = NewWidth + (BorderWidth * 2)
            Me.Height = NewHeight + TitleHeight + (BorderWidth * 2)
        End Sub
    
        Private Sub Form1_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
            MsgBox("ClientSize.Width : " & Me.ClientSize.Width & vbCrLf & _
                   "ClientSize.Height : " & Me.ClientSize.Height)
        End Sub

    dans ce sens cela se rapproche de ScaleWidth et ScaleHeight de VB6, mais pas vu de ScaleMode définissant l'unité de mesure.


    Cordialement, Jacques

    samedi 2 février 2013 08:40
  • Bonjour Jacques,

    Je n'arrive pas à faire ce que je voudrais, ni a bien utiliser ta fonction car le code d'origine le surcharge, voici le code, reprise de la discussion ensuite :

    '
    ' webCam form 1
    Option Explicit On
    Public Class Form1
    
    
      Enum PlayState
        Stopped
        Paused
        Running
        Init
      End Enum
    
    
      Dim CurrentState As PlayState = PlayState.Stopped
      Dim D As Integer = Convert.ToInt32("0X8000", 16)
      Public WM_GRAPHNOTIFY As Integer = D + 1
      Dim VideoWindow As DirectShowLib.IVideoWindow = Nothing
      Dim MediaControl As DirectShowLib.IMediaControl = Nothing
      Dim MediaEventEx As DirectShowLib.IMediaEventEx = Nothing
      Dim GraphBuilder As DirectShowLib.IGraphBuilder = Nothing
      Dim CaptureGraphBuilder As DirectShowLib.ICaptureGraphBuilder2 = Nothing
      Dim rot As DirectShowLib.DsROTEntry = Nothing
      Dim x As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
      Dim y As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
      Dim calcul_X As Double = x / y
      Dim calcul_Y As Double = y / x
      Private dernierpoint As Point
    
    
      Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim hr As Integer = 0
        Dim sourceFilter As DirectShowLib.IBaseFilter = Nothing
        Left = 100
        Top = Left
        '
        PictureBox2.Visible = False
        Call AuPremierPlanToolStripMenuItem_Click(sender, e)
        AuPremierPlanToolStripMenuItem.Checked = True
        ALarrièrePlanToolStripMenuItem.Checked = False
        '
        Try
          GetInterfaces()
          hr = CaptureGraphBuilder.SetFiltergraph(GraphBuilder) 'Specifies filter graph "graphbuilder" for the capture graph builder "captureGraphBuilder" to use.
          Debug.WriteLine("Attach the filter graph to the capture graph : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          SourceFilter = FindCaptureDevice()
          hr = GraphBuilder.AddFilter(SourceFilter, "Video Capture")
          Debug.WriteLine("Add capture filter to our graph : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          hr = CaptureGraphBuilder.RenderStream(DirectShowLib.PinCategory.Preview, DirectShowLib.MediaType.Video, SourceFilter, Nothing, Nothing)
          Debug.WriteLine("Render the preview pin on the video capture filter : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          Runtime.InteropServices.Marshal.ReleaseComObject(SourceFilter)
          SetupVideoWindow()
          rot = New DirectShowLib.DsROTEntry(GraphBuilder)
          hr = MediaControl.Run()
          Debug.WriteLine("Start previewing video data : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          CurrentState = PlayState.Running
          Debug.WriteLine("The currentstate : " & CurrentState.ToString)
        Catch ex As Exception
          MessageBox.Show("An unrecoverable error has occurred.With error : " & ex.ToString)
        End Try
      End Sub
    
    
      Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        Width = 400
        Call SetClientFormSize(Width, Width * calcul_Y)
      End Sub
    
    
      Sub SetClientFormSize(ByVal NewWidth As Integer, ByVal NewHeight As Integer) ' dimensions internes ' Jacques
        Dim BorderWidth As Integer
        Dim TitleHeight As Integer
        BorderWidth = (Me.Width - Me.ClientSize.Width) / 2
        TitleHeight = Me.Height - (Me.ClientSize.Height + (BorderWidth * 2))
        Me.Width = NewWidth + (BorderWidth * 2)
        Me.Height = NewHeight + TitleHeight + (BorderWidth * 2)
      End Sub
    
    
      Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
        Call ResizeVideoWindow()
      End Sub
    
    
      Sub ResizeVideoWindow() ' fonction d'origine
        PictureBox1.Width = Width - 20
        PictureBox1.Height = ClientSize.Height - 65
        If VideoWindow IsNot Nothing Then VideoWindow.SetWindowPosition(0, 0, PictureBox1.Width, PictureBox1.Height)
      End Sub
    
    
      Sub xCaptureVideo()
        Dim hr As Integer = 0
        Dim sourceFilter As DirectShowLib.IBaseFilter = Nothing
        Try
          GetInterfaces()
          hr = CaptureGraphBuilder.SetFiltergraph(GraphBuilder) 'Specifies filter graph "graphbuilder" for the capture graph builder "captureGraphBuilder" to use.
          Debug.WriteLine("Attach the filter graph to the capture graph : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          sourceFilter = FindCaptureDevice()
          hr = GraphBuilder.AddFilter(sourceFilter, "Video Capture")
          Debug.WriteLine("Add capture filter to our graph : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          hr = CaptureGraphBuilder.RenderStream(DirectShowLib.PinCategory.Preview, DirectShowLib.MediaType.Video, sourceFilter, Nothing, Nothing)
          Debug.WriteLine("Render the preview pin on the video capture filter : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          Runtime.InteropServices.Marshal.ReleaseComObject(sourceFilter)
          SetupVideoWindow()
          rot = New DirectShowLib.DsROTEntry(GraphBuilder)
          hr = MediaControl.Run()
          Debug.WriteLine("Start previewing video data : " & DirectShowLib.DsError.GetErrorText(hr))
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
          CurrentState = PlayState.Running
          Debug.WriteLine("The currentstate : " & CurrentState.ToString)
        Catch ex As Exception
          MessageBox.Show("An unrecoverable error has occurred.With error : " & ex.ToString)
        End Try
      End Sub
    
    
      Sub GetInterfaces()
        Dim hr As Integer = 0
        GraphBuilder = CType(New DirectShowLib.FilterGraph, DirectShowLib.IGraphBuilder)
        CaptureGraphBuilder = CType(New DirectShowLib.CaptureGraphBuilder2, DirectShowLib.ICaptureGraphBuilder2)
        MediaControl = CType(GraphBuilder, DirectShowLib.IMediaControl)
        VideoWindow = CType(GraphBuilder, DirectShowLib.IVideoWindow)
        MediaEventEx = CType(GraphBuilder, DirectShowLib.IMediaEventEx)
        hr = MediaEventEx.SetNotifyWindow(PictureBox1.Handle, WM_GRAPHNOTIFY, IntPtr.Zero) 'This method designates a window as the recipient of messages generated by or sent to the current DirectShow object
        DirectShowLib.DsError.ThrowExceptionForHR(hr) 'ThrowExceptionForHR is a wrapper for Marshal.ThrowExceptionForHR, but additionally provides descriptions for any DirectShow specific error messages.If the hr value is not a fatal error, no exception will be thrown:
        Debug.WriteLine("I started Sub Get interfaces , the result is : " & DirectShowLib.DsError.GetErrorText(hr))
      End Sub
    
    
      Function FindCaptureDevice() As DirectShowLib.IBaseFilter
        Debug.WriteLine("Start the Sub FindCaptureDevice")
        Dim hr As Integer = 0
        Dim classEnum As Runtime.InteropServices.ComTypes.IEnumMoniker = Nothing
        Dim moniker As Runtime.InteropServices.ComTypes.IMoniker() = New Runtime.InteropServices.ComTypes.IMoniker(0) {}
        Dim source As Object = Nothing
        Dim devEnum As DirectShowLib.ICreateDevEnum = CType(New DirectShowLib.CreateDevEnum, DirectShowLib.ICreateDevEnum)
        hr = devEnum.CreateClassEnumerator(DirectShowLib.FilterCategory.VideoInputDevice, classEnum, 0)
        Debug.WriteLine("Create an enumerator for the video capture devices : " & DirectShowLib.DsError.GetErrorText(hr))
        DirectShowLib.DsError.ThrowExceptionForHR(hr)
        Runtime.InteropServices.Marshal.ReleaseComObject(devEnum)
        If classEnum Is Nothing Then
          Throw New ApplicationException("No video capture device was detected.\r\n\r\n" & "This sample requires a video capture device, such as a USB WebCam,\r\n" & _
              "to be installed and working properly.  The sample will now close.")
        End If
        If classEnum.Next(moniker.Length, moniker, IntPtr.Zero) = 0 Then
          Dim iid As Guid = GetType(DirectShowLib.IBaseFilter).GUID
          moniker(0).BindToObject(Nothing, Nothing, iid, source)
        Else
          Throw New ApplicationException("Unable to access video capture device!")
        End If
        Runtime.InteropServices.Marshal.ReleaseComObject(moniker(0))
        Runtime.InteropServices.Marshal.ReleaseComObject(classEnum)
        Return CType(source, DirectShowLib.IBaseFilter)
      End Function
    
    
      Sub SetupVideoWindow()
        Dim hr As Integer = 0
        hr = VideoWindow.put_Owner(PictureBox1.Handle)
        DirectShowLib.DsError.ThrowExceptionForHR(hr)
        hr = VideoWindow.put_WindowStyle(DirectShowLib.WindowStyle.Child Or DirectShowLib.WindowStyle.ClipChildren)
        DirectShowLib.DsError.ThrowExceptionForHR(hr)
        ResizeVideoWindow()
        hr = VideoWindow.put_Visible(DirectShowLib.OABool.True)
        DirectShowLib.DsError.ThrowExceptionForHR(hr)
      End Sub
    
    
      Protected Overloads Sub WndProc(ByRef m As Message)
        Select Case m.Msg
          Case WM_GRAPHNOTIFY
            HandleGraphEvent()
        End Select
        If Not (VideoWindow Is Nothing) Then VideoWindow.NotifyOwnerMessage(m.HWnd, m.Msg, m.WParam.ToInt32, m.LParam.ToInt32)
        MyBase.WndProc(m)
      End Sub
    
    
      Sub HandleGraphEvent()
        Dim hr As Integer = 0
        Dim evCode As DirectShowLib.EventCode
        Dim evParam1 As Integer
        Dim evParam2 As Integer
        If MediaEventEx Is Nothing Then Return
        While MediaEventEx.GetEvent(evCode, evParam1, evParam2, 0) = 0
          hr = MediaEventEx.FreeEventParams(evCode, evParam1, evParam2)
          DirectShowLib.DsError.ThrowExceptionForHR(hr)
        End While
      End Sub
    
    
      Sub GrabImage()
        Try
          PictureBox2.Visible = True
          MediaControl.Pause()
          Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
          Using g As Graphics = Graphics.FromImage(bmp)
            Dim pt As Point = PictureBox1.PointToScreen(New Point(0, 0))
            g.CopyFromScreen(pt.X, pt.Y, 0, 0, bmp.Size)
          End Using
          PictureBox2.Image = bmp
          MediaControl.Run()
          PictureBox2.Visible = False
        Catch
        End Try
      End Sub
    
    
      Sub PhotographierToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PhotographierToolStripMenuItem.Click
        Dim sfdImage As New SaveFileDialog ' photographier
        GrabImage()
        sfdImage.DefaultExt = "bmp"
        sfdImage.Filter = "Fichiers image (*.bmp)|*.bmp | All files (*.*)|*.*"
        sfdImage.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
        If sfdImage.ShowDialog = DialogResult.OK Then PictureBox2.Image.Save(sfdImage.FileName, Imaging.ImageFormat.Bmp)
      End Sub
    
    
      Sub AuPremierPlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AuPremierPlanToolStripMenuItem.Click
        TopMost = True ' 1er plan
        AuPremierPlanToolStripMenuItem.Checked = True
        ALarrièrePlanToolStripMenuItem.Checked = False
      End Sub
    
    
      Sub ALarrièrePlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ALarrièrePlanToolStripMenuItem.Click
        TopMost = False ' arrière plan
        AuPremierPlanToolStripMenuItem.Checked = False
        ALarrièrePlanToolStripMenuItem.Checked = True
      End Sub
    
    
      Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        On Error Resume Next
        MediaControl.StopWhenReady()
        CurrentState = PlayState.Stopped
        MediaEventEx.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero)
        VideoWindow.put_Visible(DirectShowLib.OABool.False)
        VideoWindow.put_Owner(IntPtr.Zero)
        rot.Dispose()
        rot = Nothing
        Runtime.InteropServices.Marshal.ReleaseComObject(MediaControl) : MediaControl = Nothing
        Runtime.InteropServices.Marshal.ReleaseComObject(MediaEventEx) : MediaEventEx = Nothing
        Runtime.InteropServices.Marshal.ReleaseComObject(VideoWindow) : VideoWindow = Nothing
        Runtime.InteropServices.Marshal.ReleaseComObject(GraphBuilder) : GraphBuilder = Nothing
        Runtime.InteropServices.Marshal.ReleaseComObject(CaptureGraphBuilder) : CaptureGraphBuilder = Nothing
      End Sub
    
    
    End Class


    Suite, voici l'hyperlien du programme zipé en dossier, poursuite de la discussion après :

    http://mesromans.free.fr/jacques_webcam.zip

    Donc, ce que je voudrais c'est que quand on change la taille de form, les proportions dmeurent constantes (celles de la pictureBox évidemment), de façon à avoir au démarrage et à conserver la bonne proportion, pour ma part par exemple c'est un 16/9e, et toujours par exemple on peut tester ça en trançant un cercle sur la picturebox, et après, quelle que soit la taille de la form, le cercle doit rester rond...

    Je pensais qu'on pouvais directement adresser la zone client, a priori ce n'est pas le cas, car sinon on pourrait écrire un truc du genre picturebox1.clientZone.heignt = & * ratioXY.

    T>outefois ceci ne va pas trop non plus, car si on déplace par la hauteur, ça implique de mémoriser la hauteur et la largeur pour ensuite comparer laquelle on déplace, et si on le fait en diagonal je ne sais pas...

    La solution à tout ça serait une form sans bandeau, j'ai essayé, le seul problème est que je sais déplacer la form, mais je ne sais pas déplacer la form via la picture qui masque la form en fait, si tu sais faire ça, ça résoud le problème, ensuite je marcherais par menu popUp ?

    Sinon, si tu veux, tu peux faire du ménage, enlever tout ce qui est inutile, car pour ma part je suis presque arrivé à me limites de connaissance, je ne peux plus guère nettoyer ?

    ADDENDUM

    Ce code qui fonctionne sur une form recouverte ancrée d'une picturebox, mais ne fonctionne pas avec le code de la webCam ???

    Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then dernierpoint = New Point(e.X, e.Y)
      End Sub
    
    
      Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        If e.Button <> Windows.Forms.MouseButtons.Left Then Exit Sub
        Me.Left = Me.Left + (e.X - dernierpoint.X)
        Me.Top = Me.Top + (e.Y - dernierpoint.Y)
      End Sub

    As-tu une idée, pourquoi ça ne fonctionne pas ?

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire




    • Modifié EhJoe lundi 4 février 2013 09:21 addendum
    samedi 2 février 2013 09:32
  • Un petit truc pour commencer : Si Aurel Bera n'avais pas répondu à ton message, je n'aurai pas vu le tien.

    Tu as modifié ton message de samedi (02/02/13 à 9:35), je n'ai pas reçu d'alerte dans ma boite mail (liée à mon LiveID), et comme j'utilise Community NNTP Bridge pour voir les nouveaux messages (dans un lecteur de News), il n'apparait pas comme nouveau...

    Sur le problème, je me pose deux questions :

    • Pourquoi veux tu, même si tu as un écran 16/9, avoir ce même ratio pour la Webcam ?
    • Pourquoi autoriser une fenêtre 'Sizable' (même si c'est le cas dans le code exemple) ?

    Je me base sur ma configuration :

    Résolutions écran :
      1366 x 768 = 16/9 (par défaut)
       800 x 600 =  4/3

    Résolutions Toshiba Webcam Application 2.0.0.35 :

      160 x 120 = 4/3 (1.33)
      176 x 144 = 4/3 (1.22)
      320 x 240 = 4/3 (1.33)
      352 x 288 = 4/3 (1.22)
      640 x 480 = 4/3 (1.33)

    EhJoe VB.Net :

      400 x 225 = 16/9 (à l'ouverture de la feuille)

    N'as tu pas un écrasement de l'image ?

    Je dépose sur cjoint un petit projet : ClientSize , qui de manière similaire à l'application Toshiba ne permet que des résolutions prédéfinies. Cela simplifie les choses, d'autant plus si on a d'autres contrôles sur la feuille (MenuStrip, StatusStrip, ...)


    Cordialement, Jacques

    mardi 5 février 2013 09:37
  • Bonjour Aurel, Jacques,

    J'ai opté pour une solution intermédiaire, j'affiche dans le bandeau la différence de proportion, qui, quand elle est à 0,0 est proportionnée (avec menu popUp l'expliquant en aide).

    *

    Pour Jacques :

    Est-ce que tu peux me faire un nettoyage de code, j'ai l'impression qu'il y a en trois fois de trop, mais je ne saurais ?

    Voici le fichier (zipé dans son dossier) :

    http://c.h.a.r.g.e.free.fr/WebCam.zip

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse Aurel Bera vendredi 8 février 2013 08:18
    mercredi 6 février 2013 22:07
  • Deux possibilités :

    Je peux toutefois proposer ce projet WebcamDS

    ;-)


    Cordialement, Jacques

    jeudi 7 février 2013 10:13
  • Bonjour Jacques,

    Ah, je ne savais pas que c'était payant un petit nettoyage :o)

    C'est pas mal le mec qui sous-traitait en Chine, remarques, si dans son contrat ce n'était pas interdit, je ne sais pas si son employeur peut lui reprocher quelque chose...

    Au fait, tu es un MCC, c'est quoi un MCC ?

    Ce que tu me proposes ressemble fortement à l'exemple d'origine agrémenté de ton passage, n'est-ce point ça ?

    En tout cas, merci, mais c'est trop rigoureux, je préfère mon système, si tu l'as utilisé, car il ne nécessite pas de connaître sa définition au préalable, et puis j'aime bien une form sizable, ce que j'en ai fait me convient.

    Il y a tellement de code pour une fonction si primaire, que j'ai l'impression que celui qui a fait ça était certes bien meilleur que moi, mais qu'il a lui aussi pris du code un peu partout, et que si on enlevait 75% du code ça marcherait encore, la preuve, j'en ai déjà enlevé au moins 10% ; enfin, je poserai la question du nettoyage, tant pis...

    Donc affaire terminée, et merci encore.

    *

    Toutefois je voudrais de même ajouter deux fonctions, saurais-tu me montrer :

    - La première, enregistrer en filmant.

    - La seconde, ce serait de faire une fonction de survbeillance, par exemple toute les deux secondes on prend un image qui écrase l'ancienne ensuite, et donc on compare le deux image (s'il existe une fonction pour ça), et si elle sont différentes je lance une alarme visuelle et sonore (ça je sais faire).

    Ainsi les applications de la webcam seront totalement employées.

    Merci de m'indiquer si tu te sens d'attaque à m'indiquer comment procéder, ou si je repose la question sur ces deux points, un par un ?

    Au plaisir de te lire, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    vendredi 8 février 2013 08:31
  • Résumé des épisodes précédents : après avoir abandonné la piste Video For Windows (avicap32.dll), je suis parti sur ce projet qui capture la webcam directement sur la feuille (sizeable).

    A noter que sur la page, le livre ISBN: 0-7356-1821-6 y est recommandé. Je crains qu'il n'ai pas été traduit, mais tu peux toujours te renseigner auprès de Microsoft Press.

    Dans un premier temps, la seule modification que j'y ai apporté est de faire la capture dans une PictureBox afin de pouvoir placer d'autres contrôles sur la feuille (Boutons). Puis dans un second temps, j'ai ajouté la sauvegarde d'une image, un menu, et rendu la fenêtre non sizeable. Effectivement c'est un choix.

    Comme Aurel Bera, je pense que tu pourrai repartir sur deux fils :

    • Enregistrement Video
    • Comparaison d'image

    Je n'ai pas de réponses toutes faites. Le 1er point doit se trouver dans DirectShow, mais je ne sait pas s'il est intégré dans DirectShowLib-2005.dll qui permet d'interfacer DS à VB.Net.

    Pour le second point, la capture d'image est opérationnelle dans la dernière version que j'ai posté. Enregistrer des images à intervalle régulier via un timer tu dois savoir faire. Par contre comparer des images ... Sans aucun mouvements, un simple changement de luminosité produira une image différente. Si le but est de détecter un mouvement par exemple, ça risque de ne pas être simple.

    Pour terminer :

    MCC = Microsoft Commmunity Contributor (voir en bas de page)

    Je ne me suis inscrit à rien, ni postulé à quoi que ce soit. C'est attribué comme ça, pour 3 mois éventuellement renouvelable. On ne gagne rien.


    Cordialement, Jacques

    • Marqué comme réponse EhJoe vendredi 8 février 2013 21:03
    vendredi 8 février 2013 13:02
  • Bonsoir Jacques,

    Ok, je poserais les questions une à une.

    Pour l'enregistrement en film ce n'est pas possible, tu imagines la taille d'un film constitué de 30 images secondes au format bmp ? Ce que j'aimerais si c'est possible, c'est que ça filme réellement, si c'est possible, wmv, avis...

    Donc résolu, à bientôt et cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse EhJoe vendredi 8 février 2013 21:03
    vendredi 8 février 2013 21:03