mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
Remove matplotlib and generate color palette to mimic matplotlib's colors (#12327)
This commit is contained in:
parent
188a7de467
commit
a0741aa7b1
@ -4,7 +4,6 @@ Flask_Limiter == 3.7.*
|
|||||||
imutils == 0.5.*
|
imutils == 0.5.*
|
||||||
joserfc == 0.11.*
|
joserfc == 0.11.*
|
||||||
markupsafe == 2.1.*
|
markupsafe == 2.1.*
|
||||||
matplotlib == 3.8.*
|
|
||||||
mypy == 1.6.1
|
mypy == 1.6.1
|
||||||
numpy == 1.26.*
|
numpy == 1.26.*
|
||||||
onvif_zeep == 0.2.12
|
onvif_zeep == 0.2.12
|
||||||
|
@ -7,7 +7,6 @@ from enum import Enum
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Dict, List, Optional, Tuple, Union
|
from typing import Any, Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from pydantic import (
|
from pydantic import (
|
||||||
BaseModel,
|
BaseModel,
|
||||||
@ -43,6 +42,7 @@ from frigate.plus import PlusApi
|
|||||||
from frigate.util.builtin import (
|
from frigate.util.builtin import (
|
||||||
deep_merge,
|
deep_merge,
|
||||||
escape_special_characters,
|
escape_special_characters,
|
||||||
|
generate_color_palette,
|
||||||
get_ffmpeg_arg_list,
|
get_ffmpeg_arg_list,
|
||||||
load_config_with_no_duplicates,
|
load_config_with_no_duplicates,
|
||||||
)
|
)
|
||||||
@ -1033,10 +1033,11 @@ class CameraConfig(FrigateBaseModel):
|
|||||||
def __init__(self, **config):
|
def __init__(self, **config):
|
||||||
# Set zone colors
|
# Set zone colors
|
||||||
if "zones" in config:
|
if "zones" in config:
|
||||||
colors = plt.cm.get_cmap("tab10", len(config["zones"]))
|
colors = generate_color_palette(len(config["zones"]))
|
||||||
|
|
||||||
config["zones"] = {
|
config["zones"] = {
|
||||||
name: {**z, "color": tuple(round(255 * c) for c in colors(idx)[:3])}
|
name: {**z, "color": color}
|
||||||
for idx, (name, z) in enumerate(config["zones"].items())
|
for (name, z), color in zip(config["zones"].items(), colors)
|
||||||
}
|
}
|
||||||
|
|
||||||
# add roles to the input if there is only one
|
# add roles to the input if there is only one
|
||||||
|
@ -5,13 +5,12 @@ import os
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Dict, Optional, Tuple
|
from typing import Dict, Optional, Tuple
|
||||||
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
import requests
|
import requests
|
||||||
from pydantic import BaseModel, ConfigDict, Field
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
from pydantic.fields import PrivateAttr
|
from pydantic.fields import PrivateAttr
|
||||||
|
|
||||||
from frigate.plus import PlusApi
|
from frigate.plus import PlusApi
|
||||||
from frigate.util.builtin import load_labels
|
from frigate.util.builtin import generate_color_palette, load_labels
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -128,10 +127,9 @@ class ModelConfig(BaseModel):
|
|||||||
|
|
||||||
def create_colormap(self, enabled_labels: set[str]) -> None:
|
def create_colormap(self, enabled_labels: set[str]) -> None:
|
||||||
"""Get a list of colors for enabled labels."""
|
"""Get a list of colors for enabled labels."""
|
||||||
cmap = plt.cm.get_cmap("tab10", len(enabled_labels))
|
colors = generate_color_palette(len(enabled_labels))
|
||||||
|
|
||||||
for key, val in enumerate(enabled_labels):
|
self._colormap = {label: color for label, color in zip(enabled_labels, colors)}
|
||||||
self._colormap[val] = tuple(int(round(255 * c)) for c in cmap(key)[:3])
|
|
||||||
|
|
||||||
model_config = ConfigDict(extra="forbid", protected_namespaces=())
|
model_config = ConfigDict(extra="forbid", protected_namespaces=())
|
||||||
|
|
||||||
|
@ -349,3 +349,39 @@ def empty_and_close_queue(q: mp.Queue):
|
|||||||
q.close()
|
q.close()
|
||||||
q.join_thread()
|
q.join_thread()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def generate_color_palette(n):
|
||||||
|
# mimic matplotlib's color scheme
|
||||||
|
base_colors = [
|
||||||
|
(31, 119, 180), # blue
|
||||||
|
(255, 127, 14), # orange
|
||||||
|
(44, 160, 44), # green
|
||||||
|
(214, 39, 40), # red
|
||||||
|
(148, 103, 189), # purple
|
||||||
|
(140, 86, 75), # brown
|
||||||
|
(227, 119, 194), # pink
|
||||||
|
(127, 127, 127), # gray
|
||||||
|
(188, 189, 34), # olive
|
||||||
|
(23, 190, 207), # cyan
|
||||||
|
]
|
||||||
|
|
||||||
|
def interpolate(color1, color2, factor):
|
||||||
|
return tuple(int(c1 + (c2 - c1) * factor) for c1, c2 in zip(color1, color2))
|
||||||
|
|
||||||
|
if n <= len(base_colors):
|
||||||
|
return base_colors[:n]
|
||||||
|
|
||||||
|
colors = base_colors.copy()
|
||||||
|
step = 1 / (n - len(base_colors) + 1)
|
||||||
|
extra_colors_needed = n - len(base_colors)
|
||||||
|
|
||||||
|
# interpolate between the base colors to generate more if needed
|
||||||
|
for i in range(extra_colors_needed):
|
||||||
|
index = i % (len(base_colors) - 1)
|
||||||
|
factor = (i + 1) * step
|
||||||
|
color1 = base_colors[index]
|
||||||
|
color2 = base_colors[index + 1]
|
||||||
|
colors.append(interpolate(color1, color2, factor))
|
||||||
|
|
||||||
|
return colors
|
||||||
|
Loading…
Reference in New Issue
Block a user