国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        在 Python 中使用 OpenCV 構建 Color Catcher 游戲

        2023-05-19 11:07
        磐創AI
        關注

        介紹

        你是否曾經想在 Python 中使用 OpenCV 創建自己的游戲?

        今天我們將構建一個名為 Color Catcher 的游戲,該游戲挑戰玩家使用手部跟蹤機制接住從屏幕頂部掉落的彩球。

        設置游戲窗口

        構建游戲的第一步是使用 OpenCV 設置游戲窗口。我們將定義窗口大小、創建窗口并設置其在屏幕上的位置:

        # Set up the game window

        window_size = (640, 480)

        window_name = 'Color Catcher'

        cv2.namedWindow(window_name)

        cv2.moveWindow(window_name, 0, 0)

        定義游戲對象

        接下來,我們將定義游戲對象。在 Color Catcher 中,我們有兩個主要的游戲對象:捕手和球。

        捕手是玩家用手移動的矩形,而球是從屏幕頂部落下的隨機生成的圓圈。我們將定義這些游戲對象的屬性:

        # Set up the game objects

        catcher_color = (0, 0, 255)

        catcher_width = 100

        catcher_height = 20

        catcher_position = np.array([window_size[0]//2, window_size[1]-catcher_height], dtype=int)

        catcher_velocity = np.array([10, 0], dtype=int)

        ball_radius = 20

        ball_speed = 5

        ball_colors = [(0, 255, 0), (255, 0, 0), (0, 0, 255)]

        balls = []

        score = 0

        從網絡攝像頭捕獲視頻

        為了跟蹤玩家的手部動作,我們需要使用 OpenCV 從網絡攝像頭捕獲視頻。

        我們將創建一個視頻捕獲設備并循環播放視頻的每一幀:

        # Set up the video capture device

        cap = cv2.VideoCapture(0)

        while True:

            # Read a frame from the video capture device

            ret, frame = cap.read()

            if not ret:

                break

        檢測玩家的手

        為了跟蹤玩家的手部動作,我們將使用 OpenCV 的輪廓檢測功能。首先,我們將每個幀轉換為灰度并應用閾值以便更容易檢測輪廓:

        # Convert the frame to grayscale and apply a threshold

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

        接下來,我們將在閾值圖像中找到輪廓,并確定面積最大的輪廓,這應該是玩家的手:

        # Find the contours in the thresholded image

        contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        # Find the contour with the largest area, which should be the hand

        if contours:

            hand_contour = max(contours, key=cv2.contourArea)

            hand_hull = cv2.convexHull(hand_contour)

            hand_center = np.mean(hand_contour, axis=0, dtype=int)[0]

        移動捕手

        一旦我們檢測到玩家手的位置,我們就可以相應地移動捕手。

        在代碼中,我們檢查手中心的 x 坐標并將其與接球手位置的 x 坐標進行比較。如果手在接球手的左側,我們通過從接球手的當前位置減去接球手的速度,將接球手向左移動。如果手在捕手的右側,我們通過將捕手的速度添加到其當前位置來將捕手移動到右側。

            if hand_center[0] < catcher_position[0] and catcher_position[0] > 0:

                catcher_position -= catcher_velocity

            elif hand_center[0] > catcher_position[0]+catcher_width and catcher_position[0]+catcher_width < window_size[0]:

                catcher_position += catcher_velocity

        生成和移動球:

        如果當前比賽中的球數少于五個,我們將生成具有隨機顏色和位置的新球。我們將包含球的顏色、位置和速度的元組附加到balls列表中。

            if len(balls) < 5:

                ball_color = random.choice(ball_colors)

                ball_position = np.array([random.randint(ball_radius, window_size[0]-ball_radius), 0], dtype=int)

                ball_velocity = np.array([0, ball_speed], dtype=int)

                balls.append((ball_color, ball_position, ball_velocity))

        然后我們遍歷balls列表中的每個球,通過將其速度添加到其當前位置來更新其位置,并檢查它是否與接球手發生碰撞或擊中游戲窗口的底部。

        如果球與接球手發生碰撞,我們將其從balls列表中移除,增加玩家的得分,然后跳出循環。

        如果球擊中了游戲窗口的底部,我們將其從balls列表中移除并跳出循環。

            for i in range(len(balls)):

                balls[i] = (balls[i][0], balls[i][1]+balls[i][2], balls[i][2])

                ball_position = balls[i][1]

                if ball_position[1]+ball_radius >= catcher_position[1] and 

                   ball_position[0] >= catcher_position[0] and 

                   ball_position[0] <= catcher_position[0]+catcher_width:

                    balls.pop(i)

                    score += 1

                    break

                elif ball_position[1]+ball_radius >= window_size[1]:

                    balls.pop(i)

                    break

        繪制游戲對象:

        最后,我們使用cv2.rectangle()和cv2.circle()函數在框架上繪制游戲對象。我們使用np.zeros()創建一個黑色框架,將捕手繪制為紅色矩形,并將每個球繪制為彩色圓圈。

        我們還使用cv2.putText()函數在框架的左上角顯示玩家的分數。

            frame = np.zeros(window_size+(3,), dtype=np.uint8)

            cv2.rectangle(frame, tuple(catcher_position), tuple(catcher_position+np.array([catcher_width, catcher_height])), catcher_color, -1)

            for ball in balls:

                cv2.circle(frame, tuple(ball[1]), ball_radius, ball[0], -1)

            

            cv2.putText(frame, "Score: {}".format(score), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

            cv2.imshow(window_name, frame)

        退出游戲:

        最后,游戲循環包含在while循環中。在這個循環中,執行以下任務:

        使用cap.read()方法從視頻捕獲設備讀取新幀。處理框架以檢測手區域并相應地移動捕手。如有必要,將生成一個具有隨機顏色和位置的新球。球被移動并檢查是否與接球手發生碰撞。游戲對象繪制在框架上?蚣茱@示在屏幕上。循環繼續,直到用戶按下“q”鍵。

        按“q”鍵可以退出游戲。這是使用cv2.waitKey()方法完成的,該方法等待鍵盤事件的給定毫秒數。如果按鍵被按下,該方法返回按鍵的 ASCII 代碼,如果沒有按鍵被按下,則返回 -1。

        我們使用按位與運算符 ( &) 提取結果的最低有效 8 位,這為我們提供了按 256 模的按下鍵的 ASCII 代碼。我們將此值與 'q' 鍵 ( ord('q')) 的 ASCII 代碼進行比較,如果匹配則退出循環。

        # Exit the game if the user presses the 'q' key

        if cv2.waitKey(1) & 0xFF == ord('q'):

            break

        退出循環后,我們分別使用cap.release()和cv2.destroyAllWindows()方法釋放視頻捕獲設備并關閉游戲窗口。

        # Release the video capture device and close the game window

        cap.release()

        cv2.destroyAllWindows()

        就是這樣!你現在應該能夠運行代碼并玩游戲了。這個游戲是一個簡單的例子,說明了如何使用計算機視覺來實時控制游戲對象的移動。當然,還有很大的改進和優化空間,但這應該足以讓你入門。

        編碼愉快!

        完整代碼:

        https://github.com/Yaga987/Computer-Vision/blob/main/CompVisGame.py

               原文標題 : 在 Python 中使用 OpenCV 構建 Color Catcher 游戲

        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 亚洲美女视频在线| 日韩大香蕉| 91亚洲色图| 强行糟蹋人妻HD中文字幕| 黄色V国产| 北安市| 亚洲自拍另类| 午夜精品偷拍| 久久天天躁狠狠躁夜夜av| 东阳市| yellow网站在线观看| 一区二区三区免费| 国产jizz| A片黄色| 江山市| 日韩1级| 看亚洲一级黄色片啪啪啪| 富阳市| 91探花视频在线观看| 免费看无码网站成人A片| 宜阳县| 桃色91| 一本加勒比HEZYO熟女| 91视频在线观看视频| 樱花飘落视频素材| 漳平市| 久久凹凸视频| AV黄色| 于都县| 国产A片网| A片A级毛片| www.成人| 芷江| 无码探花| 亚洲在线中文字幕| 甘孜县| 黄瓜视频91| 国产丝袜剧情演绎| 91视频在线| 亚洲熟女视频| 亚洲v欧美|