C\#OpenCV 를 사용 하여 그림 속 인물 의 얼굴 을 자 르 는 실현 방법

머리말
본 고 는 주로 OpenCV 커팅 도형 중의 인물 두상 을 어떻게 사용 하 는 지 를 소개 한다.
준비 작업
우선 Wpf 프로젝트 를 만 듭 니 다--OpenCVFace_Wpf,이 버 전 은 Framework 4.7.2 를 사용 합 니 다.
그리고 Nuget 을 사용 하여[Emgu.CV]를 검색 합 니 다.다음 그림 입 니 다.

이곳 의 Emgu.CV 는 4.3.0.3890 버 전 을 선택 한 후 Emgu.CV 와 Emgu.CV.runtime.windows 를 설치 합 니 다.
그리고 필요 한 파일 을 다운로드 합 니 다 haarcascadefrontalface_default.xml。
OpenCV 의 오픈 소스 코드 에서 다운로드 할 수 있 습 니 다.다운로드 주소:https://github.com/opencv/opencv/tree/master/data/haarcascades.
그리고 파일 을 항목 에 추가 하고 속성 을 수정 하여 xml 파일 을 시작 디 렉 터 리 에 출력 합 니 다.다음 그림 입 니 다.

오 펜 CV 로 얼굴 자 르 기.
지금 우 리 는 프로젝트 에 들 어가 서 OPENCV 호출 을 진행 합 니 다.
먼저 네 임 스페이스 를 도입 합 니 다.다음 과 같 습 니 다.

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System.Drawing;
using System.Windows.Forms;
그리고 사람의 얼굴 을 자 르 는 함수 인 CutFace 를 작성 합 니 다.
함수 에서,우 리 는 먼저 Cascade Classifier 류 를 사용 하여 haarcascade 를 읽 습 니 다.frontalface_default.xml 파일,얼굴 검사 대상 을 만 듭 니 다.
그림(그 레이스 케 일 모드)을 가 져 오 려 면 Mat 클래스 를 사용 하 십시오.
그리고 얼굴 검사 대상 을 사용 하 는 방법 인 Detect MultiScale 을 사용 하여 얼굴 수 를 식별 합 니 다.
마지막 으로 비트 맵 클래스 를 통 해 인식 되 는 사람의 얼굴 을 잘라 서 저장 합 니 다.
코드 는 다음 과 같 습 니 다:

public void CutFace(string filename)
{
  //CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;//  GPU  
  var face = new CascadeClassifier("haarcascade_frontalface_default.xml");
  var mat = new Mat(filename, ImreadModes.Grayscale);//      
  int minNeighbors = 7;//     ,  3
  var size = new System.Drawing.Size(10, 10);//      
  var facesDetected = face.DetectMultiScale(mat, 1.1, minNeighbors, size);
  //              
  int index = 0;
  var bitmap = Bitmap.FromFile(filename);
  foreach (var item in facesDetected)
  {
    index++;
    var bmpOut = new Bitmap(item.Width, item.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    var g = Graphics.FromImage(bmpOut);
    g.DrawImage(bitmap, new System.Drawing.Rectangle(0, 0, item.Width, item.Height),
      new System.Drawing.Rectangle(item.X, item.Y, item.Width, item.Height), GraphicsUnit.Pixel);
    g.Dispose();
    bmpOut.Save($"Face_{index}.png", System.Drawing.Imaging.ImageFormat.Png);
    bmpOut.Dispose();
  }
  bitmap.Dispose();
  mat.Dispose();
  face.Dispose();
}
그리고 파일 을 여 는 함 수 를 만 들 고 파일 을 성공 적 으로 열 었 을 때 CutFace 를 호출 합 니 다.

public void SelectImg()
{
  System.Windows.Forms.OpenFileDialog frm = new System.Windows.Forms.OpenFileDialog();
  frm.Filter = "(*.jpg,*.png,*.jpeg,*.bmp)|*.jgp;*.png;*.jpeg;*.bmp|All files(*.*)|*.*";
  if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {
    CutFace(frm.FileName);
  }
}
지금 우 리 는 프로젝트 를 시작 합 니 다.다음 그림:

실행 결과
화면 에 있 는 그림 을 클릭 하여 얼굴 이 있 는 그림 을 선택 하여 테스트 합 니 다.
코드 에서 기본적으로 자 른 그림 을 Debug 폴 더 에 저장 합 니 다.Debug 폴 더 를 엽 니 다.다음 그림:

내 가 선택 한 그림 은 한 사람의 얼굴 만 있 기 때문에 자 른 그림-Face 를 얻 었 다.1.png。
원본 그림 과 자 른 그림 은 다음 과 같 습 니 다.

이제 얼굴 이 많은 그림 을 바 꿔 서 다시 테스트 해 보 자.테스트 그림 은 다음 과 같다.

실행 후 결 과 는 다음 과 같 습 니 다.

----------------------------------------------------------------------------------------------------
이 C\#OpenCV 로 도형 에 있 는 인물 프로필 사진 을 자 르 면 소 개 됩 니 다.
코드 가 Github 에 전송 되 었 습 니 다.다운로드 환영 합 니 다.
Github 주소:https://github.com/kiba518/OpenCV_Face_Wpf
C\#OpenCV 를 사용 하여 그림 속 인물 의 얼굴 을 자 르 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#OpenCV 를 사용 하여 그림 을 자 르 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기