[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$ftaqwbyga6j1f":3},{"_id":4,"slug":5,"title":6,"subtitle":7,"kind":8,"cards":9,"tags":59,"categories":61,"source":63,"lang":66,"author":67,"audioState":70,"stats":71,"publishedAt":74,"renderer":75},"6abb9cfeca21c797c7e9d235","blurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e","Blurring license plates in 10,000 photos with Python — and knowing which ones to check","Blurring a license plate is one line of OpenCV.","news",[10,14,19,24,29,34,39,44,49,54],{"headline":11,"body":12,"imageUrl":13,"sourceImageUrl":13},"Blurring license plates in 10,000 photos with Python — and knowing which ones…","Blurring a license plate is one line of OpenCV. Knowing where the plate is — in 10,000 photos, at every angle, on every kind of car — is the actual job. And once it's done, the question nobody plans for arrives: which of those 10,000 should a person actually look at before they go public?","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpb31vpjt5y8c2h0ifiz4.png",{"headline":15,"body":16,"imageUrl":17,"images":18},"This walkthrough covers both. It uses the API4AI","This walkthrough covers both. It uses the API4AI Image Anonymization API, which finds and blurs plates (and faces, if you want) and leaves the rest of the photo untouched. The script at the end runs a whole folder, keeps the folder structure, survives rate limits and failures, and writes a CSV of every plate it hid — which turns out to be the most useful part.","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F1.webp",{"local":17},{"headline":20,"body":21,"imageUrl":22,"images":23},"It's for archives, rental fleets, marketplace uploads, street","It's for archives, rental fleets, marketplace uploads, street photography, datasets: anywhere the scene has to stay and only the plate has to go. If you're a car dealer who wants the background replaced as well, skip to the end — there's a no-code route for that.","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F2.webp",{"local":22},{"headline":25,"body":26,"imageUrl":27,"images":28},"mode=hide-clp means \"hide car license plates\". The other","mode=hide-clp means \"hide car license plates\". The other mode is hide-face. Leave mode out entirely and the API hides everything it supports — plates and faces, which is worth knowing before you run a folder of photos where faces should stay. Repeat the parameter to be explicit about both: ?mode=hide-clp&mode=hide-face. The photo goes in as multipart form data: a file in image, or a public link in url. This is the example from the docs, trimmed:","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F3.webp",{"local":27},{"headline":30,"body":31,"imageUrl":32,"images":33},"image — the anonymized photo, base64-encoded, in format","image — the anonymized photo, base64-encoded, in format (the docs say it's usually the same as the input format, so a JPEG in usually comes back as a JPEG).","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F4.webp",{"local":32},{"headline":35,"body":36,"imageUrl":37,"images":38},"objects — every object that was hidden, with","objects — every object that was hidden, with a bounding box in normalized [x, y, width, height] coordinates and a confidence between 0 and 1.","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F5.webp",{"local":37},{"headline":40,"body":41,"imageUrl":42,"images":43},"Look at that confidence in the docs' own","Look at that confidence in the docs' own example: 0.56. The plate was found and blurred, but the model wasn't sure about it. Hold on to that — it's what makes the review step at the end work. Four things that catch people","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F6.webp",{"local":42},{"headline":45,"body":46,"imageUrl":47,"images":48},"A photo the service can't read still returns","A photo the service can't read still returns HTTP 200. status.code is \"failure\" and status.message says why. If you only call raise_for_status(), those files silently vanish from your output folder. Pick entities by kind, not by position. Code that reads entities[0] works until it doesn't.","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F7.webp",{"local":47},{"headline":50,"body":51,"imageUrl":52,"images":53},"Limits: JPEG, PNG or PDF, under 16 MB","Limits: JPEG, PNG or PDF, under 16 MB, at most 4096×4096. A PDF is split into pages and each page is processed separately, so results can hold more than one entry. Faces are included by default. Say mode=hide-clp when you mean plates only.","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F8.webp",{"local":52},{"headline":55,"body":56,"imageUrl":57,"images":58},"Eighty-odd lines, standard library plus requests. It walks","Eighty-odd lines, standard library plus requests. It walks the source folder recursively, sends eight photos at a time, writes each result to the same relative path under the output folder, and logs every hidden plate to plates.csv.","\u002Fapi\u002Fmedia\u002Fposts\u002Fblurring-license-plates-in-10000-photos-with-python-and-know-cb11a07e\u002F9.webp",{"local":57},[60],"dev",[62],"Technology",{"name":64,"url":65},"Dev.to","https:\u002F\u002Fdev.to\u002Fapi4ai\u002Fblurring-license-plates-in-10000-photos-with-python-and-knowing-which-ones-to-check-110c","en",{"handle":68,"displayName":69},"spots","Spots","queued",{"views":72,"likes":73,"saves":73,"shares":73,"completions":73,"opens":73,"skips":73,"depthSum":73},3,0,"2026-09-29T11:11:58.531Z","local"]