선착순 접속 매크로 | 야구장 좌석 사각형 테이블 만들기
✅ 사각형 영역 자동 감지 - 1부 내용 요약
먼저, 1부 내용을 참고하여 전체 사각형 영역을 이미지 상에서 자동으로 감지합니다.
- 이때 핵심은 "유사 거리로 중복된 오브젝트 제거"입니다.
- 컴퓨터 해상도에 따라 임계값(threshold) 설정이 달라질 수 있으므로, 본인의 환경에 맞게 조정하세요.
- 예: Full HD 해상도 기준으로 1000 권장
감지된 사각형들은 위치(X, Y) + 크기(Width, Height) 형태의 배열로 저장됩니다.
[ 1부 내용 보기 ]
1부에서 테스트로 만든 스크립트를 열어보면 아래와 같이 구성되어 있을겁니다.
핵심은 유사 거리로 중복되게 찾은 오브젝트들을 모두 제거해야 한다는 것입니다.
컴퓨터 환경에 따라 다르겠지만, 제 컴퓨터 기준으로 모든 사각형을 찾으려면 임계값을 1000으로 입력해야 했습니다.
임계값은 컴퓨터 모니터의 해상도에 따라서 값이 달라질 수 있습니다.
🛠 배열 → 문자열 변환 후 테이블 구조화
찾은 모든 좌석 사각형은 배열 형태로 사각형 영역을 가집니다.
사각형 영역은 위치와 크기로 이루어진 정보입니다.
변수에 저장된 배열을 문자열로 변환하기 위해 배열 변환 액션을 사용합니다.
구분자는 임의로 설정할 수 있지만, 이 예제와 동일하게 입력하세요.
이제 좌석을 의미하는 사각형의 위치를 배열로 가지고 있는것을 사용하기 쉽게 테이블 형태로 변환해야 합니다.
물론, 더 좋은 아이디어가 있을수도 있지만 제가 생각하기에는 쭉 나열되어 있는 배열보다 테이블 형태가 좋을듯 합니다.
단순 1차원 배열은 모든 좌표가 쭉 순서대로 있기 때문에 2차원 배열 형태로 처리하기가 쉽지 않습니다.
그래서, 테이블 구조를 가진 2차원 배열로 만들어야 하는데요.
이 로직을 액션으로 만들기가 어렵기 때문에 어쩔 수 없이 코드의 도움을 받아야 합니다.
✅ 배열 문자열 변환 액션 사용
- 구분자: ^
- 목적: 가공된 문자열을 코드에서 활용 가능하도록 처리
✅ C# 코드로 테이블 구성
복잡한 2차원 테이블은 코드의 도움을 받아 정리합니다. NGM 매크로 에디터의 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)
- @ 구분자로 문자열을 분할하여 배열로 만듭니다.
- Foreach 반복 액션으로 순차 처리합니다.
- 스크립트 실행 후 실제 좌표를 활용한 자동화 작업이 가능합니다.
[ 각종 자동화 매크로 및 RPA 프로그램 제작 해드립니다. ]
[ 초보자도 쉽게 따라할 수 있는 기초 학습 강좌 보기 ]
📌 주요 키워드 요약
#RPA자동화 #NGM소프트웨어 #C샵스크립트 #좌표추출매크로 #자동화테스트도구
#스크린분석 #이미지감지 #테이블변환매크로 #좌석선택자동화 #웹크롤링
필요하신 분은 첨부된 스크립트를 다운로드 받아 직접 테스트해보세요.
반복적인 수작업을 자동화하는 데 이보다 쉬운 방법은 없습니다!
자동화 매크로 제작, 커스터마이징, 컨설팅 문의: http://ngmsoftware.com