Find Duplicate Images & Videos

Select a folder to scan. Supports images (JPG, PNG, GIF, WebP) and videos (MP4, WebM, MOV).

Ready
0 items

🎯 How ORB Duplicate Detection Works — Complete Guide

Everything you need to know about finding and cleaning up duplicate files with ORB feature matching. Scroll down for step‑by‑step instructions, tips, and answers to common questions.

100% Private — Your Files Never Leave Your Computer Everything runs inside your browser using OpenCV.js WebAssembly. No uploads, no accounts, no tracking. Close the tab and all data is gone.

🔍 What This Tool Does

ORB finds duplicate and similar images and videos by detecting distinctive local features — corners, edges, and high‑contrast regions — and building a compact binary descriptor for each one. Two files are considered duplicates if they share enough of these matching feature descriptors, regardless of rotation, scale, or slight cropping.

Rotation Invariant

Detects and describes features relative to their local orientation. A rotated copy produces the same descriptors at the same points.

Crop Tolerant

Matches on individual features, not the whole image. A heavily cropped version can still share many distinctive keypoints with the original.

Video Support

Extracts 3 frames from each video and picks the one with the most keypoints for the best ORB result.

Perspective Tolerant

Can match scanned documents photographed at angles, book covers from off‑centre, and similar perspective‑distorted copies.

ORB is slower than hash algorithms. For large folders where rotations are unlikely, aHash or dHash will be faster with similar results. Use ORB specifically when you need rotation or perspective tolerance.

🧠 How the ORB Algorithm Works

ORB stands for Oriented FAST and Rotated BRIEF. It combines FAST keypoint detection and BRIEF descriptor computation with orientation awareness, making the full pipeline rotation‑invariant.

  1. Load OpenCV.js

    OpenCV.js is a WebAssembly‑compiled version of OpenCV. It runs entirely in your browser. This happens once on first page load and is cached for all subsequent visits. If it hasn't finished loading when you click Select Folder, the scanner waits up to 10 seconds and shows a status toast.

  2. Video Frame Extraction

    For video files, Sakarto extracts 3 frames at regular intervals. ORB keypoint detection runs on each frame and the frame with the most detected keypoints is selected as the representative for that video. This maximises match quality since feature‑rich frames give more reliable descriptors than dark or blurry ones.

  3. Resize & Convert to Grayscale

    Each image or selected video frame is resized to 320×320 pixels and converted to grayscale. Feature detection works on intensity gradients and colour adds complexity without improving keypoint quality.

  4. Detect Keypoints with Oriented FAST

    FAST scans the image for pixels significantly brighter or darker than surrounding pixels — corners and edge junctions. ORB computes a dominant orientation for each detected corner based on the local intensity centroid. This orientation is what makes ORB rotation‑invariant: every feature knows which way it's pointing.

  5. Compute Rotated BRIEF Descriptors

    For each keypoint, BRIEF computes a 256‑bit binary descriptor by comparing brightness pairs within the local patch. ORB rotates the sampling pattern to align with the keypoint's orientation, making descriptors consistent even if the image is rotated.

  6. Match Descriptors Using Hamming Distance

    To compare two files, for each descriptor in file A the closest descriptor in file B is found using Hamming distance. A match is “good” if the distance is 40 or less. The total count of good matches is the similarity score used for grouping.

  7. Aspect Ratio Pre‑Check

    Before feature extraction, Sakarto checks that the two files have similar aspect ratios. Pairs differing by more than 10% are skipped — comparing a tall portrait to a wide landscape is unlikely to yield meaningful matches regardless of content.

Why is ORB rotation‑invariant when hashing algorithms aren't? Hash algorithms encode the whole image at a fixed grid — rotate 90° and the hash changes entirely. ORB detects individual features and records the orientation of each. When the image is rotated, the same features are found and each descriptor is computed relative to its own orientation — so the result is the same regardless of rotation angle.

🎚️ Understanding the Similarity Threshold Slider

The Similarity Threshold slider controls the minimum number of good feature matches required for two files to be grouped as duplicates. Important: ORB's threshold direction is the opposite of all hash‑based algorithms. A higher value requires more matching features and is therefore stricter.

High values — Strict (fewer, more confident groups)

Requires many good matching features. Only near‑identical files or very lightly transformed copies will match. Use when you want high confidence and few false positives.

Medium values — Balanced (default)

A reasonable number of feature matches required. Catches rotated copies, perspective‑warped images, and video frame matches. Good starting point for most use cases.

Low values — Loose (more groups, more false positives)

Only a few matching features required. Use when you expect heavily cropped copies where many original keypoints are out of frame, but expect more false positives.

