반응형

매크로 프로그램을 만들려면 우선 게임화면을 캡쳐하고, 캡쳐한 이미지를 처리해서 몹의 좌표를 확인하는 작업이 필요하다. 우선은 화면 캡쳐 이후 출력 (나중에 분석된 이미지를 확인하려면 필요하니까) 하는 방법을 알아본다.

1. 게임화면 캡쳐: C# 자체 함수 이용 (편하다)

2. 캡쳐한 이미지 처리로 좌표 추출: OpenCV 이용 (빠르다, 편하다), C#에선 OpenCvSharp4라는 모듈을 이용한다.

--

1. 게임화면 캡쳐

C#에는 CopyFromScreen 이라는 매우 유용한 함수가 있다. 
이 함수를 사용하려면 using System.Drawing 네임스페이스를 추가해주면 끝. user32.dll 의 복잡한 단계를 거칠 필요도 없이 bitmap으로 바로 캡쳐해준다.

Bitmap bmp = new Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics gr = Graphics.FromImage(bmp);

gr.CopyFromScreen(0, 0, 0, 0, bmp.Size); //캡쳐

bmp.Save("test.png", ImageFormat.Png); // "test.png"로 파일 저장

 

2. 출력

이미지를 창으로 출력하는 방법은 여러가지가 있겠지만 여기서는 OpenCV를 이용할 것이다. 모듈 용량이 크긴 하지만, 이미지 처리 하느라 어차피 추가해야 할 라이브러리므로. 우선 Nuget에서 OpenCvSharp4를 설치한다. 4.5.0 최신버전 사용.

이후 extern 파일을 참조 추가해준다.

화면을 연속적으로 캡쳐하려면 loop을 돌려야 하고, 리소스 부담을 덜기 위해 중간중간 쿨타임을 넣어준다. sleep을 안넣어주면 리소스 사용량이 폭주하는 것을 볼 수 있다. 이후 출력하면 잘 됨.

        private void Btn_StartImageAnal_Click(object sender, RoutedEventArgs e)
        {


            Task<int> task = GetVision(macroStatus[0].vision);


        }

        
        private static async Task<int> GetVision(Mat img)
        {
            Bitmap bmp = new Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics gr = Graphics.FromImage(bmp);
            for (; ; )
            {
                gr.CopyFromScreen(0, 0, 0, 0, bmp.Size);
                //bmp.Save("test.png", ImageFormat.Png);
                img = OpenCvSharp.Extensions.BitmapConverter.ToMat(bmp);

                Cv2.ImShow("test", img);

                if (Cv2.WaitKey(25) == 'q')  //opencv에선 화면 invalidate와 같은 기능
                {
                    Cv2.DestroyAllWindows();


                }

                Thread.Sleep(10);
            }
            return 0;
        }
728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기