diff --git a/.cspell/frigate-dictionary.txt b/.cspell/frigate-dictionary.txt index dbab9600e..77e4ede62 100644 --- a/.cspell/frigate-dictionary.txt +++ b/.cspell/frigate-dictionary.txt @@ -108,7 +108,6 @@ imagestream imdecode imencode imread -imutils imwrite interp iostat diff --git a/docker/main/Dockerfile b/docker/main/Dockerfile index fb23940f8..a71250813 100644 --- a/docker/main/Dockerfile +++ b/docker/main/Dockerfile @@ -78,8 +78,9 @@ COPY docker/main/requirements-ov.txt /requirements-ov.txt RUN apt-get -qq update \ && apt-get -qq install -y wget python3 python3-dev python3-distutils gcc pkg-config libhdf5-dev \ && wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ + && sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' get-pip.py \ && python3 get-pip.py "pip" \ - && pip install -r /requirements-ov.txt + && pip3 install -r /requirements-ov.txt # Get OpenVino Model RUN --mount=type=bind,source=docker/main/build_ov_model.py,target=/build_ov_model.py \ @@ -172,6 +173,7 @@ RUN apt-get -qq update \ RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ + && sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' get-pip.py \ && python3 get-pip.py "pip" COPY docker/main/requirements.txt /requirements.txt @@ -235,6 +237,7 @@ ENV DEFAULT_FFMPEG_VERSION="7.0" ENV INCLUDED_FFMPEG_VERSIONS="${DEFAULT_FFMPEG_VERSION}:5.0" RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ + && sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' get-pip.py \ && python3 get-pip.py "pip" RUN --mount=type=bind,from=wheels,source=/wheels,target=/deps/wheels \ diff --git a/docker/main/requirements-wheels.txt b/docker/main/requirements-wheels.txt index 9368cabcd..4ab7e03e6 100644 --- a/docker/main/requirements-wheels.txt +++ b/docker/main/requirements-wheels.txt @@ -7,7 +7,6 @@ starlette-context == 0.3.6 fastapi == 0.115.* uvicorn == 0.30.* slowapi == 0.1.* -imutils == 0.5.* joserfc == 1.0.* pathvalidate == 3.2.* markupsafe == 3.0.* diff --git a/docker/rocm/Dockerfile b/docker/rocm/Dockerfile index 78f91b96f..d04e93df3 100644 --- a/docker/rocm/Dockerfile +++ b/docker/rocm/Dockerfile @@ -39,6 +39,7 @@ WORKDIR /opt/frigate COPY --from=rootfs / / RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ + && sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' get-pip.py \ && python3 get-pip.py "pip" --break-system-packages RUN python3 -m pip config set global.break-system-packages true diff --git a/docker/tensorrt/Dockerfile.arm64 b/docker/tensorrt/Dockerfile.arm64 index 5d5d5d939..6e2e0280f 100644 --- a/docker/tensorrt/Dockerfile.arm64 +++ b/docker/tensorrt/Dockerfile.arm64 @@ -9,9 +9,9 @@ ARG DEBIAN_FRONTEND # Add deadsnakes PPA for python3.11 RUN apt-get -qq update && \ - apt-get -qq install -y --no-install-recommends \ - software-properties-common \ - && add-apt-repository ppa:deadsnakes/ppa + apt-get -qq install -y --no-install-recommends \ + software-properties-common \ + && add-apt-repository ppa:deadsnakes/ppa # Use a separate container to build wheels to prevent build dependencies in final image RUN apt-get -qq update \ @@ -24,6 +24,7 @@ RUN apt-get -qq update \ RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ + && sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' get-pip.py \ && python3 get-pip.py "pip" FROM build-wheels AS trt-wheels diff --git a/frigate/motion/frigate_motion.py b/frigate/motion/frigate_motion.py index 72097667b..fd362de34 100644 --- a/frigate/motion/frigate_motion.py +++ b/frigate/motion/frigate_motion.py @@ -1,9 +1,9 @@ import cv2 -import imutils import numpy as np from frigate.config import MotionConfig from frigate.motion import MotionDetector +from frigate.util.image import grab_cv2_contours class FrigateMotionDetector(MotionDetector): @@ -103,7 +103,7 @@ class FrigateMotionDetector(MotionDetector): contours = cv2.findContours( thresh_dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) - contours = imutils.grab_contours(contours) + contours = grab_cv2_contours(contours) # loop over the contours for c in contours: diff --git a/frigate/motion/improved_motion.py b/frigate/motion/improved_motion.py index aae5167a4..69de6d015 100644 --- a/frigate/motion/improved_motion.py +++ b/frigate/motion/improved_motion.py @@ -1,7 +1,6 @@ import logging import cv2 -import imutils import numpy as np from scipy.ndimage import gaussian_filter @@ -9,6 +8,7 @@ from frigate.camera import PTZMetrics from frigate.comms.config_updater import ConfigSubscriber from frigate.config import MotionConfig from frigate.motion import MotionDetector +from frigate.util.image import grab_cv2_contours logger = logging.getLogger(__name__) @@ -147,7 +147,7 @@ class ImprovedMotionDetector(MotionDetector): contours = cv2.findContours( thresh_dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) - contours = imutils.grab_contours(contours) + contours = grab_cv2_contours(contours) # loop over the contours total_contour_area = 0 diff --git a/frigate/util/image.py b/frigate/util/image.py index 0b80efe88..93827747c 100644 --- a/frigate/util/image.py +++ b/frigate/util/image.py @@ -265,6 +265,19 @@ def draw_box_with_label( ) +def grab_cv2_contours(cnts): + # if the length the contours tuple returned by cv2.findContours + # is '2' then we are using either OpenCV v2.4, v4-beta, or + # v4-official + if len(cnts) == 2: + return cnts[0] + + # if the length of the contours tuple is '3' then we are using + # either OpenCV v3, v4-pre, or v4-alpha + elif len(cnts) == 3: + return cnts[1] + + def is_label_printable(label) -> bool: """Check if label is printable.""" return not bool(set(label) - set(printable)) diff --git a/web/src/hooks/use-overlay-state.tsx b/web/src/hooks/use-overlay-state.tsx index 7a43383d4..5b41ca302 100644 --- a/web/src/hooks/use-overlay-state.tsx +++ b/web/src/hooks/use-overlay-state.tsx @@ -109,6 +109,7 @@ export function useSearchEffect( key: string, callback: (value: string) => boolean, ) { + const location = useLocation(); const [searchParams, setSearchParams] = useSearchParams(); const param = useMemo(() => { @@ -129,7 +130,7 @@ export function useSearchEffect( const remove = callback(param[1]); if (remove) { - setSearchParams(undefined, { replace: true }); + setSearchParams(undefined, { state: location.state, replace: true }); } - }, [param, callback, setSearchParams]); + }, [param, location.state, callback, setSearchParams]); }