2011-04-12 3 views
1

Hy Tout le monde! Je ai un problème à saisir des images à partir d'une caméra IP Panasonic au format JPEG en fait le problème est avec le fps parce que le fps reste toujours 1 ou 2 pas plus que cela, mais la caméra prend en charge jusqu'à 30 le modèle de came Panasonic WV-SP302E je suis en utilisant le code C# suivant pour saisir l'image et l'afficher dans mon winForms applicationComment saisir des images au format JPEG en plus haute fps à partir de la caméra IP

public partial class Form1 : Form 
{ 
    // indicates wether to prevent caching in case of a proxy server or not 
    private bool preventCaching = false;     

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      this.pictureBox1.Image = this.GetSingleFrame(@"http://ipaddress/SnapshotJPEG?Resolution=320x240&Quality=Standard");     
     } 
    } 

    /// <summary> 
    /// Get a single JPEG frame from the camera 
    /// </summary> 
    /// <param name="source">JPEG Stream source</param> 
    /// <exception cref="WebException">If the IP camera is not receable or an error is occured</exception> 
    /// <exception cref="Exception">If an unknown error occured</exception> 
    public Bitmap GetSingleFrame(string source) 
    { 
     byte[] buffer = new byte[512 * 1024]; // buffer to read stream 
     HttpWebRequest req = null; 
     WebResponse resp = null; 
     Stream stream = null; 
     Random rnd = new Random((int)DateTime.Now.Ticks); 

     try 
     { 
      int read, total = 0; 

      // create request 
      if (!preventCaching) 
      { 
       req = (HttpWebRequest)WebRequest.Create(source); 
      } 
      else 
      { 
       req = (HttpWebRequest)WebRequest.Create(source + ((source.IndexOf('?') == -1) ? '?' : '&') + "fake=" + rnd.Next().ToString()); 
      } 
      // set login and password     
      req.Credentials = new NetworkCredential("root", "a");     

      req.Timeout = -1; 

      resp = req.GetResponse(); 

      // get response stream 
      stream = resp.GetResponseStream(); 

      // loop 
      do 
      { 
       read = stream.Read(buffer, total, 1024); 

       total += read; 
      } 
      while (read != 0); 

      Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0, total)); 

      return bmp; 
     } 
     catch (WebException ex) 
     { 
      string s = ex.ToString(); 
      return null; 
     } 
     catch (Exception ex) 
     { 
      string s = ex.ToString(); 
      return null; 
     } 
     finally 
     { 
      // abort request 
      if (req != null) 
      { 
       req.Abort(); 
       req = null; 
      } 
      // close response stream 
      if (stream != null) 
      { 
       stream.Close(); 
       stream = null; 
      } 
      // close response 
      if (resp != null) 
      { 
       resp.Close(); 
       resp = null; 
      } 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     this.backgroundWorker1.RunWorkerAsync(); 
    } 
} 

Je suis même en utilisant le composant backgrounworker pour saisir des images dans un autre fil, mais encore 2 images par seconde. Toute idée comment augmenter le fps

Répondre

0

On dirait que vous avez un peu de mise en place pour obtenir ce flux. Prendre la répartition hors de là pour que vous ne soyez pas constamment allouer et libérer aidera.

La lecture de plusieurs images une fois que le flux est en cours vous aidera probablement (c.-à-d. En générant des bitmaps depuis votre boucle d'acquisition de données). Pour votre information, vous ne devriez pas appeler les opérations de l'interface graphique à partir d'un thread non-gui. Utilisez ReportProgress pour renvoyer les données.

Etes-vous certain que c'est la capture qui prend le temps plutôt que de l'afficher? Avez-vous essayé de supprimer le code de dessin pour tester?

+0

Merci pour votre suggestion j'ai vérifié l'im âge saisissant la progression en ajoutant un élément dans une liste pour représenter la date et l'heure de saisie de l'image. Cette liste montre également deux entrées pour chaque seconde donc je pense que le problème se situe ailleurs. –

-1

Assurez-vous d'allumer la scène correctement. L'explication simple et quelque peu inexacte est que les appareils photo numériques en mode d'exposition automatique attendront jusqu'à ce qu'ils aient capturé assez de lumière, ce qui dans une scène sombre (comme une pièce sombre la nuit) avec un capteur inefficace prendra un certain temps. Essayez l'appareil photo dans une pièce plus claire, ou à l'extérieur à la lumière du jour, et voyez si votre fréquence d'images s'améliore.

+0

Thankx pour votre suggestion j'ai toujours essayé de saisir des images dans la journée et dans une pièce où il y a assez de lumière. Mais le problème de fps est toujours présent en saisissant des images. –

0

Cela fait pas mal de temps depuis la question, mais c'est toujours pareil depuis. L'appareil photo offre jusqu'à 30 images par seconde en mode de diffusion en continu, mais cela ne s'applique pas nécessairement à la fréquence d'images instantanées JPEG. En fonction du modèle de caméra, le débit JPEG effectif peut être plus ou moins lent par rapport à la diffusion en continu à pleine vitesse.

Il y a peu, vous pouvez réellement faire à ce sujet (il est typique pour la caméra MPEG-4/H.264 pour envoyer des fichiers JPEG à un taux plus faible), vos options sont:

  • acquérir des images de la caméra en recevant un flux vidéo (qui peut être un protocole standard comme RTSP, ou un protocole propriétaire via SDK ou une sorte de contrôle ActiveX du fabricant de la caméra)
  • Remplacez la caméra par un modèle plus approprié qui vous permet d'obtenir plus d'instantanés JPEG par seconde
Questions connexes