1

I am trying to find all objects detected in difference of frames, I thougt this would give a list of each area detected in the threshold, but find_objects is giving a bunch of "None"s and a range of the whole image?

...
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
(slice(0, 972, None), slice(0, 1296, None))

Relevant code can be tested from here

import numpy as np
import cv2
from matplotlib import pyplot as plt
import pylab

from scipy import ndimage
import os

for img in os.listdir('.'):
    if img.endswith('.jpg'):
        image = cv2.imread(img)
        gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        gray_image = cv2.resize(gray_image, (int(gray_image.shape[1]/2), int(gray_image.shape[0]/2) ))
        ret, threshimg = cv2.threshold(gray_image,0,255,cv2.THRESH_BINARY)
        cv2.imshow('opening',threshimg)
        objects = ndimage.find_objects(threshimg)
        for ob in objects:
            print(ob)
        cv2.waitKey(0)                 # Waits forever for user to press any key   
        cv2.destroyAllWindows()
NoBugs
  • 8,418
  • 10
  • 72
  • 132
  • The [documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.find_objects.html#scipy.ndimage.find_objects) explains when the function returns `None`. – taha Jul 04 '20 at 23:21

1 Answers1

0

You can use cv2.connectedComponentsWithStats for the same.

import numpy as np
import cv2
from matplotlib import pyplot as plt
import pylab

from scipy import ndimage
import os
### for visualising connected component image
def imshow_components(labels):
    # Map component labels to hue val
    label_hue = np.uint8(179*labels/np.max(labels))
    blank_ch = 255*np.ones_like(label_hue)
    labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

    # cvt to BGR for display
    labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

    # set bg label to black
    labeled_img[label_hue==0] = 0
    return labeled_img

for img in os.listdir('.'):
    if img.endswith('.jpg'):
        image = cv2.imread(img)
        gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        gray_image = cv2.resize(gray_image, (int(gray_image.shape[1]/2), int(gray_image.shape[0]/2) ))
        ret, threshimg = cv2.threshold(gray_image,0,255,cv2.THRESH_BINARY)
        num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh)
        out_image=imshow_components(labels)
        #### stats will have x,y,w,h,area of each detected connected component

Refer to this answer for more info on connected component features.

Sreekiran
  • 2,494
  • 2
  • 10
  • 34