Source code for pycharmers.opencv.cascade
#coding: utf-8
import os
import cv2
import glob
from ..utils.generic_utils import handleKeyError, handleTypeError
from ._cvpath import PYCHARMERS_OPENCV_DATA_DIR
OPENCV_CASCADES = {
os.path.splitext(":".join(path.split("/")[-2:]))[0] : path
for path in glob.glob(f"{PYCHARMERS_OPENCV_DATA_DIR}/**/*cascade*.xml")
}
[docs]def cascade_creator(cascade):
"""Create a ``cv2.CascadeClassifier`` instance.
Args:
cascade (str, cv2.CascadeClassifier) : The identifier of Cascades.
Returns:
``cv2.CascadeClassifier``
Examples:
>>> from pycharmers.opencv import SAMPLE_LENA_IMG, cv2read_mpl, cv2plot, cascade_creator, draw_bboxes_xywh
>>> cascade = cascade_creator(cascade="haarcascades:haarcascade_frontalface_alt2")
>>> gray = cv2read_mpl(SAMPLE_LENA_IMG, 0)
>>> for bbox in cascade.detectMultiScale(gray):
... draw_bboxes_xywh(
... frame=gray, bboxes=bbox
... )
>>> ax = cv2plot(gray)
"""
handleTypeError(types=[cv2.CascadeClassifier, str], cascade=cascade)
if isinstance(cascade, str):
handleKeyError(lst=list(OPENCV_CASCADES.keys()), cascade=cascade)
cascade = cv2.CascadeClassifier(OPENCV_CASCADES.get(cascade))
return cascade
[docs]def cascade_detection_create(cascade):
"""Create a ``cascade_detection`` function.
Args:
cascade (str, cv2.CascadeClassifier) : Identifier for ``cv2.CascadeClassifier``
Returns:
``cascade_detection``
Examples:
>>> import cv2
>>> from pycharmers.opencv import SAMPLE_LENA_IMG, cv2read_mpl, cv2plot, cascade_detection_create, draw_bboxes_ltrb
>>> cascade_detection = cascade_detection_create(cascade="haarcascades:haarcascade_frontalface_alt2")
>>> img = cv2.cvtColor(cv2.imread(SAMPLE_LENA_IMG), cv2.COLOR_BGR2RGB)
>>> for bbox in cascade_detection(img):
... draw_bboxes_ltrb(frame=img, bboxes=bbox)
>>> ax = cv2plot(img)
"""
cascade = cascade_creator(cascade)
def cascade_detection(rgb, *args, expand_ratio=0.0):
H,W,_ = rgb.shape
locations = []
gray = cv2.cvtColor(rgb, cv2.COLOR_RGB2GRAY)
results = cascade.detectMultiScale(gray, *args)
for x,y,w,h in results:
edge_w,edge_h = int(w*expand_ratio),int(h*expand_ratio)
top = max(y-edge_h, 0)
bottom = min(y+h+edge_h, H)
left = max(x-edge_w, 0)
right = min(x+w+edge_w, W)
locations.append((left,top,right,bottom))
return locations
cascade_detection.__doc__ = """Detect using the specified ``cv2.CascadeClassifier``.
Args:
rgb (np.ndarray) : RGB Image. (= ``cv2read_mp()`` )
expand_ratio (float) : Edges will be expaned to ``( (1+2*expand_ratio)*w, (1+2*expand_ratio)*h )``
"""
return cascade_detection