shotscan: Használd scannernek a fényképezőgépet

Fényképezőgéppel kattogtatni néha kényelmesebb és gyorsabb, mint scannert használni. Viszont tipikusan szemét marad a kép körül, és ezen egy egyszerű képkivágás se segít, hacsak nem sikerült pontosan középről fényképezni.

Ennek a megoldására írtam ezt a kis programot.

1. Tedd a téglalap alakú céltárgyat egy teljesen más, egyenletes színű felületre.
2. Fényképezd le.
- Látsszon egy kevés a háttérfelületből minden oldalon.
- Ha nem nagyon sötét a scannelendő dolog, jobb sötétebb, mint világosabb felületre rakni, mert kevésbé befolyásolják az árnyékok.
3. Futtasd a shotscan-t, hogy megkapd a lefényképezett lapot, kivágva, a megfelelő projektív transzformációval téglalapra visszaalakítva. (Jó esetben; ha nem elég egyenletes a háttér, vagy nem tér tőle el eléggé a célpont a sarkainál, akkor sajnos szemetet kapsz.)

Első paramétere a gépnek az átlónál mért látószög szerint 35 mm-es filmmel ekvivalens fókusztávolsága mm-ben - pontosan vagy nagyjából az, amit reklámozni szoktak. Utána jön(nek) a fájlnev(ek). Az eredményt ugyanabba a fájlba írja vissza, úgyhogy másolaton érdemes használni, ha hiba esetén nem tudsz/akarsz új képet csinálni.
Szerk.: --interpolate: jobb kimenet (nem lesznek lépcsősek a vonalak), de lassú.

Az egyszerű paraméterezés miatt akár hozzá is lehet rendelni a jpg/png fájlokhoz, és helyi menüből használni.

Forráskód, lefordítás:
g++ -o shotscan -lgd shotscan.cpp
(libgd kell neki).

Hozzászólások

Jól olvasható, szépen kommentelt forráskód, hasznos alkalmazás.
Gratulálok, szép munka.
--
"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "

Valóban hasznos, de a forráskódban pár helyen be lehetett volna néhány sortörést szúrni (aspect_ratio = ...).

Ha egy képnek vagy egy részének a háttérszínét akarod meghatározni, akkor célszerű medián átlagolást használni az egyszerű számtani átlag helyett. Ha pl. fényes pöttyök vannak a képen, azok az átlagot elhúzzák, de a mediánt nem.
(Ennél az alkalmazásnál mondjuk kevéssé számít.)

"sortörést szúrni (aspect_ratio = ...)"

Az így is-úgy is olvashatatlan, Maxima-ból másoltam be.

Az öteletet köszönöm. Itt valóban nem ilyen problémák szoktak előjönni. Hanem pl. belóg egy árnyék a világos háttérbe, és azt előtérnek hiszi. (A kompakt fényképezőm objektívje hajlamos kitakarni a vakut, ha közelre fényképezek, ezért jobb sötét háttérrel.) Vagy az előtér csak a színében különbözik a háttértől, és ezt kisebb különbségnek veszi, mint a sötét-világos különbségeket. Ezeket szerintem csak sokkal bonyolultabb algoritmussal lehetne kiküszöbölni.

Köszi, ez jó dolog, terjeszteni fogom!
--
Fight / For The Freedom / Fighting With Steel

Szerintetek képet reprezentáló tömböt milyen sorrendben szokás indexelni?

Matematikából ugye az x,y (vízszintes, majd függőleges koordináta) sorrend a megszokott, és a libgd is így kéri, de ha táblázatnak tekintjük, akkor a sor, oszlop (függőleges, majd vízszintes) a szokásos, és ha jól gondolom, a fájlokban is általában így tárolják.

probalgatom a progit, 1536x2048 -as felbontásból csinált 367x11256 -os felbontasut :) kiprobalom masik hatterrel is

úgy sem jó, elvileg ezt adtam be neki shotscan 400 akarmi.jpg

nem, sehogy sem jó neki, tudna linkelni valaki egy peldakepet, amivel mukodik, es egy pelda parancssort is

Kicsit rossz fókusztávolág beállítás miatt csak kicsit elnyújtott/összelapított lehet a kép, ha durvábban rossz, akkor nem tudta felismerni a dolgot. Sajnos ez elég gyakran előfordul, próbáld egyenletesebb, sötét háttéren. Esetleg küldd át a képet, hogy megnézzem, mi a gond.

Esetleg a nevedben a csaladnev legyen csupa naggyal, ha mar a magyar nevsorrendet hasznalod.

1. milyen géped van?

2. javasolt legkisebb felbontás (NNN x NNN pixel)?

Portré fotónál, ha utólag vékony fekete keretet kap a kép, akkor nem kell "135"-ös tele, és nem lesz duda orrod :-)
Azért vékony keretet, hogy ne kelljen korrigálni az ekvivalens fókusztávolságot.

Ha bejelöljük egy képen azt a területet ami szerintünk a perspektíva nélkül téglalap volt, és az ezen kívüli részt feketére festjük, akkor kvázi "Linhof Cardan Color" (persze nem 500 Mpx)

Kapott egy --interpolate opciót, amitől lineáris interpolációt csinál, kicsit szebb lesz a kép (nem lépcsősek a vonalak), cserébe sokkal lassabb.

És variáltam egy kicsit a konstansokkal, talán egy kicsit kevesebbszer hibázik így.