본문 바로가기
[최대48만원] 인터넷•TV 가입시 설치당일 현금지급 정수기 렌탈시 최대50만원 추가지급
게임

화면 이미지인식 아두이노

by 백수아저씨 2025. 5. 5.
반응형

매크로 프로그램 다운로드

http://ngmsoftware.com/bbs/board.php?bo_table=product_review 

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

#매크로 #메크로 #매크로프로그램 #엔지엠소프트웨어 #오토핫키 #지존오토 #엔지엠에디터 #엔지엠플레이어 #비활성매크로 #하드웨어매크로 #기계식매크로 #마우스광클릭 #키보드매크로 #이미지서치 #이미지매치 #이미지맥스 #블로그 #카페 #인스타그램 #유튜브 #소셜네트워크 #카카오톡 #텔레그램 #자동화

 

안녕하세요. 업무 자동화 RPA 매크로 엔지엠소프트웨어입니다.

오늘은 아래 그림에서 사각형을 모두 찾아서 클릭하는 방법을 알아보도록 하겠습니다.

아래 이미지는 참고용 샘플 이미지입니다.

 

 

 

이미지를 찾기 위해 새로운 스크립트에 이미지 전체 매치 액션을 추가하세요.

 

 

 

이미지 캡쳐는 아래 그림과 같이 만들어야 합니다.

보기 편하게 확대시켜 놓은 이미지인데요. 여기서 중요한 부분은 이미지 전체 매치는 모양으로 찾는다는 점입니다.

그래서, 아래와 같이 내부의 사각형을 캡쳐하면 원하는 결과를 얻을 수 없습니다.

아래와 같이 사각형임을 인식할 수 있도록 바깥쪽 경계까지 캡쳐해야 합니다.

 

 

 

이미지 전체 매치에서 임계값을 500정도 주고 실행하면 사각형을 잘 찾게 됩니다.

※ 이미지를 어떻게 캡쳐 했느냐에 따라서 임계값과 찾아지는 사각형은 달라질 수 있습니다.

 

 

 

멀티 마우스 액션을 All로 변경하고 마우스 동작을 LeftClick으로 바꾸고 실행 해보세요.

모든 사각형을 찾아서 클릭하게 됩니다.

 

 

 

만약, 오른쪽 하단부터 클릭하게 하고 싶으면 정렬 방법을 Reverse로 변경 해보세요.

정렬은 다양한 방식을 제공합니다. 하나씩 바꿔가면서 실행해보면 차이를 알 수 있습니다.

 

 

 

찾은 이미지 목록을 확인해보면 중복되어 있는 좌표들이 보일겁니다.

 

 

 

이런 경우에는 중복을 제거해야 합니다.

유사 거리 제거에 사각형의 크기인 10을 입력하고 다시 실행 해보세요.

 

 

 

결과를 확인해보면 가까운 거리 즉, 중복해서 찾아진 항목들은 모두 사라진것을 확인할 수 있습니다.

이렇게 임계값과 유사 거리 제거를 통해서 실제로 클릭해야 할 좌석들만 추출할 수 있습니다.

하지만, 디테일하게 처리하려면 여러번 반복해서 테스트를 수행해서 자신의 환경에 맞는 값을 찾아야 합니다.

 

이제 특정 위치의 좌표만 추출하는 방법을 알아볼텐데요.

이 로직은 생각보다 복잡합니다. 일단, 사각형의 크기가 10인걸 알고 있으니 Y축의 값들을 10만큼씩 잘라서 배열화 해보세요.

그러면, 한줄씩 목록을 만들 수 있을겁니다. 이 부분의 로직을 정리하는게 어려울 수 있습니다.

 

글로 로직을 풀어보자면 좌표를 하나씩 가져와서 Y축의 값이 5보다 크면 다음 라인이라고 판단해야 할거 같습니다.

이렇게 하나씩 배열로 저장한 후 특정 행의 배열만 가져와서 왼쪽 또는 오른쪽부터 클릭하면 될거 같네요.

이 부분을 처리하는 방법은 배열 정렬을 이용해야 할거 같습니다.

핵심은 유사 거리로 중복되게 찾은 오브젝트들을 모두 제거해야 한다는 것입니다.

컴퓨터 환경에 따라 다르겠지만, 제 컴퓨터 기준으로 모든 사각형을 찾으려면 임계값을 1000으로 입력해야 했습니다.

임계값은 컴퓨터 모니터의 해상도에 따라서 값이 달라질 수 있습니다.

 

 

 

찾은 모든 좌석 사각형은 배열 형태로 사각형 영역을 가집니다.

사각형 영역은 위치와 크기로 이루어진 정보입니다.

 

변수에 저장된 배열을 문자열로 변환하기 위해 배열 변환 액션을 사용합니다.

구분자는 임의로 설정할 수 있지만, 이 예제와 동일하게 입력하세요.

 

 

 

이제 좌석을 의미하는 사각형의 위치를 배열로 가지고 있는것을 사용하기 쉽게 테이블 형태로 변환해야 합니다.

물론, 더 좋은 아이디어가 있을수도 있지만 제가 생각하기에는 쭉 나열되어 있는 배열보다 테이블 형태가 좋을듯 합니다.

 

