디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[일반] 3d mmorpg 몹인식 어떻게 함?모바일에서 작성

ㅇㅇ(211.234) 2024.08.16 16:30:00
조회 808 추천 0 댓글 0
														


import cv2 as cv

import numpy as np

import pyautogui

import time

import logging

import glob
# 로깅 설정

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 스킬 키 설정

skills = ['f3', 'f4', 'f5', 'f6', 'f7']
# 배경 차이 인식을 위한 MOG2 배경 제거 객체 생성

bg_subtractor = cv.createBackgroundSubtractorMOG2(history=500, varThreshold=25, detectShadows=False)
# SIFT 객체 생성

sift = cv.SIFT_create()
# 템플릿 이미지 로드 및 특징점 계산

monster_template_paths = glob.glob('monster*.png') + glob.glob('monster*.PNG')

monster_templates = []

for template_path in monster_template_paths:

    img = cv.imread(template_path, 0)

    if img is not None:

        kp, des = sift.detectAndCompute(img, None)

        monster_templates.append({'keypoints': kp, 'deors': des, 'template': img})

if not monster_templates:

    logging.error('No monster template images found. Make sure the file paths are correct.')

else:

    logging.info(f'{len(monster_templates)} Monster template images loaded successfully.')
# Kalman Filter 초기화

kalman = cv.KalmanFilter(4, 2)

kalman.measurementMatrix = np.eye(2, 4, dtype=np.float32)

kalman.transitionMatrix = np.eye(4, 4, dtype=np.float32)

kalman.processNoiseCov = np.eye(4, 4, dtype=np.float32) * 0.03
# Optical Flow 추적을 위한 초기 설정

lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))
# 스크린샷 캡처 영역 설정

capture_region = (47, 205, 1210 - 47, 880 - 205)  # 좌측 상단 x,y, 폭, 높이
def match_template(img, templates, threshold=0.7):

    points = []

    for template_config in templates:

        kp1 = template_config['keypoints']

        des1 = template_config['deors']

        kp2, des2 = sift.detectAndCompute(img, None)

        if des2 is not None:

            bf = cv.BFMatcher()

            matches = bf.knnMatch(des1, des2, k=2)

            good = [m for m, n in matches if m.distance < 0.75 * n.distance]

            if len(good) >= threshold * len(kp1):

                src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 2)

                dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 2)

                M, _ = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0)

                if M is not None:

                    h, w = template_config['template'].shape

                    pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)

                    dst = cv.perspectiveTransform(pts, M)

                    center_x = int(np.mean(dst[:, 0, 0]))

                    center_y = int(np.mean(dst[:, 0, 1]))

                    points.append((center_x, center_y))

    return points
def detect_monster(img):

    """템플릿 기반 몬스터 탐지"""

    matching_points = match_template(img, monster_templates, threshold=0.7)

    if matching_points:

        return matching_points[0]  # 몬스터의 중심 좌표 반환

    return None  # 몬스터가 없으면 None 반환
def apply_morphology(mask):

    """모폴로지 연산을 통해 노이즈 제거 및 객체를 더욱 명확하게 추출"""

    kernel = np.ones((5, 5), np.uint8)

    mask = cv.morphologyEx(mask, cv.MORPH_CLOSE, kernel)

    mask = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)

    return mask
def track_monster(prev_img, current_img, prev_points):

    """Optical Flow로 몬스터를 추적"""

    prev_gray = cv.cvtColor(prev_img, cv.COLOR_BGR2GRAY)

    curr_gray = cv.cvtColor(current_img, cv.COLOR_BGR2GRAY)

    

    new_points, status, _ = cv.calcOpticalFlowPyrLK(prev_gray, curr_gray, np.float32(prev_points).reshape(-1, 1, 2), None, **lk_params)

    tracked_points = [tuple(pt.ravel()) for pt, s in zip(new_points, status) if s]

    return tracked_points
def predict_monster_position(kalman, current_pos):

    """Kalman Filter로 몬스터의 위치를 예측"""

    kalman.correct(np.array([[np.float32(current_pos[0])], [np.float32(current_pos[1])]]))

    prediction = kalman.predict()

    predicted_pos = (int(prediction[0]), int(prediction[1]))

    return predicted_pos
def use_potions(img):

    """체력 및 마나 포션 사용 로직"""

    health_bar = img[94:97, 180:208]  # 체력바 위치

    mana_bar = img[112:113, 180:208]  # 마나바 위치
    health_red = cv.inRange(health_bar, np.array([0, 0, 120]), np.array([50, 50, 255]))

    mana_color = cv.inRange(mana_bar, np.array([120, 0, 0]), np.array([255, 255, 50]))  # 파란색 또는 초록색
    if health_red.sum() == 0:  # 빨간색이 없는 경우 체력 포션 사용

        pyautogui.press('1')

        logging.info('Used health potion')

    

    if mana_color.sum() == 0:  # 파란색 또는 초록색이 없는 경우 마나 포션 사용

        pyautogui.press('2')

        logging.info('Used mana potion')
