2017-11-15 3 views
0

최대 6 대의 카메라에서 이미지를 수집하려고합니다. 내가 가지고있는 코드는 작동하지만 각 카메라의 그림 상자에 이미지를 넣기 위해 NewFrame 이벤트 핸들러를 개별적으로 명명 된 핸들러로 설정하기 위해 카메라의 인덱스를 전환해야하므로 객체 지향적이지 않습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까 (아래 코드 참조).이미지 캡처 용 여러 카메라 설정

private void ImageCollector_Load(object sender, EventArgs e) 
    { 
     webcams = new FilterInfoCollection(FilterCategory.VideoInputDevice); 

     Cameras = new VideoCaptureDevice[webcams.Count]; 
     int index = 0; 
     foreach (FilterInfo CaptureDevice in webcams) 
     { 
      // Enable the cameras display 
      ViewLabelflowLayoutPanel.Controls[index].Visible = true; 
      ImageLabelflowLayoutPanel.Controls[index].Visible = true; 
      ViewflowLayoutPanel.Controls[index].Visible = true; 
      ImageflowLayoutPanel.Controls[index].Visible = true; 
      CameracomboBox.Items.Add(CaptureDevice.Name); 
      try 
      { 
       Cameras[index] = new VideoCaptureDevice(webcams[index].MonikerString); 
       switch (index) 
       { 
        case 0: 
         Cameras[index].NewFrame += new NewFrameEventHandler(cam1_NewFrame); 
         break; 

        case 1: 
         Cameras[index].NewFrame += new NewFrameEventHandler(cam2_NewFrame); 
         break; 

        case 2: 
         Cameras[index].NewFrame += new NewFrameEventHandler(cam3_NewFrame); 
         break; 

        case 3: 
         Cameras[index].NewFrame += new NewFrameEventHandler(cam4_NewFrame); 
         break; 

        case 4: 
         Cameras[index].NewFrame += new NewFrameEventHandler(cam5_NewFrame); 
         break; 

        case 5: 
         Cameras[index].NewFrame += new NewFrameEventHandler(cam6_NewFrame); 
         break; 
       }//endswitch 

       Cameras[index].Start(); 
      }//endtry 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message, "Error"); 
      }//endcatch 
     }//endforeach 
     CameracomboBox.SelectedIndex = 0; 
     index++; 
    }//endImageCollector_Load 

감사

답변

0

좋은 당신을 위해, 당신은 코드 냄새를 식별 할 수 있습니다!

NewFrame의 작동 방식을 알지 못하지만 이벤트를 트리거 한 카메라 인 발신자가있을 수 있습니다.

foreach (FilterInfo CaptureDevice in webcams) 
    { 
     // Enable the cameras display 
     ViewLabelflowLayoutPanel.Controls[index].Visible = true; 
     ImageLabelflowLayoutPanel.Controls[index].Visible = true; 
     ViewflowLayoutPanel.Controls[index].Visible = true; 
     ImageflowLayoutPanel.Controls[index].Visible = true; 
     CameracomboBox.Items.Add(CaptureDevice.Name); 
     try 
     { 
      Cameras[index] = new VideoCaptureDevice(webcams[index].MonikerString); 
      Cameras[index].NewFrame += new NewFrameEventHandler(cam_NewFrame); 


      Cameras[index].Start(); 
     }//endtry 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error"); 
     }//endcatch 
    }//endforeach 
    CameracomboBox.SelectedIndex = 0; 
    index++; 


public void cam_NewFrame(object sender, EventArgs e){ 

    VideoCaptureDevice cam = sender as VideoCaptureDevice; 
    //do what you need to do with cam here. 

} 

송신자가 카메라 개체로 설정된 것으로 가정합니다.

관련 문제