2017年2月10日 星期五

IPCAM RTSP串流 利用emgu cv 製作簡易錄影程式 C#

最近因工作需求 研究了

IPCAM RTSP


因為不好找 怕自己忘記 所以做簡單的紀錄

首先  先下載 Emgu CV
 確認IP cam 是否支援 RTSP 串流(各家有不一樣)
首先建立 加入emgu cv 的參考後
建立
 private Capture cap = null;
 private Capture[] cap1 =new Capture[2];
因為讀取會需要時間比較慢所以開啟程式我先建立了攝影機
 public Form1()
        {
            try
            {
                InitializeComponent();
                cap1[0] = new Capture("rtsp://admin:123456@192.168.1.88:554/H264?ch=1&subtype=1");
                cap1[1] = new Capture(0);
               // cap = new Capture("rtsp://admin:123456@192.168.1.88:554/H264?ch=1&subtype=1");
         //我用的CAM 需要密碼所以在 串流前加入 帳號 密碼 大部分都要)    
                Application.Idle += new EventHandler(Application_Idle);
            }
            catch (NullReferenceException excpt)
            {
                MessageBox.Show(excpt.Message);
            }
        }

//顯示基本畫面
 void Application_Idle(object sender, EventArgs e)
        {
            Image<Bgr, Byte> frame = cap1[0].QueryFrame();// 攝影機畫面
            pictureBox1.Image = frame.ToBitmap();

        }

//執行錄影程式
  private void button2_Click(object sender, EventArgs e)
        {
            //cap = new Capture("rtsp://admin:123456@192.168.1.88:554/H264?ch=1&subtype=1");
            if (cap1[0]== null)
            {
                MessageBox.Show("找不到攝影機", "error");
            }



            Image<Bgr, byte> temp = cap1[0].QueryFrame();


            string nowstring = DateTime.Now.ToString("yyyyMMddhhmmss");
           /* SaveFileDialog SaveFileDialog1 = new SaveFileDialog();
            SaveFileDialog1.FileName = nowstring;
            Console.WriteLine("這裡"+SaveFileDialog1.FileName);
            SaveFileDialog1.Filter = "Image Files(*.avi)|*.avi|All files (*.*)|*.*";
         
            if (SaveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show("開始錄製,按ESC結束錄製");
            }
            */
            string seee = @"C:\Test\photos\" + nowstring+".avi";
//執行攝影的主要區域
            VideoWriter video = new VideoWriter(seee, CvInvoke.CV_FOURCC('X', 'V', 'I', 'D'), 20, 800, 600, true);
//這邊是一直抓取圖片把他丟成 影片
            while (temp != null)
            {
                CvInvoke.cvShowImage("camera", temp.Ptr);
                temp = cap1[0].QueryFrame();
                int c = CvInvoke.cvWaitKey(20);
                video.WriteFrame<Bgr, byte>(temp);
                //遇到事件停止錄影
               if (c == 27)
               { break; }
                //break;
            }
            Thread t1 = new Thread(MyBackgroundTask);
           // t1.Join();
            video.Dispose();
            CvInvoke.cvDestroyWindow("camera");

            //錄影完需將影像停止不然會出錯

            _captureInProgress = false;
            button1.Text = "開始";
            Application.Idle -= Application_Idle;
        }

基本為這樣如有錯誤希望能幫忙糾正

3 則留言: