From 2b1afe607303532ac989a4cf934440ad2f1c2747 Mon Sep 17 00:00:00 2001 From: Weitheng Haw Date: Tue, 4 Feb 2025 03:21:24 +0000 Subject: [PATCH] Add save and display image before OCR --- frigate/embeddings/lpr/lpr.py | 8 +++ .../overlay/dialog/LPRDetailDialog.tsx | 5 +- web/src/pages/LPRDebug.tsx | 50 +++++++++++++++++-- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/frigate/embeddings/lpr/lpr.py b/frigate/embeddings/lpr/lpr.py index a186db8df..f08b5abb1 100644 --- a/frigate/embeddings/lpr/lpr.py +++ b/frigate/embeddings/lpr/lpr.py @@ -165,6 +165,14 @@ class LicensePlateRecognition: logger.debug("Model runners not loaded") return [], [], [] + # Save raw image before processing if event_id is provided + if event_id: + try: + raw_filename = f"raw_{event_id}.jpg" + cv2.imwrite(os.path.join(self.debug_dir, raw_filename), image) + except Exception as e: + logger.warning(f"Failed to save raw debug image: {e}") + plate_points = self.detect(image) if len(plate_points) == 0: return [], [], [] diff --git a/web/src/components/overlay/dialog/LPRDetailDialog.tsx b/web/src/components/overlay/dialog/LPRDetailDialog.tsx index f658c628a..b2242f307 100644 --- a/web/src/components/overlay/dialog/LPRDetailDialog.tsx +++ b/web/src/components/overlay/dialog/LPRDetailDialog.tsx @@ -32,7 +32,7 @@ import { MobilePageTitle, } from "@/components/mobile/MobilePage"; -const LPR_TABS = ["details", "snapshot", "video", "plate"] as const; +const LPR_TABS = ["details", "snapshot", "video"] as const; export type LPRTab = (typeof LPR_TABS)[number]; type LPRDetailDialogProps = { @@ -146,7 +146,6 @@ export default function LPRDetailDialog({ {item == "details" && } {item == "snapshot" && } {item == "video" && } - {item == "plate" && }
{item}
))} @@ -163,7 +162,7 @@ export default function LPRDetailDialog({ {page === "video" && ( )} - {page === "plate" && ( + {(page === "details" || !event) && ( )} diff --git a/web/src/pages/LPRDebug.tsx b/web/src/pages/LPRDebug.tsx index de97b850d..b199f0fff 100644 --- a/web/src/pages/LPRDebug.tsx +++ b/web/src/pages/LPRDebug.tsx @@ -10,7 +10,7 @@ import { DropdownMenuLabel, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { ScrollArea } from "@/components/ui/scroll-area"; +import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; import { Toaster } from "@/components/ui/sonner"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { FrigateConfig } from "@/types/frigateConfig"; @@ -21,13 +21,17 @@ import { useFormattedTimestamp } from "@/hooks/use-date-utils"; import { LuArrowDownUp, LuTrash2 } from "react-icons/lu"; import axios from "axios"; import { toast } from "sonner"; +import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; +import { cn } from "@/lib/utils"; type SortOption = "score_desc" | "score_asc" | "time_desc" | "time_asc"; +type ViewMode = "detected" | "raw"; export default function LPRDebug() { const { data: config } = useSWR("config"); const [sortBy, setSortBy] = useState("time_desc"); const [selectedCameras, setSelectedCameras] = useState(); + const [viewMode, setViewMode] = useState("detected"); // title useEffect(() => { @@ -105,6 +109,35 @@ export default function LPRDebug() {
+ { + if (value) { + setViewMode(value); + } + }} + > + +
Detected
+
+ +
Raw
+
+
+
@@ -141,7 +174,13 @@ export default function LPRDebug() {
{lprAttempts.map((attempt: string) => ( - + ))}
@@ -152,9 +191,10 @@ type LPRAttemptProps = { attempt: string; config: FrigateConfig; onRefresh: () => void; + viewMode: ViewMode; }; -function LPRAttempt({ attempt, config, onRefresh }: LPRAttemptProps) { +function LPRAttempt({ attempt, config, onRefresh, viewMode }: LPRAttemptProps) { const [showDialog, setShowDialog] = useState(false); const data = useMemo(() => { const parts = attempt.split("_"); @@ -206,7 +246,7 @@ function LPRAttempt({ attempt, config, onRefresh }: LPRAttemptProps) { setOpen={setShowDialog} event={event} config={config} - lprImage={attempt} + lprImage={viewMode === "detected" ? attempt : `raw_${data.eventId}.jpg`} />
@@ -217,7 +257,7 @@ function LPRAttempt({ attempt, config, onRefresh }: LPRAttemptProps) {