I’m creating a YuGiOh card detector based exclusively on OpenCV and Tesseract OCR.
First I make a binary image and then find the contours that can be approximated with 4 points. The problem is that sometimes the edges of the borders are smoothed out as seen in the example below:
As you can see the edges on the card in the middle are quite smooth even though they are not in the original image which is why the 4-point approximation fails I presume.
This is the code for getting the binary image.
#grayscale -> bluring -> canny thresholding -> dilation gray_img = cv2.cvtColor(img_resized, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray_img, (11,11), 0) thresh = cv2.Canny(blur, 50, 100) dilated = cv2.dilate(thresh, np.ones((11,11), dtype=np.int8))
This is the code for 4-point contour approximation.
tbd = list() for c in contours: peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.05 * peri, True) if len(approx) == 4: tbd.append(approx)
If someone could point me in the right direction to fix this type of problem I would be very grateful. Thanks in advance!