重啟撲克機器人之路:從Python開始的新嘗試

更新於 發佈於 閱讀時間約 11 分鐘

今天開始了新的撲克機器人Project,這次選擇用Python而不是OpenHoldem的C++。其實挺有趣的,以前總覺得要寫機器人是件很困難的事,但現在連我這種程式小白都能靠著插件和LLM寫出基本的框架,這讓我開始思考是不是能把機器學習也加進來。

目前用ADB和OpenCV來處理手機截圖和畫面識別,雖然都還很陽春,但至少驗證了可行性。不過下一步的撲克牌辨識就讓我陷入了思考 - 單純用OpenCV的template matching感覺太過脆弱,平台改版或換平台就得重來。想起之前上fast.ai課程時學過的圖像辨識,或許能用那個方向來處理卡牌識別。

策略核心這塊還在想該怎麼處理。之前的經驗告訴我,直接套用solver策略行不通,自己寫死的腳本又太容易被識破是機器人。這讓我意識到可能需要更靈活的方式,但目前還沒有明確的想法。決定先專注在最基礎的部分 - 確保程式能穩定連接到poker app並正確辨識桌面狀況。

想起之前做Pio bot和Spin bot的經驗,我更清楚知道這次要怎麼規劃開發流程。就像之前寫過的,初期投入成本要控制,要隨時準備接受feedback並調整方向。這次選擇Python作為開發語言,某種程度上也是降低入門門檻的選擇,讓我能更專注在核心邏輯而不是語言本身的學習上。

我用來截取template的code:

import cv2

import numpy as np

from ppadb.client import Client as AdbClient

import os



class CardTemplateCapture:

def __init__(self):

# Create output directory if it doesn't exist

self.output_dir = 'card_templates'

if not os.path.exists(self.output_dir):

os.makedirs(self.output_dir)

# Initialize ADB connection

self.adb = AdbClient(host="127.0.0.1", port=5037)

self.devices = self.adb.devices()

if not self.devices:

raise Exception("No devices found. Make sure your emulator is running.")

self.device = self.devices[0]

# Initialize variables for region selection

self.start_point = None

self.end_point = None

self.drawing = False

self.current_image = None

self.original_image = None

self.template_count = 0

# Set target display height (adjust this based on your screen)

self.target_height = 1200

def take_screenshot(self):

"""Take a screenshot and return both original and resized versions."""

screenshot_data = self.device.screencap()

nparr = np.frombuffer(screenshot_data, np.uint8)

self.original_image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

# Calculate scaling factor to fit screen height

scale = self.target_height / self.original_image.shape[0]

new_width = int(self.original_image.shape[1] * scale)

# Resize image for display

self.current_image = cv2.resize(self.original_image, (new_width, self.target_height))

return self.current_image.copy()

def get_scale_factor(self):

"""Calculate the scale factor between original and display images."""

return self.original_image.shape[0] / self.current_image.shape[0]

def mouse_callback(self, event, x, y, flags, param):

"""Handle mouse events for selecting regions."""

if event == cv2.EVENT_LBUTTONDOWN:

self.drawing = True

self.start_point = (x, y)

elif event == cv2.EVENT_MOUSEMOVE and self.drawing:

temp_img = self.current_image.copy()

cv2.rectangle(temp_img, self.start_point, (x, y), (0, 255, 0), 2)

cv2.imshow('Capture Cards', temp_img)

elif event == cv2.EVENT_LBUTTONUP:

self.drawing = False

self.end_point = (x, y)

# Calculate rectangle coordinates on display image

x1 = min(self.start_point[0], self.end_point[0])

y1 = min(self.start_point[1], self.end_point[1])

x2 = max(self.start_point[0], self.end_point[0])

y2 = max(self.start_point[1], self.end_point[1])

# Scale coordinates to original image size

scale = self.get_scale_factor()

orig_x1 = int(x1 * scale)

orig_y1 = int(y1 * scale)

orig_x2 = int(x2 * scale)

orig_y2 = int(y2 * scale)

# Extract and save the selected region from original image

if (orig_x2 - orig_x1) > 0 and (orig_y2 - orig_y1) > 0:

card = self.original_image[orig_y1:orig_y2, orig_x1:orig_x2]

filename = os.path.join(self.output_dir, f'card_{self.template_count}.png')

cv2.imwrite(filename, card)

print(f"Saved {filename}")

self.template_count += 1

def capture_templates(self):

"""Main loop for capturing templates."""

print("Instructions:")

print("1. Click and drag to select card regions")

print("2. Press 'r' to refresh screenshot")

print("3. Press 'q' to quit")

# Create window with scrollbars

cv2.namedWindow('Capture Cards', cv2.WINDOW_NORMAL)

cv2.resizeWindow('Capture Cards', 800, 1200) # Set initial window size

cv2.setMouseCallback('Capture Cards', self.mouse_callback)

# Initial screenshot

screen = self.take_screenshot()

cv2.imshow('Capture Cards', screen)

while True:

key = cv2.waitKey(50) & 0xFF

if key == ord('q'):

break

elif key == ord('r'):

print("Refreshing screenshot...")

screen = self.take_screenshot()

cv2.imshow('Capture Cards', screen)

cv2.destroyAllWindows()



def main():

try:

capturer = CardTemplateCapture()

capturer.capture_templates()

except Exception as e:

print(f"Error: {e}")



if __name__ == "__main__":