ORB threshold direction is the opposite of hash algorithms. For aHash, dHash, BlockHash, and pHash: lower = stricter. For ORB: higher = stricter (more matches required). Increase to reduce false positives; decrease to catch more heavily cropped or obscured matches.
Re‑clustering runs in the background. When you stop moving the slider, all already‑computed descriptors are re‑matched with the new threshold in a background Web Worker after 3 seconds. No re‑scan is needed — the UI updates progressively.

✅ What It Finds — and What It Might Miss

✅ Finds Well
  • Rotated copies (any angle)
  • Mirrored copies
  • Heavily cropped versions with shared content
  • Scanned documents photographed at an angle
  • Images with perspective distortion
  • Slightly resized versions with preserved detail
  • Minor brightness or colour adjustments
  • Images re‑saved at slightly different quality levels
  • Video duplicates — 3‑frame extraction picks best keypoint frame
⚠️ May Struggle With
  • Images with very few features (plain skies, solid colours)
  • Cartoon or heavily stylized art with few corners
  • Very low resolution images with sparse keypoints
  • Strongly blurred images (destroys edge keypoints)
  • Extremely aggressive JPEG re‑compression
  • Non‑overlapping crops of the same scene
  • Dark or blurry video frames with few detectable keypoints
ORB is your best option when hash‑based algorithms have failed — specifically for rotated, mirrored, or perspective‑distorted copies. For large collections where those cases are rare, dHash or aHash will be much faster.

📋 Step‑by‑Step: How to Use Sakarto ORB

Step 1

Wait for OpenCV.js to Load

OpenCV.js loads in the background when the page opens. If you click Select Folder while it's loading, the scanner shows a toast and waits up to 10 seconds. It's cached after the first visit so subsequent loads are instant.

Step 2

Select a Folder to Scan

Click 📁 Select Folder to Scan or drag and drop a folder onto the page. Supported formats: JPEG, PNG, GIF, WebP, BMP (images) and MP4, WebM, MOV (videos). Files over 40 MB are skipped.

ORB is significantly slower than hash algorithms. For large folders, scan a targeted subfolder or run a hash algorithm first to narrow candidates, then use ORB on those batches.
Step 3

Wait for the Scan

A progress bar shows files processed. Duplicate groups appear live as they're found. Image processing continues in the background even if you switch tabs. Video processing pauses when you leave the tab and resumes when you return (browser limitation). Click Stop Scan at any time — results so far remain visible.

Step 4

Adjust the Similarity Threshold

Use the Similarity Threshold slider to tune groupings. Remember: for ORB, higher = stricter. The slider debounces for 3 seconds then re‑clusters in a background Worker — no re‑scan needed. Raise to reduce false positives; lower to catch more matches.

Step 5

Review the Duplicate Groups

Results are shown in numbered groups. Each group contains files that look similar to each other.

  • Click a card to select it (blue border)
  • Ctrl+Click (or Cmd+Click on Mac) to add to the compare list (purple border)
  • Click the 🔍 icon on hover to preview full size
  • Right‑click any card for the context menu
  • Click & drag on empty space to box‑select multiple cards
Step 6

Compare Side‑by‑Side

Ctrl+Click two or more cards, then click ⚖️ Compare in the toolbar. A modal opens showing both files at full size with metadata and a similarity percentage. Always compare before deleting — rotated matches can look less obviously related at thumbnail size.

Step 7

Take Action — Move, Delete, or Copy

Select files and use the toolbar buttons. With Queue Mode on (recommended), files are staged for review first:

📋 CopyCopy filename(s) to clipboard
📂 MoveStage for move to a named folder
🗑️ DeleteStage for permanent deletion
⚖️ CompareView selected files side‑by‑side
Step 8

Queue Mode — Review Before You Commit

When Queue Mode is enabled (the default), clicking Move or Delete stages files in a queue instead of acting immediately. Switch to the Move Queue or Delete Queue tab in the sidebar to review what's staged, remove individual files, then execute when ready.

With Queue Mode disabled, a confirmation dialog appears and the operation runs immediately after you confirm.

🏛️ Quick Reference — Buttons & Controls

