Detecting an object without using object detection

Been trying algorithms that can detect the balls in the image.
So far, I have done multiple template matching with multiple templates. As I’ve understood, this method is likely not reliable (assumed that my object is not static and will likely move from time to time) and is a bit slow in performance because of the loops. And as what I’ve noticed, it can detect a detected object again as long as it matches from the existing templates which is another setback for me.

scene3 - Copy

I have tried feature detections, like Haris and ORB, but I can’t seem to find the correct parameters that can make it to detect only the balls.
Lastly, I cannot use color masking as to the balls’ colors cannot be unique from it’s background.

Here’s my code for the template matching.

from imutils.object_detection import non_max_suppression
import numpy as np
import cv2
import glob

#empty list to store template images
templatesData = []
threshold = 0.8

#make a list of all templates images from a directory
templates = glob.glob('Templates/template*.png')

testImage = cv2.imread('scene8              .png')
testImageGray = cv2.cvtColor(testImage, cv2.COLOR_BGR2GRAY)
testImageBeforeNMS = testImage.copy()
testImageAfterNMS = testImage.copy()

for template in templates:
    image = cv2.imread(template, 0)
    templatesData.append(image)

for tmp in templatesData:
    (tH, tW) = tmp.shape[:2]
    result = cv2.matchTemplate(testImageGray, tmp, cv2.TM_CCOEFF_NORMED)

    (yCoords, xCoords) = np.where(result >= threshold)

    for (x,y) in zip(xCoords, yCoords):
        #draw the bouding box on the image
        cv2.rectangle(testImageBeforeNMS, (x,y), (x+tW, y+tH), (255,0,0), 3)

    #initialize list of rectangles
    rects = []
    for (x,y) in zip(xCoords, yCoords):
        #update our list of rectangles
        rects.append((x,y, x+tW, y+tH))
    
    pick = non_max_suppression(np.array(rects))

    for(startX, startY, endX, endY) in pick:
        #draw the bounding box of the image
        cv2.rectangle(testImageAfterNMS, (startX, startY), (endX, endY), (255,0,0), 3)



cv2.imshow("Before NMS", testImageBeforeNMS)
cv2.imshow("After NMS", testImageAfterNMS)
cv2.waitKey(0)

I’m posting this one here hoping to get some insights on what and what not do. Thanks a lot!

image is unusable.

you need retroreflective balls (such spray paint exists) and a ring light around the camera. and then dial the exposure down. that’ll give you a very nice, trivially workable contrast

1 Like