NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# OpenCV를 이용한 캐릭터 따라가기. (Following a character using OpenCV.)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘 만들어볼 내용은 사용자가 선택한 특정 캐릭터 또는 오브젝트를 따라가는 프로그램을 만들어 볼겁니다. 코딩량이 그렇게 많지는 않아서 누구나 쉽게 만들 수 있을거예요. 대략 40줄밖에 안되거든요~ 간단하게 테스트하기 위해 Visual Studio를 실행하고 새로운 프로젝트를 추가 해줍니다. 저는 콘솔 프로젝트로 만들었어요. 이름 짖기가 귀찮아서 그냥 기본 이름(ConsoleApp1)으로 만들었습니다.

    5YQrRER.png

     

     

    OpenCV를 이용할겁니다. 아래 그림과같이 프로젝트의 NuGet Package를 통해 아래 2개 패키지를 설치 해주세요.

    vu48M9j.png

     

     

    윈도우 전체 화면에서 오브젝트를 검출해도 되지만~ 효율을 위해 실제 동영상 또는 게임창 부분만 인식하도록 해야 합니다. 영역을 설정하기 위해 [ 엔지엠 에디터 무료 ] 버전을 실행하고, 아래 동영상과 같이 인식할 범위를 선택 해줍니다. 엔지엠 에디터가 없으면 [ 여기 ]에서 다운로드 할 수 있습니다.

    5VhwPOM.gif

     

     

    위에서 "찾기 영역"을 복사한 후 아래와 같이 코드를 추가 해줍니다.

    Rectangle captureArea = new Rectangle(120, 204, 1233, 641);

     

    OpenCV의 오브젝트 트레커를 생성 해주세요. Tracker는 아래와 같이 8종류를 제공 해줍니다.

    • Boosting: 구버전 추적기로 성능이 떨어집니다. 현재는 사용되지 않습니다.
    • MIL: Boosting에 비해 정확도가 높지만, 감지 여부에 대한 처리가 누락됩니다.
    • KCF: Boosting, MIL보다 속도가 빠릅니다. 하지만, 오브젝트가 겹치거나 가리는 경우 추적을 놓치게됩니다.
    • CSRT: KCF보다 정확도가 높고, 오브젝트가 가려져 있어도 잘 추적합니다. 속도가 느립니다.
    • MedianFlow: 이미지가 빠르게 움직이는 경우 오브젝트 감지를 못하는 문제가 있습니다.
    • TLD: CSRT는 검출 대상을 놓치면 다시 찾지 못하는 문제가 있습니다. TLD는 다시 찾아서 추적하지만, 속도가 느립니다.
    • MOSSE: 정확도는 떨어지지만 속도가 매우 빠릅니다.
    • GOTURN: 딥러닝 기반으로 모델이 필요합니다.
    List<OpenCvSharp.Tracking.TrackerCSRT> trackers = new List<OpenCvSharp.Tracking.TrackerCSRT>();

     

    화면에서 검출할 이미지를 사용자가 선택할 수 있도록, 첫번째 캡쳐 화면을 표시 해줍니다.

    Image image = NGM.Utility.ScreenCaptureManager.ScreenShot.GetActiveImage(captureArea);
    
    Mat img = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)image);
    Cv2.CvtColor(img, img, ColorConversionCodes.BGRA2BGR);
    
    Cv2.NamedWindow("Select Window");
    Cv2.ImShow("Select Window", img);
    
    Rect[] rects = Cv2.SelectROIs("Select Window", img, true, false);
    Cv2.DestroyWindow("Select Window");

     

    OpenCV는 이미지 분석에 GrayScale을 사용하는게 좋습니다. 하지만, 이런 필터들로 인해 성능이 저하되는건 좋지 않죠. 그래서, 특별히 필터를 사용하지는 않았습니다. 다만, 아래 코드와 같이 4Channel을 3Channel로 변경해줬습니다. Alpha값이 존재하지 않기 때문에 스캔라인의 스트라이더까지 계산할 필요는 없습니다.

    Cv2.CvtColor(img, img, ColorConversionCodes.BGRA2BGR);

     

    검출할 이미지를 선택하기 위해 Cv2.SelectROIs를 사용합니다. 단일 오브젝트만 검출한다면 Cv2.SelectROI를 사용해도 됩니다.

    Rect[] rects = Cv2.SelectROIs("Select Window", img, true, false);

     

    프로그램을 실행(F5)하면 검출할 이미지를 선택할 수 있는 창이 표시됩니다. 여러분들은 깨끗한 동영상과 이미지가 보일겁니다. 동영상 촬영 프로그램과 OpenCV, 캡쳐 프로그램등등... 글을 작성하기 위한 그래픽 프로그램이 많다보니 이미지가 많이 깨지네요. 아무튼, 레드벨벳의 아이린 얼굴을 드래그로 선택한 후 스페이스바를 눌러서 선택 완료하세요. 그리고, ESC를 누르면 작업이 완료됩니다.

    1N7ys20.gif

     

     

    위에서 언급했던 트레커를 초기화 해줍니다. 이번 테스트에서는 CSRT를 사용했습니다.

    foreach (var rect in rects)
    {
        var tracker = OpenCvSharp.Tracking.TrackerCSRT.Create();
        tracker.Init(img, rect);
        trackers.Add(tracker);
    }

     

    마지막으로 오브젝트를 추적하기 위해 반복해서 화면을 캡쳐해서 트레커로 전달해줍니다. 이렇게만 하면 실제로 어떻게 처리가 되는지 시각적으로 알 수 없기 때문에 검출된 오브젝트의 위치 값을 트레커에 업데이트 해줍니다. 그리고, Cv2.Rectangle을 이용해서 사각형 영역을 그려주세요.

    while (true)
    {
        image = NGM.Utility.ScreenCaptureManager.ScreenShot.GetActiveImage(captureArea);
        img = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)image);
        Cv2.CvtColor(img, img, ColorConversionCodes.BGRA2BGR);
    
        foreach (var tracker in trackers)
        {
            Rect box = new Rect();
            bool success = tracker.Update(img, ref box);
            Cv2.Rectangle(img, box, Scalar.White, 3);
        }
    
        Cv2.ImShow("img", img);
        if (Cv2.WaitKey(33) == 'q')
            break;
    }

     

    프로그램을 실행하고, 레드벨벳의 아이린 얼굴을 선택 해줍니다. 그리고, ESC를 눌러서 작업을 완료하세요. 그러면 아래 동영상처럼 추적할 수 있습니다.

     

     

    재미로 하나 더 테스트 해볼까요? 아래는 리니지W라는 모바일 게임인데요. 저는 게임을 안해서 유튜브에 있는 사냥 동영상으로 테스트 했습니다. 케릭터도 잘 따라다니죠?

     

     

    생각보다 실시간으로 이미지 트레킹이 잘 되더라구요. 단 40줄로 이런 프로그램을 만들 수 있다는거에 놀랐습니다. 뭐 별로 어렵지도 않고요. 하지만, 이 기본 코드를 이용해서 뭔가 만들려고 한다면~ 괜찮은 품질의 소프트웨어를 얻을수는 없을겁니다. 정확도에서 월등히 뛰어난 YOLO 딥러닝을 많이 쓰기 때문입니다. 아무튼 재미로 한번 해보는건 괜찮는거 같네요.

     

    이 글이 도움이 되셨다면~ 커피 한잔이라도 후원 부탁드립니다^^

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.