edjeelectronics / opencv-playing-card-detector Goto Github PK
View Code? Open in Web Editor NEWPython program that uses OpenCV to detect and identify playing cards from a PiCamera video feed on a Raspberry Pi
Python program that uses OpenCV to detect and identify playing cards from a PiCamera video feed on a Raspberry Pi
So I'm not so hot with python, but would it be possible to use an "if" statement while the image is being compared to the training images to assign the cards "count value" in a string? then later "print" the sum of that string? I know this is your end goal but i just thought i would ask. And thanks this is an awesome project and i'm working on it tonight!
Because I have different poker cards, I saw the video you have a training system. It's possible public or not?
Hi,
which software licence is this project offered under?
So I have a homework that has to detect something with openCV. And I'm interested in your study.
I've followed the instructions that you made to detect cards. After messing around with errors. I successfully detected cards. But there's a problem for me:
Not all the time I show the card it can be detected. In your video, you need a dark background. But I'm using my laptop's cam so I just show the cards in front of it. When the lights on my room's off, the program's working just fine. But when I turn on the lights (maybe my background's lighter?), it cannot detect contours and identify cards.
What should I do to make it work all the time?
Thank you for reading. Hope you can help me out!
[
OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array') in cv::arithm_op, file C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp, line 659
Traceback (most recent call last):
File "C:/Users/Haziq/PycharmProjects/CardDetector/CardDetector.py", line 86, in '<'module'>'
k].suit_diff = Cards.match_card(cards[k], train_ranks, train_suits)
File "D:\OpenCV-Playing-Card-Detector-master\Cards.py", line 260, in match_card
diff_img = cv2.absdiff(qCard.rank_img, Trank.img)
cv2.error: C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:659: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function cv::arithm_op
]
I got the error above when a card enter the camera's sight and immediately closed.
p/s= Remove the " ' " from the module.
Thanks in advance.
Hello, it's possible to provide a C# version using EmguCV ?
because i found hard to convert some Python libs like 'numpy' in C#, but 'cv2' it's easy.
Traceback (most recent call last):
File "E:\OpenCV-Playing-Card-Detector-master\CardDetector.py", line 66, in
cnts_sort, cnt_is_card = Cards.find_cards(pre_proc)
File "E:\OpenCV-Playing-Card-Detector-master\Cards.py", line 135, in find_cards
dummy,cnts,hier = cv2.findContours(thresh_image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
ValueError: not enough values to unpack (expected 3, got 2)
Hi there,
I wanted to try this on a screenshot, being succesfull just to decission of cards, my size value of my contours has about 355 and the minimum size is above 25000 I guess.
What do I need to readjust here? have i missed some scaling?
for i in range(len(cnts_sort)):
size = cv2.contourArea(cnts_sort[i]) // has size of 300 and min size is 25000
peri = cv2.arcLength(cnts_sort[i],True)
approx = cv2.approxPolyDP(cnts_sort[i],0.01*peri,True)
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()
def preprocess_image(image):
img_w, img_h = np.shape(image)[:2]
return thresh
should be change to
def preprocess_image(image):
img_h, img_w = np.shape(image)[:2]
return thresh
np.shape() will actually return height than width
This project is so cool.
I tried to run the project on my Mac, it gives error in findContours and LINE_AA syntax. I delete the "dummy" and change LINE_AA to CV_AA, the program finally works. But when it recognize any card, it will putText "Unknow of Unknow" on the card. I am learning C++ not Python, so I don't know how this happens. Can anyone help?
Traceback (most recent call last):
File "CardDetector.py", line 66, in <module>
cnts_sort, cnt_is_card = Cards.find_cards(pre_proc)
File "/home/ismail/Documents/OpenCV-Playing-Card-Detector/Cards.py", line 135, in find_cards
dummy,cnts,hier = cv2.findContours(thresh_image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
ValueError: need more than 2 values to unpack
In Windows 10, the default installation of Anaconda 3.6 does not include OpenCV & Numpy libraries. These are required to be downloaded and installed separately from the Anaconda repository.
OpenCV
https://anaconda.org/anaconda/opencv
To install, run "Prompt" and type: conda install -c anaconda opencv
Install Numpy (registration required)
https://anaconda.org/anaconda/numpy
To install, run "Prompt" and type: conda install -c anaconda numpy
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.