2011-04-12 17 views
1

Hy Everyone!IP 카메라에서 높은 Fps로 JPEG 형식의 이미지를 가져 오는 방법

JPEG 형식의 파나소닉 IP 카메라에서 이미지를 가져 오는 데 문제가 있습니다. fps가 항상 1 또는 2로 유지되지만 infact 카메라는 최대 30 개까지 캠 모델을 지원하기 때문에 문제는 fps와 같습니다. 파나소닉 WV-SP302E 난 여전히 2 FPS를 이미지를 잡고 심지어 다른 스레드에서 이미지를 잡기 위해 backgrounworker 구성 요소를 사용하고

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(); 
    } 
} 

내 윈폼 응용 프로그램에 표시하지만, 다음 C# 코드를 사용하고 있습니다. 어떤 생각을 fps를 늘리는 방법

답변

0

꽤 많은 스트림 설정을해야 할 것 같습니다. 할당을 꺼내서 할당하고 해제하지 않으면 도움이 될 것입니다.

스트림을 얻은 후에 여러 프레임을 읽는 것이 도움이됩니다 (즉, 데이터 수집 루프에서 비트 맵을 생성하는 것). 참고로 GUI가 아닌 스레드에서 GUI 작업을 호출하면 안됩니다. ReportProgress를 사용하여 데이터를 다시 보냅니다.

당신은 그것을 캡쳐하는 것과 반대되는 시간을 갖는 캡쳐가 확실합니까? 테스트 할 드로잉 코드를 제거해 보셨습니까?

+0

의견을 보내 주셔서 감사합니다. 이미지 잡는 날짜와 시간을 나타내는 목록에 항목을 추가하여 나이를 들여서 진행합니다. 그 목록은 또한 매초마다 두 개의 항목을 표시하므로 문제는 다른 곳에 있다고 생각합니다. –

-1

장면을 적절하게 밝게하고 있는지 확인하십시오. 간단하고 다소 부정확 한 설명은 자동 노출 모드의 디지털 카메라가 충분한 빛을 포착 할 때까지 기다릴 것이며, 비효율적 인 센서가있는 어두운 장면 (밤에는 어두운 방과 같은)에서는 어느 정도 시간이 걸릴 것입니다. 밝은 방에서 카메라를 사용하거나 낮에는 바깥에서 카메라를 사용해보고 프레임 속도가 향상되는지 확인하십시오.

+0

당신의 제안에 감사드립니다. 나는 항상 낮의 시간과 충분한 빛이있는 방의 이미지를 잡으려고했습니다. 그러나 fps의 문제는 항상 잡는 이미지에 존재합니다. –

0

질문 이후 꽤 오랜 시간이 지났지 만 그 이후로는 여전히 동일합니다.

카메라는 스트리밍 모드에서 초당 최대 30 프레임을 제공하지만 이는 JPEG 스냅 샷 프레임 속도에 반드시 적용되는 것은 아닙니다. 카메라 모델에 따라 JPEG 속도는 전체 속도 스트리밍에 비해 다소 느릴 수 있습니다. 당신이 실제로 이것에 대해 할 수있는 조금있다

이 (가 낮은 속도로 JPEG 파일을 전송하는 MPEG-4/H.264 카메라의 전형이다), 옵션은 다음과 같습니다

  • 수신을 통해 카메라에서 이미지를 수집
  • 두 번째
당 더 많은 JPEG 스냅 샷을 유도 할 수있는 더 적절한 모델로 카메라를 대체 (RTSP 같은 표준 프로토콜, 또는 SDK 나 카메라 공급 업체에서 ActiveX 컨트롤의 종류를 통해 독점 프로토콜 일 수 있음) 비디오 피드
관련 문제