NGMsoftware

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

    학습


    C# C# .NET Core 매크로 프로그램 만들기. (이미지 서치)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘은 이미지 서치에 대해 알아보도록 하겠습니다. 우선 테스트용도로 단순하게 만들건데요. 일반적으로 이미지 서치는 OpenCV를 이용해서 만듭니다. 엔지엠 매크로는 이미지 서치와 이미지 매치로 구분되어 있습니다. 이미지 서치는 픽셀 데이타를 분석해서 비교하는 방식이고, 이미지 매치는 OpenCV의 MatchTemplate을 사용합니다.

     

    우선, 이미지 매치 액션을 하나 만들께요. Condition(조건) 폴더에 BaseModel, ImageModel, ImageMatchModel 3개를 추가 했습니다.

    vy5Ci2W.png

     

     

    BaseModel은 조건의 추상 클래스입니다. 그래서, 조건 분기에 필요한 참과 거짓을 포함하면 될거 같습니다. 이미지 매치를 테스트하기 위한 용도라서 아직 속성을 만들진 않았습니다. 구조만 잡아놓고, 나중에 True, False에 대한 속성들을 추가할께요.

    namespace Ai.Model.Action.Condition
    {
        [Serializable]
        public abstract class BaseModel : ActionModel
        {
            public override void Excute()
            {
                
            }
        }
    }

     

    이미지 모델은 찾을 이미지를 선택할 수 있는 속성만 하나 만들었습니다.

    namespace Ai.Model.Action.Condition
    {
        [Serializable]
        public class ImageModel : BaseModel
        {
            [Category("Action")]
            [LocalizedDisplayName("ImageFile")]
            [LocalizedDescription("ImageFile")]
            [Browsable(true)]
            [DefaultValue(null)]
            [Editor(typeof(TypeEditor.OpenFileSelectorEditor), typeof(UITypeEditor))]
            public string? ImageFile { get; set; }
    
            public override void Excute()
            {
                base.Excute();
            }
        }
    }

     

    엔지엠 매크로에서 찾고 싶은 이미지는 Source로 명명하고, Source를 찾을 대상 이미지를 Target이라고 부릅니다. 다시 말해서 대상 이미지안에 소스 이미지가 있는지를 판단하는겁니다. 그리고, 대상 이미지에서 소스 이미지의 위치도 같이 알 수 있으면 좋겠네요.

     

    마지막으로 이미지 매치 모델은 구현 클래스이기 때문에 OpenCV의 템플릿매칭을 코딩해야 합니다.

    namespace Ai.Model.Action.Condition
    {
        [Serializable]
        public class ImageMatchModel : ImageModel
        {
            public override void Excute()
            {
                base.Excute();
    
                if (!string.IsNullOrEmpty(ImageFile))
                {
                    Image source = Image.FromFile(ImageFile);
                    Image? target = Ai.Common.Screen.Capture();
    
                    if (target != null)
                        MessageBox.Show(Ai.Common.ConditionImage.IsMatch(source, target).ToString());
                }
            }
        }
    }

     

    Ai.Common.Screen.Capture 메소드는 윈도우 화면을 캡쳐하는 Helper 클래스입니다. 코드는 아래와 같이 단순합니다. 윈도우 화면 크기만큼 복사한 후 넘겨주면 됩니다.

            public static Image? GetActiveImage()
            {
                using (Bitmap bitmap = new Bitmap((int)System.Windows.SystemParameters.FullPrimaryScreenWidth, (int)System.Windows.SystemParameters.FullPrimaryScreenHeight))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        try
                        {
                            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bitmap.Size);
                            return (Image)bitmap.Clone();
                        }
                        catch (Exception ex)
                        {
                            
                        }
                    }
                }
    
                return null;
            }

     

    닷넷에서 OpenCV를 래핑한 패키지가 크게 2종류가 있습니다. OpenCvSharp와 emgu.CV인데요. 둘다 활발하게 개발이 되고 있고 앞으로도 계속 서비스할거 같아요. 둘중에 뭐가 좋다라고 말할수는 없지만, 저는 OpenCvSharp으로 개발했기 때문에 코드 재사용을 위해 이번에도 OpenCvSharp을 사용했습니다. 비주얼 스튜디오 패키지 관리자에서 OpenCvSharp을 검색해서 프로젝트에 설치하세요.

    WxAvUh0.png

     

     

    래퍼 패키지만 있다고 해서 템플릿 매칭을 사용할 수 있는건 아닙니다. OpenCvSharp Github에서 네이티브 라이브러리를 다운로드 받아서 프로젝트에 추가해야 합니다.

    eomSc2l.png

     

     

    위 이미지에서 릴리즈를 클릭하면 아래와 같이 네이티브 라이브러리를 다운로드 받을 수 있습니다.

    1ZewGqr.png

     

     

    압축을 풀고, OpenCvSharpExtern.dll을 프로젝트에 추가하세요. 그리고, 빌드시 자동 배포될 수 있도록 라이브러리 속성을 아래와 같이 설정해줍니다.

    UYwN9cO.png

     

     

    이제 이미지를 잘 찾는지 테스트 해볼까요? 그림판에 아래와 같이 찾을 이미지를 그려놓고 따로 저장을 해주세요.

    asAN1qD.png

     

     

    찾을 이미지는 아래와 같이 캡쳐 해두었습니다.

    bvBEUtS.png

     

     

    이제 에디터에서 새 스크립트를 추가하고, 이미지 매치 액션에서 찾을 이미지를 선택하세요.

    yG1H6A7.png

     

     

    매크로를 실행하면 아래 동영상처럼 골뱅이 이미지가 있으면 True를 표시하고, 없으면 False를 표시합니다. 이렇게해서 윈도우 화면을 인식해서 이미지 서치하는 방법을 알아봤습니다. 여기에 찾은 이미지의 위치를 알아내서 마우스 클릭 동작까지 만들면 매크로 프로그램이 갖춰야할 대부분의 기능을 만든거라고 할 수 있습니다. 물론, 더 복잡한 업무를 처리하기 위해서는 많은 함수가 필요합니다. 차차 하나씩 추가해야겠네요^^

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.