C# 使用Emgu CV C同时运行两个摄像头

C# 使用Emgu CV C同时运行两个摄像头,c#,opencv,emgucv,C#,Opencv,Emgucv,我有两个IP摄像机。我想同时运行它们。我正在使用Emgu CV处理图像。所以在这里,当我点击开始按钮时,我的程序会检查哪些摄像头处于活动状态,并获取它们的IP地址。在获得它们的IP地址后,我的程序将使用这些IP从数据库中获取数据。在我得到的条件下,我的程序会非常慢,并且在捕获过程运行时会延迟几秒钟。有人能帮我解决这个问题吗?这就是我所做的 private void Tombol_Start_Click(object sender, EventArgs e) { Pro

我有两个IP摄像机。我想同时运行它们。我正在使用Emgu CV处理图像。所以在这里,当我点击开始按钮时,我的程序会检查哪些摄像头处于活动状态,并获取它们的IP地址。在获得它们的IP地址后,我的程序将使用这些IP从数据库中获取数据。在我得到的条件下,我的程序会非常慢,并且在捕获过程运行时会延迟几秒钟。有人能帮我解决这个问题吗?这就是我所做的

    private void Tombol_Start_Click(object sender, EventArgs e)
    {
      ProsesSemuaKamera();
    }

    private void ProsesSemuaKamera()
    {
       Ping ping = new Ping();
       PingReply pingreply;

       OleDbConnection kon = new OleDbConnection(koneksi);
       OleDbCommand command = kon.CreateCommand();
       kon.Open();
       string selecturl = "select * from datakamera";
       command.CommandText = selecturl;
       OleDbDataReader bacadata = command.ExecuteReader();

       while (bacadata.Read())
       {
         int counturl = 0;
         pingreply = ping.Send(bacadata["ipadd"].ToString());

         if (pingreply.Status == IPStatus.Success)
         {
           listBox1.Items.Add(bacadata["namakamera"].ToString());
           CaptureSemuaKamera = new Capture(bacadata["urlkamera"].ToString());
           Application.Idle += new EventHandler(ProcessFrameSemuaKamera);    

         }
         else if (pingreply.Status != IPStatus.Success)
         {
          textBox3.Text += bacadata["namakamera"].ToString() + Environment.NewLine;
          }
      }
    kon.Close();
 }

    private void ProcessFrameSemuaKamera(object sender, EventArgs e)
    {
      Image<Bgr, Byte> sourceImage = CaptureSemuaKamera.QueryFrame();
      SourceBox.Image = sourceImage.Bitmap;
      ProsesKameraSemua();
    }

        private string BuildWhereClause(ListBox lb)
        {
            string WHEREclause = string.Empty;

            foreach (string itm in lb.Items)
            {
                if (WHEREclause == string.Empty)
                {
                    WHEREclause += " where namakamera = '" + itm + "' ";
                }
                else
                {
                    WHEREclause += " OR namakamera = '" + itm + "' ";
                }
            }
            return WHEREclause;
        }

 private void ProsesKameraSemua()
        {
            Image<Bgr, Byte> sourceImage = CaptureSemuaKamera.QueryFrame();
            SourceBox.Image = sourceImage.Bitmap;

            OleDbConnection kon = new OleDbConnection(koneksi);
            OleDbCommand commandkoord = kon.CreateCommand();
            OleDbCommand commandkoordgaris = kon.CreateCommand();

            kon.Open();
                string selectsemuakoord = "select * from koordinatkotak " + BuildWhereClause(listBox1);
                string selectsemuakoordgaris = "select * from koordinatgaris " + BuildWhereClause(listBox1);

                commandkoord.CommandText = selectsemuakoord;
                commandkoordgaris.CommandText = selectsemuakoordgaris;
                OleDbDataReader bacakoord = commandkoord.ExecuteReader();
                OleDbDataReader bacakoordgaris = commandkoordgaris.ExecuteReader();

                while (bacakoord.Read() && bacakoordgaris.Read())
                {
                    #region Perspective projection

                    PointF[] srcs = new PointF[4];
                    srcs[0] = new PointF(int.Parse(bacakoord["x1source"].ToString()), int.Parse(bacakoord["y1source"].ToString())); //119, 187
                    srcs[1] = new PointF(int.Parse(bacakoord["x2source"].ToString()), int.Parse(bacakoord["y2source"].ToString())); //242, 181
                    srcs[2] = new PointF(int.Parse(bacakoord["x3source"].ToString()), int.Parse(bacakoord["y3source"].ToString())); //253, 225
                    srcs[3] = new PointF(int.Parse(bacakoord["x4source"].ToString()), int.Parse(bacakoord["y4source"].ToString())); //112, 231

                    PointF[] dsts = new PointF[4];
                    dsts[0] = new PointF(int.Parse(bacakoord["x1proj"].ToString()), int.Parse(bacakoord["y1proj"].ToString()));
                    dsts[1] = new PointF(int.Parse(bacakoord["x2proj"].ToString()), int.Parse(bacakoord["y2proj"].ToString()));
                    dsts[2] = new PointF(int.Parse(bacakoord["x3proj"].ToString()), int.Parse(bacakoord["y3proj"].ToString()));
                    dsts[3] = new PointF(int.Parse(bacakoord["x4proj"].ToString()), int.Parse(bacakoord["y4proj"].ToString()));


                    HomographyMatrix mywarpmat = CameraCalibration.GetPerspectiveTransform(srcs, dsts);
                    Image<Bgr, Byte> newImage = sourceImage.WarpPerspective(mywarpmat, 355, 288, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR, Emgu.CV.CvEnum.WARP.CV_WARP_FILL_OUTLIERS, new Bgr(0, 0, 0));
                    Image<Gray, Byte> newImageGray = newImage.Convert<Gray, Byte>();

                    Image<Bgr, Byte> imageToShow = newImage.Copy();
                    Image<Bgr, Byte> imageToShowGaris = newImage.Copy();

                    ProjectionBox.Image = newImage.Bitmap;

                    #endregion
  }
}