1

みなさん、こんにちは!

JPEG形式でパナソニックIPカメラから画像を取得する際に問題が発生しました。fpsは常に1または2以下であるため、問題はfpsにありますが、実際のカメラは最大30をサポートします。カムモデルはパナソニックWV-SP302Eです。次のC#コードを使用して画像を取得し、winformsアプリに表示しています

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

backgrounworkerコンポーネントを使用して、別のスレッドで画像を取得していますが、それでも2fpsです。fpsを上げる方法についてのアイデア

4

4 に答える 4

1

質問からかなり時間が経ちましたが、それでも同じです。

カメラはストリーミングモードで毎秒最大30フレームを提供しますが、これは必ずしもJPEGスナップショットフレームレートに適用されるわけではありません。カメラモデルによっては、有効なJPEGレートは、フルスピードストリーミングと比較して多少遅くなる場合があります。

これについて実際にできることはほとんどありません(MPEG-4 / H.264カメラがJPEGをより低いレートで送信するのが一般的です)。オプションは次のとおりです。

  • ビデオフィードを受信して​​カメラから画像を取得します(RTSPなどの標準プロトコル、SDKまたはカメラベンダーからのActiveXコントロールの一種による独自のプロトコルの場合があります)
  • カメラをより適切なモデルに交換して、1秒あたりのJPEGスナップショットを増やします
于 2011-10-04T18:26:24.093 に答える
1

通常、IPカメラから1秒あたり数個を超えるjpeg画像をクエリすることはできません。30 fpsのビデオストリームが必要な場合は、スナップショットストリームではなく、motionjpegのような「ビデオ」ストリームをクエリする必要があります。

于 2018-10-27T15:04:23.833 に答える
0

そのストリームを実行するためにかなりの設定が行われているようです。あなたが絶えず割り当てたり解放したりしないようにそこから割り当てを取り除くことは助けになります。

ストリームを開始したら複数のフレームを読み取ると、おそらく役立ちます(つまり、データ取得ループ内からビットマップを生成します)。参考までに、GUI以外のスレッドからGUI操作を呼び出すべきではありません。ReportProgressを使用してデータを送り返します。

表示するのではなく、時間がかかるのはキャプチャだと思いますか?テストする図面コードを削除してみましたか?

于 2011-04-12T15:35:59.937 に答える
-1

シーンを適切に照明していることを確認してください。単純でやや不正確な説明は、自動露出モードのデジタルカメラは十分な光を取り込むまで待機するため、センサーが非効率な暗いシーン(夜の暗い部屋など)では時間がかかるというものです。明るい部屋、または日中の屋外でカメラを試して、フレームレートが向上するかどうかを確認してください。

于 2011-04-12T19:29:18.667 に答える