단순 1차원 배열은 모든 좌표가 쭉 순서대로 있기 때문에 2차원 배열 형태로 처리하기가 쉽지 않습니다.

그래서, 테이블 구조를 가진 2차원 배열로 만들어야 하는데요.

이 로직을 액션으로 만들기가 어렵기 때문에 어쩔 수 없이 코드의 도움을 받아야 합니다.

 

C# 코드 실행 액션을 추가하고 아래와 같이 코드를 작성 하세요.

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;

public class NGMsoftware
{
    private int _rowSize = 1;

    public string Points()
    {
        var arrSource = "{point}"
                        .Replace("{", string.Empty)
                        .Replace("}", string.Empty)
                        .Replace("X=", string.Empty)
                        .Replace("Y=", string.Empty)
                        .Replace("Width=", string.Empty)
                        .Replace("Height=", string.Empty)
                        .Replace(" ", string.Empty)
                        .Split('^');

	    var arrRect = arrSource.Select(s => StringToRect(s));
	    List<List<Rectangle>> table = new List<List<Rectangle>>();
	    List<Rectangle> rects = null;
	    int beforeRowSize = 0;
	
		foreach (var rect in arrRect)
		{
			if (beforeRowSize == 0)
			{
				beforeRowSize = rect.Y;
				rects = new List<Rectangle>();
			}

			if (rect.Y - beforeRowSize > _rowSize)
			{
				table.Add(rects);
				beforeRowSize = rect.Y;
				rects = new List<Rectangle>();
				rects.Add(rect);
			}
			else
			{
				rects.Add(rect);
			}
		}

        table.Add(rects);

		string result = string.Empty;

        foreach (var rs in table)
		{
			result += string.Join("@", rs.Select(s => RectToPoint(s)));
			result += Environment.NewLine;
		}

		return result;
    }

    public Rectangle StringToRect(string str)
    {
		var ls = str.Split(',');
		return new Rectangle(int.Parse(ls[0]), int.Parse(ls[1]), int.Parse(ls[2]), int.Parse(ls[3]));
    }

    public string RectToPoint(Rectangle rect)
    {
		int w = rect.Width / 2;
		int h = rect.Height / 2;
		return (w + rect.X).ToString() + "," + (h + rect.Y).ToString();
    }
}

 

코드는 나열되어 들어오는 사각형 자료형을 사용하기 쉽게 먼저 가공합니다.

Replace를 이용해서 불필요한 텍스트는 모두 제거했습니다.

코딩을 배우는건 아니라서 대략적인 내용만 보고 넘어가시는게 좋을듯 합니다.

만약, C# 코딩에 대해 궁금하신게 있거나 배워보고 싶으면 아래 C# 코딩 강좌를 참고하세요.

[ C# 코딩 기초 강좌 ]

 

매크로를 실행하고 결과를 확인 해보세요.

아래는 테이블 형태로 변환된 좌표를 뽑아서 메모장에 넣어본 화면입니다.

메모장에 들어간 내용을 위의 좌석과 비교해보면 비슷한 모양을 하고 있다는걸 알 수 있습니다.

 

 

 

여기서 몇번째 행에서 좌측 또는 우측에서 몇개만 추출하도록 코드를 수정해볼께요.

아래와 같이 테이블을 모두 조인시켜주는 곳에서 6번째 행에서 왼쪽 5개를 가져오도록 수정했습니다.

	string result = string.Empty;

	var rows = table[5];
	var cells = rows.Take(5).ToList();
	result = string.Join("@", cells.Select(s => RectToPoint(s)));
	return result;
    }

    public Rectangle StringToRect(string str)
    {
	var ls = str.Split(',');
	return new Rectangle(int.Parse(ls[0]), int.Parse(ls[1]), int.Parse(ls[2]), int.Parse(ls[3]));
    }

    public string RectToPoint(Rectangle rect)
    {
	int w = rect.Width / 2;
	int h = rect.Height / 2;
	return (w + rect.X).ToString() + "," + (h + rect.Y).ToString();
    }
}

 

매크로를 다시 실행하고 결과를 확인해보면 아래와 같이 결과가 만들어집니다.

 

 

 

변수를 하나 더 추가하고, point 변수에 저장되어 있는 텍스트로 된 좌표 목록을 @ 키워드로 분리해서 배열화합니다.

그리고, 다시 point 변수에 덮어쓰기 해줍니다.

 

 

 

Foreach 반복 액션을 사용해서 배열을 순차적으로 반복시킵니다.

여기까지 완료한 후 첨부되어 있는 스크립트를 열어서 테스트 해보세요.

https://youtu.be/HXqDd8cpBgI

 

 

[ 각종 자동화 매크로 및 RPA 프로그램 제작 해드립니다. ]

[ 초보자도 쉽게 따라할 수 있는 기초 학습 강좌 보기 ]

 

원본 글 보기

http://ngmsoftware.com/bbs/board.php?bo_table=tip_and_tech 

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

 

반응형

'게임' 카테고리의 다른 글

네이버시리즈 텍스트 추출  (3) 2025.05.05
선착순 접속 매크로  (0) 2025.05.05
여러브라우저 반복작업  (5) 2025.05.04
android 매크로  (1) 2025.05.03
채팅 매크로  (3) 2025.04.20

댓글