main()
avatar-img
1會員
8內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
最近把Chatgpt 當成個人助理使用,好像常要用到 #Python? 資訊人出身,應該很簡單? 之前想辦法拜託好朋友找人教我一小時,知道概念,然後我還是不會操作。
Thumbnail
程式設計與技術能力 在現代社會中的重要性越來越明顯,尤其是在人工智能(AI)和自動化技術迅速發展的背景下。理解編程語言,如Python、R等,以及熟悉相關技術架構和工具,能夠幫助個人在這樣的環境中更好地工作。這種能力不僅對技術專業人士至關重要,也對非技術領域的人士日益重要,因為基礎的程式設計知識已
Thumbnail
用 AI 製作一張專屬巴黎奧運的紀念海報吧~
Thumbnail
透過玩桌遊的方式學習AI生成圖像技巧,在充滿樂趣的活動中,學會如何操作工具及生成圖像技巧。這款遊戲預計下個月將開設實體課程,適合所有對AI有興趣的人、AI繪圖新手及藝術愛好者。
Thumbnail
AlphaGo 的開發,讓人工智慧在圍棋的研究讓更多人被看到,也看到它成熟的結果。現代的圍棋教學和棋手訓練,也或多或少會借鏡各類的AI系統做學習。然而,教學的歷程,過度追求AI的棋步和棋法,有時會讓小朋友難以理解。一步登天的方式,有時反而會讓同學走得更坎坷。
Thumbnail
最新的AI趨勢讓人眼花撩亂,不知要如何開始學習?本文介紹了作者對AI的使用和體驗,以及各類AI工具以及推薦的選擇。最後強調了AI是一個很好用的工具,可以幫助人們節省時間並提高效率。鼓勵人們保持好奇心,不停止學習,並提出了對健康生活和開心生活的祝福。
在人工智能的發展歷程中,早期的研究主要側重於將解決問題的規則輸入計算機,試圖通過啟蒙運動理性的思路模擬人類的智能行為。然而,這條路逐漸變得艱難,因為規則過於繁多,無法應對複雜的情境和語境。在這個背景下,一些科學家轉向了神經網絡算法,試圖模擬人腦的感知能力。
機器學習是什麼? 簡單來說,機器學習就是訓練機器尋找Function的一段過程,而這個Function可以幫助我們解決我們遇到的問題,或是幫助我們
Thumbnail
近年來,隨著人工智慧技術的快速發展,Python結合生成式AI正逐漸成為行銷領域的重要利器。對於行銷專業人士來說,這股趨勢更是值得關注和深入研究。 Python和AI將會為行銷領域帶來什麼改變?
Thumbnail
大家最近從AI AlphaGo打敗棋王, 開始陸續新聞一直報導, 到最近不管是AI繪圖,AI Chatgpt,AI coplit...
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
最近把Chatgpt 當成個人助理使用,好像常要用到 #Python? 資訊人出身,應該很簡單? 之前想辦法拜託好朋友找人教我一小時,知道概念,然後我還是不會操作。
Thumbnail
程式設計與技術能力 在現代社會中的重要性越來越明顯,尤其是在人工智能(AI)和自動化技術迅速發展的背景下。理解編程語言,如Python、R等,以及熟悉相關技術架構和工具,能夠幫助個人在這樣的環境中更好地工作。這種能力不僅對技術專業人士至關重要,也對非技術領域的人士日益重要,因為基礎的程式設計知識已
Thumbnail
用 AI 製作一張專屬巴黎奧運的紀念海報吧~
Thumbnail
透過玩桌遊的方式學習AI生成圖像技巧,在充滿樂趣的活動中,學會如何操作工具及生成圖像技巧。這款遊戲預計下個月將開設實體課程,適合所有對AI有興趣的人、AI繪圖新手及藝術愛好者。
Thumbnail
AlphaGo 的開發,讓人工智慧在圍棋的研究讓更多人被看到,也看到它成熟的結果。現代的圍棋教學和棋手訓練,也或多或少會借鏡各類的AI系統做學習。然而,教學的歷程,過度追求AI的棋步和棋法,有時會讓小朋友難以理解。一步登天的方式,有時反而會讓同學走得更坎坷。
Thumbnail
最新的AI趨勢讓人眼花撩亂,不知要如何開始學習?本文介紹了作者對AI的使用和體驗,以及各類AI工具以及推薦的選擇。最後強調了AI是一個很好用的工具,可以幫助人們節省時間並提高效率。鼓勵人們保持好奇心,不停止學習,並提出了對健康生活和開心生活的祝福。
在人工智能的發展歷程中,早期的研究主要側重於將解決問題的規則輸入計算機,試圖通過啟蒙運動理性的思路模擬人類的智能行為。然而,這條路逐漸變得艱難,因為規則過於繁多,無法應對複雜的情境和語境。在這個背景下,一些科學家轉向了神經網絡算法,試圖模擬人腦的感知能力。
機器學習是什麼? 簡單來說,機器學習就是訓練機器尋找Function的一段過程,而這個Function可以幫助我們解決我們遇到的問題,或是幫助我們
Thumbnail
近年來,隨著人工智慧技術的快速發展,Python結合生成式AI正逐漸成為行銷領域的重要利器。對於行銷專業人士來說,這股趨勢更是值得關注和深入研究。 Python和AI將會為行銷領域帶來什麼改變?
Thumbnail
大家最近從AI AlphaGo打敗棋王, 開始陸續新聞一直報導, 到最近不管是AI繪圖,AI Chatgpt,AI coplit...