C\#영상 감시 시스템 실현(소스 코드 첨부)

공장 이나 창 고 를 가 본 사람 은 모두 알 고 있 습 니 다.공장 이나 창고 안에 서로 다른 라인 이 있 습 니 다.대부분의 공장 이나 창 고 는 서로 다른 라인 의 서로 다른 작업 현장 옆 에 컴퓨터 한 대 를 설치 합 니 다.한편,작업 현장 에 있 는 선생님 이 제품 의 중요 한 정 보 를 시스템 에 입력 하여 회사 시스템 데이터 수집 분석 에 편리 합 니 다.다른 한편,엄밀 한 공장 이나 창고 에 도 각 공정 에 카 메 라 를 설치 하여 유수 선 에서 노동자 들 의 체 조 를 채집 하거나 감시 하 는 데 사용 된다.
자,잡담 은 그만 하고 우리 본론 으로 들 어가 자!
이 시스템 모니터링 시스템 의 주요 핵심 은 AForge.NET 에서 제공 하 는 인터페이스 와 플러그 인(dll)을 사용 하 는 것 입 니 다.관심 있 는 친구 들 도 홈 페이지 에 가서 문 서 를 볼 수 있 습 니 다http://www.aforgenet.com/framework/documentation.html
  Talk is cheap,show me the code!
시스템 이 초기 화 될 때 먼저 작업 위치의 플랫폼 이 카 메 라 를 켰 는 지 확인 하고 구체 적 인 검 측 코드 는 다음 과 같다.

/// <summary>
///   bind
/// </summary>
private void bind()
{
  try
  {
    FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    if (videoDevices.Count <= 0)
    {
      MessageBox.Show("      ");
      return;
    }
    else
    {
      CloseCaptureDevice();
      if (!Directory.Exists(path)) Directory.CreateDirectory(path);
 
      videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
      videoSource.VideoResolution = videoSource.VideoCapabilities[0];
      sourcePlayer.VideoSource = videoSource;
      sourcePlayer.Start();
    }
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
}
자,카 메 라 는 문제 가 없습니다.우 리 는 네트워크 가 정상 인지 확인 하고 있 습 니 다.다른 부분 은 녹 화 된 영상 파일 이 작업 자 플랫폼 에 저장 되 지 않 는 다 는 것 이다.그렇지 않 으 면 유수 선과 작업 자가 충분 하 다.한 작업 자가 며칠 동안 영상 감 시 를 보 는 것 이 아니 겠 는가!우 리 는 모두 지능 화 시대 로 녹 화 된 동 영상 은 현지 에 저장 할 수 있 지만 편 의 를 위해 정기 적 으로 정리 하고 정기 적 으로 서버 에 올 려 심사 에 편리 하도록 해 야 한다.동 영상 을 서버 에 업로드 하 는 데 가장 많이 사용 되 는 것 은 두 가지 상황 이다.1.네트워크 가 안정 적 이 고 서버 와 직접 디스크 맵(공유 디 렉 터 리)을 열 수 있 으 며 동 영상 녹화 가 끝 난 후에 시스템 은 서버 에 직접 잘라 저장 하면 된다.2.서로 다른 시간 대 에 녹 화 된 동 영상 을 로 컬 에 저장 한 다음 에 타 이 밍 미 션 FTP 를 따로 개발 하여 타 이 밍 에 업로드 하면 된다.오늘 먼저 여러분 과 다음 두 번 째 방법 을 공유 하 겠 습 니 다.두 번 째 방법 도 비교적 간단 합 니 다.관심 이 있 는 친 구 는 공중전화 로 저 와 함께 토론 할 수 있 습 니 다.
부지불식간에 또 쓸데없는 말 을 늘 어 놓 았 다.모두 진실 한 사람 이 니 직접 소스 코드 에 올 라 가자.

/// <summary>
///               copy     ,              
/// </summary>
private void CopyFilesToServer()
{
  try
  {
    //     PC            ,   ,        
    string newPath = path + MacAddressPath + @"-Video\";
    if (!Directory.Exists(newPath)) Directory.CreateDirectory(newPath);
    //                
    var files = Directory.GetFiles(path, "*.wmv");
    foreach (var file in files)
    {
      FileInfo fi = new FileInfo(file);
      string filesName = file.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault();
      fi.MoveTo(newPath + filesName);
    } 
  }
  catch (Exception ex)
  {
    //TODO:    
  }
  finally
  {
    uint state = 0;
    if (!Directory.Exists("Z:"))
    {
      //    
      string computerName = System.Net.Dns.GetHostName();
      //              
      state = WNetHelper.WNetAddConnection(computerName + @"\" + netWorkUser, netWorkPwd, netWorkPath, "Z:");
    }
    if (state.Equals(0))
    {
      //        copy       
      CopyFolder(path + MacAddressPath + @"-Video\", zPath); 
    }
    else
    {
      WNetHelper.WinExec("NET USE * /DELETE /Y", 0);
      throw new Exception("         ,   :" + state.ToString());
    }
  }
}
그 중에서 CopyFolder 방법 코드 는 다음 과 같 습 니 다.

#region              ,   copy     
 /// <summary>
 ///              ,   copy     
 /// </summary>
 /// <param name="strFromPath"></param>
 /// <param name="strToPath"></param>
 public static void CopyFolder(string strFromPath, string strToPath)
 {
   //         ,   
   if (!Directory.Exists(strFromPath))
   {
     Directory.CreateDirectory(strFromPath);
   } 
   if (!Directory.Exists(strToPath))
   {
     Directory.CreateDirectory(strToPath);
   } 
   //    moveto,      
   string[] strFiles = Directory.GetFiles(strFromPath);
   //      ,                          ,             
   for (int i = 0; i < strFiles.Length; i++)
   {
     //     ,     ,    。
     string strFileName = strFiles[i].Substring(strFiles[i].LastIndexOf("\\") + 1, strFiles[i].Length - strFiles[i].LastIndexOf("\\") - 1);
     File.Move(strFiles[i], strToPath + "DT-" + strFileName);
   } 
 }
 #endregion
   플랫폼 검 사 를 마치 고 영상 전송 도 잘 했 습 니 다.그 다음 에 영상 녹화 의 주인공 연극 입 니 다.전체 녹화 영상 소스 는 다음 과 같 습 니 다.

/// <summary>
    /// videosouceplayer   
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="image"></param>
    private void sourcePlayer_NewFrame(object sender, ref Bitmap image)
    {
      try
      { 
        //        
        g = Graphics.FromImage(image);
        SolidBrush drawBrush = new SolidBrush(Color.Yellow);

        Font drawFont = new Font("Arial", 6, System.Drawing.FontStyle.Bold, GraphicsUnit.Millimeter);
        int xPos = image.Width - (image.Width - 15);
        int yPos = 10;

        string drawDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        g.DrawString(drawDate, drawFont, drawBrush, xPos, yPos);

        //save content
        string videoFileName = dt.ToString("yyyy-MM-dd HHmm") + ".wmv";

        if (TestDriveInfo(videoFileName)) //        
        {
          if (!stopREC)
          {
            stopREC = true;
            createNewFile = true; //      true        
            if (videoWriter != null) videoWriter.Close();
          }
          else
          {
            //    
            if (createNewFile)
            {
              //                  (  :       ),                    
              dt = DateTime.Now;
              videoFileFullPath = path + dt.ToString("yyyy-MM-dd HHmm") + ".wmv";//videoFileName;

              createNewFile = false;
              if (videoWriter != null)
              {
                videoWriter.Close();
                videoWriter.Dispose();
              }

              videoWriter = new VideoFileWriter();
              //        ,                 
              videoWriter.Open(videoFileFullPath, image.Width, image.Height, 30, VideoCodec.WMV1);
              videoWriter.WriteVideoFrame(image);
            }
            else
            {
              if (videoWriter.IsOpen)
              {
                videoWriter.WriteVideoFrame(image);
              }
              if (dt.AddMinutes(1) <= DateTime.Now)
              { 
                createNewFile = true;
                //modify by stephen,         ,         ,        (  :              ,      1                ,          )
                if (videoWriter != null)
                {
                  videoWriter.Close();
                  videoWriter.Dispose();
                }
                string newPath = path + MacAddressPath + @"-Video\";
                if (!Directory.Exists(newPath)) Directory.CreateDirectory(newPath);
                string newStr = newPath + dt.ToString("yyyyMMddHHmm") + "-" + DateTime.Now.ToString("yyyyMMddHHmm") + ".wmv";
                FileInfo fi = new FileInfo(videoFileFullPath);
                fi.MoveTo(newStr); 
                ////       
                //CopyFilesToServer();
              }
            }
          }
        }

      }
      catch (Exception ex)
      {
        videoWriter.Close();
        videoWriter.Dispose();
      }
      finally
      {

        if (this.g != null) this.g.Dispose();
      }

    }
      그 중에서 TestDrive Info 방법 은 동 영상 을 저장 하 는 디스크 정 보 를 얻 는 데 사 용 됩 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.

#region            
 /// <summary>
 ///            
 /// </summary>
 bool TestDriveInfo(string n)
 {
   try
   {
     DriveInfo D = DriveInfo.GetDrives().Where(a => a.Name == path.Substring(0, 3).ToUpper()).FirstOrDefault();
     Int64 i = D.TotalFreeSpace, ti = unchecked(50 * 1024 * 1024 * 1024);
     if (i < ti)
     {
       DirectoryInfo folder = new DirectoryInfo(path + MacAddressPath + @"-Video\");
       //modify by stephen,               
       if (folder.Exists)
       { 
         var fisList = folder.GetFiles("*.wmv").OrderBy(a => a.CreationTime); 
         if (fisList.Any())
         {
           List<FileInfo> fis = fisList.ToList();
           if (fis.Count > 0 && fis[0].Name != n)
           {
             File.Delete(fis[0].FullName);
           }
         }
       } 
     }
   }
   catch (Exception ex)
   {
     MessageBox.Show(ex.Message, "        ");
     return false;
   }
   return true;
 }
 #endregion
    물론 작업 자 아저씨 가 제품 정 보 를 입력 하 는 것 에 의문 이 있 으 면 시스템 캡 처 를 이용 하여 증 거 를 보존 할 수 있 습 니 다.이것 은 제 가 사족 을 그 리 는 기능 입 니 다.어쨌든 편 의 를 위해 서 입 니 다.작업 자 아저씨 의 업무 효율 을 지체 하지 마 세 요.카 메 라 를 이용 하여 캡 처 코드 는 다음 과 같 습 니 다.

try
{ 
  string pathp = $@"{Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)}\";
  if (!Directory.Exists(pathp)) Directory.CreateDirectory(pathp);
  if (sourcePlayer.IsRunning)
  {
    BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
   sourcePlayer.GetCurrentVideoFrame().GetHbitmap(),
   IntPtr.Zero,
   Int32Rect.Empty,
   BitmapSizeOptions.FromEmptyOptions());
    PngBitmapEncoder pE = new PngBitmapEncoder();
    pE.Frames.Add(BitmapFrame.Create(bitmapSource));
    string picName = $"{pathp}{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}.jpg";
    if (File.Exists(picName))
    {
      File.Delete(picName);
    }
    using (Stream stream = File.Create(picName))
    {
      pE.Save(stream);
    }
  }
}
catch (Exception ex)
{
  MessageBox.Show(ex.Message);
}
    코드 가 비교적 간단 해서 비 고 를 쓰 지 않 겠 습 니 다.물론 시스템 을 배치 할 때 도 순탄 하지 않 습 니 다.어떤 공장 이나 창 고 는 제3자 의 카 메 라 를 구 매 합 니 다.작업 환경 에 지장 을 주 고 카 메 라 는 플랫폼 의 각도 와 차이 가 클 수 있 습 니 다.그래서 저 는 사족 을 그 려 서 카메라 의 작은 기능 을 검 사 했 습 니 다.좌우 90°상하 180°화면 을 뒤 집 을 수 있 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.

#region          
 if (image != null)
 {
   RotateFlipType pType = RotateFlipType.RotateNoneFlipNone;
   if (dAngle == 0)
   {
     pType = RotateFlipType.RotateNoneFlipNone;
   }
   else if (dAngle == 90)
   {
     pType = RotateFlipType.Rotate90FlipNone;
   }
   else if (dAngle == 180)
   {
     pType = RotateFlipType.Rotate180FlipNone;
   }
   else if (dAngle == 270)
   {
     pType = RotateFlipType.Rotate270FlipNone;
   } 
   //        
   image.RotateFlip(pType);
 }
 #endregion
물론 회사 의 입장 에서 볼 때 작업 자 아저씨 가 실수(성심)로 영상 감시 프로그램 을 끄 는 것 을 방지 하기 위해 우 리 는 프로그램의 측면 에서 사 고 를 예방 할 수 있다.예 를 들 어 프로그램의 닫 기 단 추 를 사용 하지 않 고 도구 모음 오른쪽 단 추 를 누 르 면 프로그램 아이콘 이 프로그램 을 닫 는 작업 을 사용 하지 않 는 다.
   창 핸들 을 다시 써 서 방지 할 수 있 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.

#region       ,            
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
  get
  {
    CreateParams myCp = base.CreateParams;
    myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON;
    return myCp;
  }
}
이로써 시스템 코드 가 길 을 알려 주 었 으 니 소프트웨어 효 과 를 함께 보 자!비디오 내용 과 노트북 카메라 가 가 져 온 슬 래 그 픽 셀 을 자동 으로 무시 하 십시오.

저자:Stephen-kzx
출처:http://www.cnblogs.com/axing/
원본 다운로드:https://pan.baidu.com/s/1qxBXl4Nn7IO0SJ-mYC861Q추출 코드:b9f 7

좋은 웹페이지 즐겨찾기