Wróć do projektów
Stanowisko do zdjęć produktowych: aparat Canon na ramieniu i laptop z uruchomioną aplikacją

Camera Capture

Python

Aplikacja desktopowa do automatyzacji fotografii produktowej dla sklepu internetowego Trixbrix. Na ekranie widać podgląd na żywo z aparatu Canon EOS M50, a jedno wciśnięcie ENTER uruchamia cały cykl: aparat robi zdjęcie, AI lokalnie usuwa tło, produkt zostaje wyśrodkowany, w rogu pojawia się logo sklepu, a gotowy plik 3000×3000 ląduje na dysku i w panelu sklepu. Cały cykl trwa około siedmiu sekund. Zobacz repo na GitHubie

Jakie problemy rozwiązuje?

  • Każdy nowy produkt w sklepie potrzebuje zdjęć katalogowych - białe tło, wykadrowanie, logo. Ręczna obróbka partii produktów w Photoshopie zajmowała godziny, teraz to kwestia sekund
  • Podgląd na żywo z siatką i kontrolą tła - fotograf widzi kadr przed zrobieniem zdjęcia, bez zaglądania w ekranik aparatu
  • Usuwanie tła działa w całości lokalnie na CPU - bez GPU, bez płatnych chmurowych API, zdjęcia nie opuszczają komputera
  • Spójny format każdego zdjęcia: wyśrodkowany produkt, stały margines, wymiar 3000×3000
  • Surowe zdjęcie z aparatu zapisuje się obok przetworzonego - jeśli automat się pomyli, oryginał czeka na dysku
  • Sesje zdjęciowe pobierane z panelu sklepu - wystarczy wpisać numer produktu, a zdjęcia zrobione wcześniej (nawet na innym komputerze) pojawiają się w aplikacji
  • Upload prosto do panelu sklepu - galeria produktu aktualizuje się na żywo podczas sesji zdjęciowej
  • Działa na macOS i Windows - na Windowsie jako gotowy plik .exe

Jak wygląda aplikacja?

Ekran startowy pokazuje wszystkie sesje zdjęciowe pogrupowane po dniach, z najnowszym zdjęciem jako okładką. Wewnątrz sesji jest podgląd na żywo z siatką, kompensacja ekspozycji i przełączniki obróbki, a na dole taśma ze zrobionymi zdjęciami. Spacja otwiera podgląd gotowego pliku na cały ekran. Kliknij zrzut, żeby go powiększyć.

Ekran startowy aplikacji: lista sesji zdjęciowych pogrupowana po dniach
Lista sesji
Sesja zdjęciowa: podgląd na żywo z aparatu z siatką i panelem ustawień
Sesja
Podgląd gotowego zdjęcia katalogowego w aplikacji
Podgląd

Zobacz w akcji

Po lewej surowe zdjęcie prosto z matrycy aparatu, po prawej to, co aplikacja zapisuje na dysku: 3000×3000, białe tło, wyśrodkowany produkt, logo. Trzy ujęcia z jednej sesji, która trwała około 20 sekund. Kliknij zdjęcie, żeby je powiększyć.

Przed

Po

Surowe zdjęcie produktu prosto z aparatu
Gotowe zdjęcie katalogowe z białym tłem i logo
Surowe zdjęcie produktu prosto z aparatu, drugie ujęcie
Gotowe zdjęcie katalogowe, drugie ujęcie
Surowe zdjęcie produktu pod kątem
Gotowe zdjęcie katalogowe w kadrze trzy czwarte

Technologie

  • Python 3.12 - cały pipeline
  • python-gphoto2 (macOS) i Canon EDSDK przez ctypes (Windows) - sterowanie aparatem, podgląd na żywo i pobieranie zdjęć przez USB
  • pywebview - natywne okno systemowe z interfejsem w czystym HTML, CSS i JavaScripcie, bez Electrona i frameworków
  • Wbudowany serwer HTTP z biblioteki standardowej - strumieniuje podgląd z aparatu jako MJPEG i obsługuje akcje interfejsu
  • rembg (model u2netp) + onnxruntime - lokalne usuwanie tła przez AI
  • Pillow, numpy i scipy - maski, kadrowanie, wyostrzanie, nakładanie logo
  • requests + python-dotenv - upload do towarzyszącej aplikacji Rails

Jak wyglądała praca nad projektem?

Punktem wyjścia był konkretny, powtarzalny problem: każda partia nowych produktów w sklepie oznaczała sesję zdjęciową i długą, ręczną obróbkę w Photoshopie. Chciałem, żeby cała pętla - zdjęcie, obróbka, zapis - sprowadzała się do jednego klawisza. Pierwsza wersja działała w terminalu i przez kilka miesięcy w zupełności wystarczała.

Najciekawszą częścią okazało się dopracowanie masek z modelu AI. Surowa maska łapała drobne artefakty - pyłki, krawędzie tła - więc filtruję je po powierzchni. Osobnym wyzwaniem były cienie prześwitujące przez otwory w produkcie: te rozjaśniam do bieli, ale sam produkt zostawiam nietknięty. Wyostrzanie działa selektywnie tylko na produkcie, nigdy na tle - dzięki temu wokół krawędzi nie pojawia się jasna obwódka, która zdradzałaby, że tło było wycinane.

Pipeline pracuje na pełnej rozdzielczości matrycy (24 Mpix) w jednym przebiegu, z jednym finalnym skalowaniem, i działa w całości offline. Dodałem też integrację z aplikacją Rails obsługującą katalog sklepu: zaraz po naciśnięciu migawki narzędzie zgłasza nowe zdjęcie do panelu sklepu (od razu pojawia się tam miejsce na nie), a po zakończeniu obróbki wysyła gotowy plik przez API - podgląd sesji w sklepie aktualizuje się na żywo.

Kolejnym krokiem była aplikacja okienkowa. Z terminala nie było widać kadru, więc trzeba było zaglądać w ekranik aparatu, a narzędzia miały używać też osoby, które na co dzień nie pracują w konsoli. Zamiast ciężkiego frameworka postawiłem na natywne okno systemowe z interfejsem w zwykłym HTML: aparat, obróbka i ramię z aparatem pracują w wątkach Pythona, a interfejs jest po prostu stroną, którą w razie potrzeby można otworzyć nawet w przeglądarce. Przy okazji aplikacja dostała wersję na Windows, gdzie z aparatem rozmawia bezpośrednio przez oficjalne SDK Canona.