OpenCV-Playing-Card-Detector icon indicating copy to clipboard operation
OpenCV-Playing-Card-Detector copied to clipboard

run with screen streaming as input (mss())

Open rasdehya opened this issue 7 years ago • 0 comments

Hi. I love your thing I'm just learning python, i tried to set an mss stream as input. I couldnt get the Rank_suit_detector properly, so i make it run with a folder of png file, that gave me a correct Cards-img folder... But When i run CardDetector, i get only Unknown of Unknown, and i have to zoom in the card to have some response (but totally inacurate)... Do you know what i'm struggling with ...? here the modified rankSuitIsolator

### Takes a card picture and creates a top-down 200x300 flattened image
### of it. Isolates the suit and rank and saves the isolated images.
### Runs through A - K ranks and then the 4 suits.

# Import necessary packages
import cv2
import numpy as np
import time
import Cards
import os
``

from mss import mss
from PIL import Image
mon = {'top': 160, 'left': 160, 'width': 600, 'height': 600}
sct = mss()

imagepath=[
"image/S01.png","image/S01.png","image/S03.png","image/S04.png","image/S05.png","image/S06.png","image/S07.png","image/S08.png","image/S09.png","image/S10.png","image/S11.png","image/S12.png","image/S13.png",
"image/S01.png","image/D05.png",
"image/C04.png","image/H01.png"]
img_path = os.path.dirname(os.path.abspath(__file__)) + '/Card_Imgs/'
IM_WIDTH = 1280;IM_HEIGHT = 720;RANK_WIDTH = 70;RANK_HEIGHT = 125;SUIT_WIDTH = 70;SUIT_HEIGHT = 100

# If using a USB Camera instead of a PiCamera, change PiOrUSB to 2
PiOrUSB = 2

# Use counter variable to switch from isolating Rank to isolating Suit
i = 1

for image in imagepath:
    filename = image
    image = Image.open(image)
    image = np.array(image)
    # print(image)
    # Pre-process image
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray,(5,5),0)
    retval, thresh = cv2.threshold(blur,100,255,cv2.THRESH_BINARY)

    # Find contours and sort them by size
    dummy,cnts,hier = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    cnts = sorted(cnts, key=cv2.contourArea,reverse=True)

    # Assume largest contour is the card. If there are no contours, print an error
    flag = 0
    image2 = image.copy()

    if len(cnts) == 0:
        print('No contours found!')
        quit()

    card = cnts[0]

    # Approximate the corner points of the card
    peri = cv2.arcLength(card,True)
    approx = cv2.approxPolyDP(card,0.01*peri,True)
    pts = np.float32(approx)

    x,y,w,h = cv2.boundingRect(card)

    # Flatten the card and convert it to 200x300
    warp = Cards.flattener(image,pts,w,h)

    # Grab corner of card image, zoom, and threshold
    corner = warp[0:84, 0:32]
    # corner_gray = cv2.cvtColor(corner,cv2.COLOR_BGR2GRAY)
    corner_zoom = cv2.resize(corner, (0,0), fx=4, fy=4)
    corner_blur = cv2.GaussianBlur(corner_zoom,(5,5),0)
    retval, corner_thresh = cv2.threshold(corner_blur, 155, 255, cv2. THRESH_BINARY_INV)

    # Isolate suit or rank
    if i <= 13: # Isolate rank
        rank = corner_thresh[20:185, 0:128] # Grabs portion of image that shows rank
        dummy, rank_cnts, hier = cv2.findContours(rank, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
        rank_cnts = sorted(rank_cnts, key=cv2.contourArea,reverse=True)
        x,y,w,h = cv2.boundingRect(rank_cnts[0])
        rank_roi = rank[y:y+h, x:x+w]
        rank_sized = cv2.resize(rank_roi, (RANK_WIDTH, RANK_HEIGHT), 0, 0)
        final_img = rank_sized

    if i > 13: # Isolate suit
        suit = corner_thresh[186:336, 0:128] # Grabs portion of image that shows suit
        dummy, suit_cnts, hier = cv2.findContours(suit, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
        suit_cnts = sorted(suit_cnts, key=cv2.contourArea,reverse=True)
        x,y,w,h = cv2.boundingRect(suit_cnts[0])
        suit_roi = suit[y:y+h, x:x+w]
        suit_sized = cv2.resize(suit_roi, (SUIT_WIDTH, SUIT_HEIGHT), 0, 0)
        final_img = suit_sized

    cv2.imshow("Image",final_img)

    # Save image
    print('Press "c" to continue.')
    key = cv2.waitKey(0) & 0xFF
    if key == ord('c'):
        cv2.imwrite(img_path+filename,final_img)

    i = i + 1

cv2.destroyAllWindows()

rasdehya avatar May 08 '18 18:05 rasdehya