All toolbar buttons, checkboxes, and keyboard shortcuts for Sakarto ORB duplicate finder
Button / ActionWhat it does
🔄 New SearchReload the page and start a fresh scan
📋 Copy (N)Copy selected filenames to clipboard. N = count selected.
📂 Move (N)Move selected files or stage them in the Move Queue
🗑️ Delete (N)Delete selected files or stage them in the Delete Queue
✕ Deselect AllRemove selection from all cards
⚖️ Compare (N)Open the compare modal for Ctrl+clicked files. Needs 2+.
🔇 VideosToggle mute/unmute for all video cards
Queue Mode checkboxWhen checked: stage files for review before executing. Recommended.
Fast Mode checkboxUse EXIF thumbnail for JPEG scanning — much faster. On by default.
Scan Images checkboxInclude or exclude image files from the scan
Scan Videos checkboxInclude or exclude video files from the scan
Similarity Threshold sliderMinimum good feature matches required. Higher = stricter (opposite of hash algorithms).
Click cardSelect / deselect the file
Ctrl + Click cardAdd / remove from compare list (purple border)
Click & drag (empty area)Box‑select multiple cards at once
Ctrl + dragAdd to existing selection with box
Right‑click cardContext menu: Copy / Move / Delete / Compare
🔍 hover iconOpen full‑size preview with metadata and action buttons
Hover video cardAuto‑play the video clip

⭐ What Users Say

Based on 143 reviews

"ORB found rotated and cropped copies that every hash algorithm missed completely. I had dozens of photos scanned from different angles and it grouped them all perfectly. A game‑changer for my archive."

"I photograph documents and often have the same page at different angles. ORB is the only tool that reliably matches them. The OpenCV.js implementation runs smoothly in the browser."

"Takes longer to run than the hash algorithms, but for rotated images it's unbeatable. The threshold slider took a minute to understand (higher = stricter), but once I got it, the results were excellent."

"I had a folder of old scanned photos where many were rotated 90° or 180°. ORB grouped them all correctly. This is the only algorithm that handles these cases. Absolutely essential for archive cleanup."

💡 Tips for Best Results

Back Up First

Always back up your files before deleting anything. Deleted files bypass the recycle bin and cannot be recovered.

Scan Targeted Subfolders

ORB is slow. Scan a specific subfolder or run a hash algorithm first to narrow candidates, then use ORB on those.

ORB is Your Rotation Specialist

Use ORB specifically for rotated scans, photographed documents, mirrored copies, and images cropped to different aspect ratios.

Always Compare Before Deleting

Rotated or cropped matches can look less obviously related at thumbnail size. Use Ctrl+Click → Compare first.

Best for Feature‑Rich Images

ORB works best on photos with clear textures, edges, and detail. Plain backgrounds and simple graphics have few keypoints and may not match reliably.

Video Tips

For best video matching, make sure videos have at least one well‑lit, clear frame in the first few seconds. Dark or heavily motion‑blurred videos produce fewer keypoints.

⚠️ Known Limitations

Significantly slower than hash algorithms.

Keypoint detection and O(n²) descriptor matching are expensive. Use ORB for targeted searches, not routine scans of thousands of files.

Video matching uses a single representative frame.

3 frames are extracted and the best (most keypoints) is used. If all 3 frames are dark or blurry, matching may be unreliable even against a near‑identical copy.

Poorly suited for feature‑sparse images.

Smooth gradients, plain skies, and solid colours produce very few reliable keypoints. ORB needs rich visual detail to work reliably.

No undo for file deletion.

The File System Access API bypasses the OS recycle bin. Always use Queue Mode to stage and review before executing.

Move and Delete require Chrome or Edge.

The File System Access API is available only in Chrome 86+ and Edge 86+. Firefox and Safari can run ORB scanning and display results but cannot move or delete files.

🔒 Privacy & Security

Zero network activity after page load. All feature extraction and matching runs locally. No file data is ever transmitted.
No accounts, no cookies, no analytics. The only localStorage data saved is your checkbox preferences.
Folder access is scoped and session‑only. Permission lasts only while the tab is open and is revocable from browser site settings.
OpenCV runs entirely client‑side. The WebAssembly module processes files locally. No image or video data reaches any server at any point.

❓ Frequently Asked Questions