def main():

    last_click_time = 0

    click_interval = 0.5  # 주기를 0.5초로 줄여서 반응 속도를 높임

    prev_img = None

    prev_points = []

    

    while True:

        try:

            current_time = time.time()

            if current_time - last_click_time >= click_interval:

                img = np.array(pyautogui.screenshot(region=capture_region))

                

                # 배경 차이 계산

                fg_mask = bg_subtractor.apply(img)

                fg_mask = apply_morphology(fg_mask)  # 노이즈 감소

                

                movement_detected = cv.countNonZero(fg_mask) > 5000  # 움직임이 일정 픽셀 이상이면 참으로 설정
                if movement_detected:

                    if prev_img is not None:

                        prev_points = track_monster(prev_img, img, prev_points)

                    monster_pos = detect_monster(img)

                    if monster_pos:

                        predicted_pos = predict_monster_position(kalman, monster_pos)

                        pyautogui.moveTo(predicted_pos, duration=0.05)  # 예측된 위치로 마우스를 이동

                        pyautogui.click(button='right')

                        logging.info(f'Clicked on monster at {predicted_pos}')

                    use_potions(img)

                    prev_img = img.copy()  # 이전 이미지 갱신

                

                last_click_time = current_time

            

            time.sleep(0.05)  # 루프 주기를 줄여 빠른 반응 속도 유지

        

        except KeyboardInterrupt:

            print(" interrupted by user")

            break

        except Exception as e:

            logging.error(f"Error in main loop: {e}")
if __name__ == '__main__':

    main()


다른부분보다 몬스터인식 방법 공유좀 해주라. 몬스터 인식했다는데 허공에누른고 난리남... 게다가 템플릿 방식은 움직이는 객체 인식못한다지만 너무 심하네... 그래서 몬스터 위에 가져다 대면 검으로 변하는 특성 이용하려고 캐릭좌표잡고 뱅글뱅글 돌다가 검으로 변하면 클릭하게 만들었는데 그마져도 인식률이 바닥임... 치트엔진 자체로 제대로 작동을 안하는거냐?아니면 걍 내코드가 잘못된거냐?

7ced8076b58269f737e898bf06d60403e3231087bab68da5ed87

