Module torpido.util.image
Utility functions to resize the frame from the video or normal image into specified width the increase the processing speed on the operations on the frames.
Expand source code
"""
Utility functions to resize the frame from the video or normal image into specified width the increase the
processing speed on the operations on the frames.
"""
import cv2
import numpy as np
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
"""
Resize the image according the width with open cv's Interpolator. Height is automatically
calculated based on the ratio of the original width of the frame
Parameters
----------
image : numpy array
input image original from input video
width : int
width of the output frame
height : int , optional
the height is automatically calculated based on the ratios
inter : int
Interpolator to use
Returns
-------
resized : numpy array
output resized image
"""
# initialize the dimensions of the image to be resized and
# grab the image size
(h, w) = image.shape[:2]
# if both the width and height are None, then return the
# original image
if width is None and height is None:
return image
# check to see if the width is None
if width is None:
# calculate the ratio of the height and construct the
# dimensions
r = height / float(h)
dim = (int(w * r), height)
# otherwise, the height is None
else:
# calculate the ratio of the width and construct the
# dimensions
r = width / float(w)
dim = (width, int(h * r))
# resize the image
resized = cv2.resize(image, dim, interpolation=inter)
# return the resized image
return resized
def nonMaxSuppression(boxes, probs=None, overlapThresh=0.3):
"""
Supression for overlapping boxes from the co-ordinates
Parameters
----------
boxes : box list
list of values
probs : list
value of the probability
overlapThresh : float
threshold that corrects the overlapping
Returns
-------
box list
cleaned co-ordinates
"""
# if there are no boxes, return an empty list
if len(boxes) == 0:
return []
# if the bounding boxes are integers, convert them to floats -- this
# is important since we'll be doing a bunch of divisions
if boxes.dtype.kind == "i":
boxes = boxes.astype("float")
# initialize the list of picked indexes
pick = []
# grab the coordinates of the bounding boxes
x1 = boxes[:, 0]
y1 = boxes[:, 1]
x2 = boxes[:, 2]
y2 = boxes[:, 3]
# compute the area of the bounding boxes and grab the indexes to sort
# (in the case that no probabilities are provided, simply sort on the
# bottom-left y-coordinate)
area = (x2 - x1 + 1) * (y2 - y1 + 1)
idxs = y2
# if probabilities are provided, sort on them instead
if probs is not None:
idxs = probs
# sort the indexes
idxs = np.argsort(idxs)
# keep looping while some indexes still remain in the indexes list
while len(idxs) > 0:
# grab the last index in the indexes list and add the index value
# to the list of picked indexes
last = len(idxs) - 1
i = idxs[last]
pick.append(i)
# find the largest (x, y) coordinates for the start of the bounding
# box and the smallest (x, y) coordinates for the end of the bounding
# box
xx1 = np.maximum(x1[i], x1[idxs[:last]])
yy1 = np.maximum(y1[i], y1[idxs[:last]])
xx2 = np.minimum(x2[i], x2[idxs[:last]])
yy2 = np.minimum(y2[i], y2[idxs[:last]])
# compute the width and height of the bounding box
w = np.maximum(0, xx2 - xx1 + 1)
h = np.maximum(0, yy2 - yy1 + 1)
# compute the ratio of overlap
overlap = (w * h) / area[idxs[:last]]
# delete all indexes from the index list that have overlap greater
# than the provided overlap threshold
idxs = np.delete(idxs, np.concatenate(([last],
np.where(overlap > overlapThresh)[0])))
# return only the bounding boxes that were picked
return boxes[pick].astype("int")
Functions
def nonMaxSuppression(boxes, probs=None, overlapThresh=0.3)
-
Supression for overlapping boxes from the co-ordinates
Parameters
boxes
:box list
- list of values
probs
:list
- value of the probability
overlapThresh
:float
- threshold that corrects the overlapping
Returns
box list
- cleaned co-ordinates
Expand source code
def nonMaxSuppression(boxes, probs=None, overlapThresh=0.3): """ Supression for overlapping boxes from the co-ordinates Parameters ---------- boxes : box list list of values probs : list value of the probability overlapThresh : float threshold that corrects the overlapping Returns ------- box list cleaned co-ordinates """ # if there are no boxes, return an empty list if len(boxes) == 0: return [] # if the bounding boxes are integers, convert them to floats -- this # is important since we'll be doing a bunch of divisions if boxes.dtype.kind == "i": boxes = boxes.astype("float") # initialize the list of picked indexes pick = [] # grab the coordinates of the bounding boxes x1 = boxes[:, 0] y1 = boxes[:, 1] x2 = boxes[:, 2] y2 = boxes[:, 3] # compute the area of the bounding boxes and grab the indexes to sort # (in the case that no probabilities are provided, simply sort on the # bottom-left y-coordinate) area = (x2 - x1 + 1) * (y2 - y1 + 1) idxs = y2 # if probabilities are provided, sort on them instead if probs is not None: idxs = probs # sort the indexes idxs = np.argsort(idxs) # keep looping while some indexes still remain in the indexes list while len(idxs) > 0: # grab the last index in the indexes list and add the index value # to the list of picked indexes last = len(idxs) - 1 i = idxs[last] pick.append(i) # find the largest (x, y) coordinates for the start of the bounding # box and the smallest (x, y) coordinates for the end of the bounding # box xx1 = np.maximum(x1[i], x1[idxs[:last]]) yy1 = np.maximum(y1[i], y1[idxs[:last]]) xx2 = np.minimum(x2[i], x2[idxs[:last]]) yy2 = np.minimum(y2[i], y2[idxs[:last]]) # compute the width and height of the bounding box w = np.maximum(0, xx2 - xx1 + 1) h = np.maximum(0, yy2 - yy1 + 1) # compute the ratio of overlap overlap = (w * h) / area[idxs[:last]] # delete all indexes from the index list that have overlap greater # than the provided overlap threshold idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > overlapThresh)[0]))) # return only the bounding boxes that were picked return boxes[pick].astype("int")
def resize(image, width=None, height=None, inter=3)
-
Resize the image according the width with open cv's Interpolator. Height is automatically calculated based on the ratio of the original width of the frame
Parameters
image
:numpy array
- input image original from input video
width
:int
- width of the output frame
height
:int
, optional- the height is automatically calculated based on the ratios
inter
:int
- Interpolator to use
Returns
resized
:numpy array
- output resized image
Expand source code
def resize(image, width=None, height=None, inter=cv2.INTER_AREA): """ Resize the image according the width with open cv's Interpolator. Height is automatically calculated based on the ratio of the original width of the frame Parameters ---------- image : numpy array input image original from input video width : int width of the output frame height : int , optional the height is automatically calculated based on the ratios inter : int Interpolator to use Returns ------- resized : numpy array output resized image """ # initialize the dimensions of the image to be resized and # grab the image size (h, w) = image.shape[:2] # if both the width and height are None, then return the # original image if width is None and height is None: return image # check to see if the width is None if width is None: # calculate the ratio of the height and construct the # dimensions r = height / float(h) dim = (int(w * r), height) # otherwise, the height is None else: # calculate the ratio of the width and construct the # dimensions r = width / float(w) dim = (width, int(h * r)) # resize the image resized = cv2.resize(image, dim, interpolation=inter) # return the resized image return resized