Why use ORB instead of aHash, pHash, dHash, or wHash?
All hash algorithms (aHash, pHash, dHash, wHash, BlockHash) encode the image as a fixed‑size grid and compare the whole image as one unit. Rotate the image 90° and every cell in the grid shifts — the resulting hash is completely different, and no hash algorithm will find the match at any threshold. ORB works differently: it detects up to 500 individual visual landmarks (keypoints) like corners and blobs, computes a 32‑byte orientation‑normalised descriptor for each, then matches keypoints between images spatially using Hamming distance plus Lowe's ratio test. A rotated image has the same keypoints in different positions, but each descriptor is still recognisable and matchable. Use ORB when you have rotated, mirrored, perspective‑distorted, or significantly cropped copies that hash algorithms simply cannot find. For standard collections without geometric transformations, hash algorithms are much faster.
Why is the ORB threshold “higher = stricter” when all other algorithms are “lower = stricter”?
Hash algorithms measure distance (the number of differing bits) — lower distance means more similar, so lower threshold = stricter. ORB measures the count of good keypoint matches — more matching keypoints means more similar, so higher threshold = stricter. For example, a threshold of 30 means “two files must share at least 30 good keypoint matches to be grouped.” Raise the threshold to reduce false positives (require more evidence). Lower it if expected duplicates aren't appearing (accept fewer matches as sufficient). The scale depends on the images — feature‑rich photos with lots of edges and texture produce hundreds of keypoints, while flat backgrounds produce very few.
Does ORB work on video files?
Yes. For each video file, Sakarto extracts 3 frames at regular intervals and runs ORB keypoint detection on each. The frame with the most detected keypoints is selected as the representative frame for that video — maximising the number of potential matches. The rest of the pipeline is identical to images: the selected frame's descriptors are compared against every other file's descriptors using Hamming distance and Lowe's ratio test. Video cards show a 🎬 VIDEO badge. Note that ORB only uses the middle‑area frame, not motion or audio, so two videos are compared purely on visual keypoints from a single extracted frame.
ORB isn't finding a rotated or cropped copy I know exists. What should I try?
First, lower the threshold to accept fewer matching keypoints as sufficient evidence. Second, consider the visual content of the images: ORB keypoints are detected at corners, blobs, and textured regions. Images with large flat areas (plain sky, solid backgrounds, white walls) produce very few keypoints, leaving little for ORB to match. If both the original and the copy are low in visual texture, ORB will struggle regardless of threshold. Third, check whether the copy has been very heavily compressed or significantly blurred — BRIEF descriptors are computed from local pixel patterns, and severe compression or blur can destroy the distinguishing patterns around keypoints. For heavily degraded copies, hash algorithms may actually perform better.
ORB seems much slower than the hash algorithms. Is that expected?
Yes, and it's inherent to the algorithm. Hash algorithms are O(n²) in comparisons but each comparison is a single 64‑bit XOR+popcount operation taking nanoseconds. ORB is O(n²) in comparisons but each comparison involves matching up to 500 32‑byte descriptors between two files using Hamming distance, which is orders of magnitude more expensive. Additionally, OpenCV.js loads as a WebAssembly module (~2‑5 seconds on first use) and keypoint detection itself is more CPU‑intensive than a simple downscale and hash. For large collections, consider scanning a fast hash algorithm first to eliminate obvious duplicates, then using ORB on a smaller subset of suspected rotated or transformed copies.
What is Lowe's ratio test, and why does ORB use it?
When matching a keypoint from image A against all keypoints in image B, the best match is the descriptor with the lowest Hamming distance, and the second‑best match is the next closest. Lowe's ratio test accepts a match only if the best match is significantly better than the second‑best — specifically, if the best‑match distance divided by the second‑best distance is below 0.75. If the best and second‑best matches are similarly close, the keypoint is ambiguous (appears multiple times in the image) and is rejected. This dramatically reduces false keypoint matches and is the reason ORB can reliably match rotated images without an explosion of spurious pairings.
Why does video scanning pause when I switch tabs?
Browsers throttle background video decoding when a tab is hidden. Sakarto detects this and pauses video frame extraction, resuming when you return. Image keypoint detection runs in a background Web Worker (after OpenCV.js initialises) and is not throttled by tab visibility — images continue processing at full speed regardless of which tab is active.
Can I recover files after deleting them?
No. The File System Access API's remove() method permanently deletes files without the OS Recycle Bin or Trash. Queue Mode is on by default: files are staged for review before execution. For ORB results specifically, always use the Compare modal to visually verify matches, since ORB can occasionally match visually distinct images that share strong keypoint patterns (repeated textures, similar architectural elements). Move to a subfolder rather than Delete if you have any doubt.
What file types are supported?
Images: JPEG, PNG, GIF, WebP, BMP. Videos: MP4, WebM, MOV (one representative frame extracted and processed with ORB). Files over 40 MB are skipped. HEIC/HEIF, SVG, RAW formats, and TIFF are not supported due to browser decoder limitations. Note that MKV is not listed for ORB video support — the middle‑frame extraction uses an HTML video element which may have more limited codec support than the image pipeline.
Does this work on Firefox or Safari?
OpenCV.js loads and runs correctly in Firefox and Safari, so keypoint detection, matching, result display, and the Compare modal all work. Move and Delete are the exception — they require the File System Access API (Chrome 86+ and Edge 86+ only). In other browsers, complete the scan, review and compare results, and use Download List to export a report for manual file management.