추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
- 설문 2025년 가장 기억에 남는 인터넷 이슈는? 운영자 25/12/22 - -
- AD 집에서 즐기는 Fresh 미식회 운영자 25/12/22 - -
2580 일반 욜로yolo 객체학습 이후에 질문이 있습니다. [1] ㅇㅇ(117.52) 24.10.05 316 0
2579 일반 파이썬 초보 책추천 [20] 쪼물갤로그로 이동합니다. 24.10.05 6918 0
2577 일반 파린이 도와주세요 ㅠㅠ [2] ㅇㅇ(106.102) 24.10.03 299 0
2576 일반 ai로 댓글 다는거 [2] ㅇㅇ(220.95) 24.09.30 314 0
2575 일반 형님들 파이선 입문을 어떻게해야 좋을까요? [4] ㅇㅇ(106.101) 24.09.26 409 0
2574 일반 질문)본인:쌩초보, 나도코딩 따라 중, 목표는 객체인식, 적용은 시골축사 [12] ㅇㅇ(211.117) 24.09.25 506 0
2572 일반 fastapi 만든사람 콜롬비아 출신 고졸임 [1] ㅇㅇ갤로그로 이동합니다. 24.09.15 349 1
2570 🔎질문 도와주세요 파이참 실행이 아예 안되요 ㅠㅠ... [2] ㅇㅇ(211.252) 24.09.02 312 0
2569 일반 pygbag 아시는 분 ㅇㅇ(183.109) 24.08.20 231 0
일반 3d mmorpg 몹인식 어떻게 함? ㅇㅇ(211.234) 24.08.16 808 0
2566 일반 안녕, 파이썬에 매력을 느끼고 배우러 온 파린이야 [2] ㅇㅇ(39.118) 24.08.09 340 1
2564 일반 css 도움을 받을 수 있을까요?? [7] 하얀설표(118.235) 24.07.26 338 0
2563 🔎질문 이거 무슨 패키지냐? ㅇㅇ(104.28) 24.07.21 244 0
2562 일반 파이참에 오픈프로젝트 하면 기본적으로 venv 가 설정되는 거 맞죠? [2] ㅇㅇ(121.175) 24.07.21 294 0
2560 📚정보 파이썬으로 웹크롤링 하는 꿀팁 공유 고도전도사갤로그로 이동합니다. 24.07.19 1398 0
2559 일반 pyautogui.locateAllOnScreen 듀얼모니터 ㅇㅇ(124.111) 24.07.18 364 0
2558 📚정보 파이썬으로 페이지네이션 간단 구현 공유 고도전도사갤로그로 이동합니다. 24.07.18 219 1
2556 일반 크롤링, 엑셀자동화 무료로 도와드립니다. [3] ㅇㅇ(220.123) 24.07.04 350 0
2555 일반 Oracle Free Tier를 활용한 application 개발(취미) [2] ㅇㅇ(112.147) 24.07.04 236 1
2554 일반 웹개발 프로그래밍 질문 ㅇㅇ(112.152) 24.07.03 168 0
2552 일반 31살여자고 JAVA언어쪽으로 취업을 하고싶은데 이나이에 괜찮을까요 ㅠㅠ [3] ㅇㅇ(112.152) 24.07.02 355 0
2551 일반 파이썬으로 카카오톡 친구추가 [1] ㅇㅇ(220.84) 24.07.01 260 0
2550 일반 오류 메세지엔 답이 있다,, [2] 채채갤로그로 이동합니다. 24.06.28 275 2
2549 일반 웹개발 30대 신입 [3] ㅇㅇ(1.238) 24.06.28 437 0
2548 🔎질문 클랭 17.0.6 이게 무슨말임? [1] ㅇㅇ(14.5) 24.06.27 194 0
2547 🔎질문 입문으로 파이썬 괜찮음? [2] ㅇㅇ(203.241) 24.06.26 399 0
2545 🔎질문 미칠것 같아요 알려주세요. 회문을 점검하는 코드 작성중 [3] ㅇㅇ(182.222) 24.06.23 248 0
2544 일반 유튜브 댓글 쇼츠 크롤링 도와줘 [2] ㅇㅇ(58.76) 24.06.23 833 0
2542 일반 python 고수님 도와주십셔... [2] ㅇㅇ(222.107) 24.06.18 247 0
2541 🔎질문 맷플로립 질문 [4] ㅇㅇ(218.147) 24.06.17 181 0
2540 🔎질문 챗gpt+셀레니움? 이용중 막힘 [1] ㅇㅇ(112.165) 24.06.15 331 1
2539 일반 최근에 웹개발 공부 시작했습니다.. [3] ㅁㅁ(211.234) 24.06.13 1047 0
2538 일반 파이썬에서 셀레늄으로 네이버 카페 수집시 ip우회방법 있나요.. [1] ㅇㅇ(172.226) 24.06.11 220 0
2534 🔎질문 파이썬 초보 이거 설명좀 해줄사람 계신가요 ㅠㅠ독학이라 [6] ㅇㅇ(106.101) 24.05.30 304 0
2532 🔎질문 렘 메모리 누수에 대해서 아는 게이 있노 [2] ㅇㅇ(115.23) 24.05.25 179 0
2530 🔎질문 EXE 만들때 질문ㄴE 로 만들었는데 [2] 리우(121.133) 24.05.23 112 0
2529 🔎질문 파이썬 캐리지 리턴 질문! [9] Lok0348(121.133) 24.05.21 184 0
2528 🔎질문 파이썬 윈도우 인스톨러 오류… [3] ㅇㅇ(106.101) 24.05.21 112 0
2526 🔎질문 형님들 도와주십쇼 [1] ㅇㅇ(39.127) 24.05.18 112 0
2525 🔎질문 matplotlib 다운해서 과제좀 하려는데 시작부터 막혀요.. 도와주요 [2] ㅇㅇ(218.48) 24.05.13 239 0
2524 🔎질문 파이썬 멀티쓰레드 질문. [3] ㅇㅇ(59.19) 24.05.07 160 0
2523 🔎질문 도와주세요 [3] ㅇㅇ(119.82) 24.05.01 174 0
2521 🔎질문 작동 되던게 갑자기 안되는 경우? [4] ㅇㅇ(119.207) 24.04.26 122 0
2520 🔎질문 과제인데 해결책 던져주실분 [5] ㅇㅇ(211.243) 24.04.25 146 0
2519 🔎질문 질문 하나만 해도 되겠습니까 [3] ㅇㅇ(1.227) 24.04.25 123 0
2518 🔎질문 오류가 이렇게 나는데 혹시 해결방법 있을까요 ㅇㅇ(222.112) 24.04.24 309 0
2515 🔎질문 형들 질문좀 [3] ㅇㅇ(220.77) 24.04.22 153 0
2513 🔎질문 auto gpt 사용하려하는데 [1] ㅇㅇ(14.7) 24.04.20 217 0
2511 🔎질문 파이썬 pyinstall 질문 [1] ㅇㅇ(121.171) 24.04.18 186 0
2509 🔎질문 selenium으로 이런 것도 가능할까요? [11] ㅇㅇ(122.40) 24.04.10 397 1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2