大量画像の一括リサイズ

大量のデジカメ写真があるのですが、あまりに量が多すぎて見るのもなかなか大変です。なんせ、開くのに時間がかかってしまいますので。

そこで、画像を一括縮小してやろうということで、調べてみました。

やりたいのは、ディレクトリを切ってある場所に、s_XXXXXX.jpg というファイル名で保存してあるものとします。これを縮小し、同じディレクトリに t_XXXXXX.jpg というファイル名で縮小画像を生成します。

結論から書くと、こんなワンライナーになりました。

for文でファイル名一覧を取得し、ループ内で一旦 t_XXXXXX のファイル名としてコピー(元のファイルを残さないなら mv でよい)します。その後、mogrify コマンドで 640×640 に収まるようにサイズ変換し、JPEG画像品質を60に指定します。
ファイル名の置換はシェル変数の置換 ${f//s_/t_} で行っています。

SDカードから消えた写真を復活

うちの嫁のAndroid機で撮影してあったMicroSDカード上の写真がすべて消失するという事件が起きました。
LINEでありえない人(この人がLINEなんぞやるわけない・・・実際にアリバイの証人まで居たりする)からメッセージが届いた後、しばらくして消失に気づいた、という状況です。どうも、かなりおかしい状況のような気がします。なんとなくバックドアとかルートキットの匂いがします。LINE自体が問題なのか、LINEを狙ったアプリをインストールしてしまっているのかはわかりませんが。

<追伸>
FATフォーマットなので、FATテーブルの書き込みに失敗しただけなのかもしれません。ただ、書き込み失敗でSDカード丸ごと初期化というのも不思議な気がしますが・・・。

それはさておき、とにかく画像ファイルの救出を試みましたので、その記録です。

1.イメージファイルの吸い出し

なにはともあれ、現在の状態を保存します。この手の作業ではオリジナルには手を加えないのが鉄則です。なので、SystemRescueCDで起動したPCにて、

として、ディスクイメージを吸い出します。ここで、/dev/sdxはイメージファイル保存用のHDDのUSBハードディスク、/dev/sdyが救出対象となるSDカードです。吸い出したらSDカードは大切に保管し、さらに、

として、イメージファイルのコピーを作成します。このコピーに対して色々トライしていきます。
(実際には、さらにこのコピーをLinuxMint13マシンのローカルHDDにコピーしておきます)

2.ファイルの観察

として、/media/FATにイメージファイルをマウントして観察します。どうやら、SDカード上のファイルが全消去されたか、論理フォーマットされてしまっているかのようにファイルが何もなくなっていました。SDカードはFATフォーマットなのでアクセス権が及ばないはず。SDカードへのアクセスを許可したアプリからは、おそらくどんなアプリからも全消去とか不正な参照・書き換えなどが可能なのではないかという気がします。

3.ツールのインストール

途中、試行錯誤と紆余曲折があったのですが、ここでは端折って、最終的な救出方法のみ記載します。ツールとしてはPhotoRecとTestDiskを使用し、環境としてはLinuxMint13 x64で行いました。

まず、SynapticでTestDiskを検索してインストールします。さらに、PhotoRecをこちらからダウンロードしました。PhotoRecにもTestDiskが同梱されているようですが、先にTestDiskはインストールしてしまっています。(なので、実際どちらが動作したかわかりません)

PhotoRecは展開するとスタティックリンクされた実行ファイルが出てくるので、このディレクトリを丸ごと ~/TEMPに移動し、イメージファイル(Copy-Of-SDCARD.IMG)も~/TEMPの下にコピーします。さらに、救出したファイルを保存するディレクトリを作成しておきます。

4.ファイル救出実行

カレントディレクトリを ~/TEMPに移動してから、

として起動します。下の方に「rootじゃないといくつかのディスクが見えないよ」という表示が出ますが、イメージファイルに対する操作なので問題ありません。
そのまま「Proceed」を選択したまま「Enter」を押します。

次にどのパーティションを対象にするか聞いてきますが、そのままで問題ありません。「Search」を選択したまま「Enter」を押します。

次にファイルシステムを聞いてきますが、FATがすでに選択されているのでそのままで問題ありません。「Other」を選択したまま「Enter」を押します。

次に消去されたファイルのみをサーチするのかどうか聞いてきますが、今回はSDカード内のファイルをすべてサルベージしたいので、「Whole」を選択して「Enter」を押します。

次にサルベージしたファイルの保存先を聞いてくるので、適当な箇所を選んで「c」を押します。

するとサルベージが始まります。(適当なサイズ毎にサブディレクトリが切られるようです)

しばらくすると終了します。今回は4500個のファイルが救出されました。

5.ファイル名の修正

出来上がったファイルはファイル名がグチャグチャになっています。幸い、EXIF情報は生きている(というか生きてないとJPEGファイルとして成り立ちませんが・・・)ようですので、EXIFに基づいて撮影日時に基づいたファイル名に修正します。
ファイル名が修正できれば、写真のグループ分けも容易になるはずです。

各サブディレクトリにて、

$ jhead -n%Y%m%d-%H%M%S f*.jpg

として、ファイル名を修正していきます。fで始まるファイル名は大きな写真のようですので、まず修正されたファイルを集めます。その後、各サブディレクトリにて改めて

$ jhead -n%y%m%d-%H%M%S *.jpg

として残りのファイルのファイル名を修正してファイルを回収します。

完全にはファイル名が修正できないので、適当に手作業を加えながら、画像回収を完了させました。

ウチのデジカメたちを整理してみた

うちのデジカメたちを整理してみました。数えてみたら11台。うーん。

  1. CLIP-IT80(富士フィルム)
    最初に買ったデジカメ。1998年発売。85万画素。固定焦点5.5mm(35mm換算40mm)。A60購入後は会社用デジカメとして使用。
    電源入れたら動いたけど、スマートメディアを読み込むためのリーダーが無い・・・。
    GCLIPIT80-1 GCLIPIT80-2
  2. PowerShotA60(キヤノン)
    2台目。2003年発売。200万画素。非常に気に入っていたカメラ。A70とCCDの画素数が違うだけとのことだったので、画素数が少ない(=ノイズ特性が一般的に良好)方を購入。3倍ズームがついて値段も手頃で絵も綺麗。マニュアル撮影ができて面白かった。
    GPSA60その後、ソニー製CCDの不良(内部で接続が外れるらしい)による修理を経て、
    ヤフオクで格安で入手した防水ケースと共にシュノーケリング用カメラとして使用。
    Gs_IMG_1535R Gs_IMG_1547R Gs_IMG_2145R Gs_IMG_2166R Gs_IMG_2268R(ここまでの5枚は撮影後にホワイトバランス補正している)
    Gs_IMG_4182 Gs_IMG_4264 Gs_IMG_5039 Gs_IMG_5164各地で撮影後、セブ島でシュノーケリング中に浸水。ケース内で海水の電気分解による塩素ガスが発生して電池電極が融けかかったものの、幸い気づくのが早かったため故障はしなかった。
    Gs_IMG_6085_R Gs_IMG_6129_RGs_IMG_5952_R (この3枚が浸水直前の画像。この3枚も色補正してある。)
    このデジカメ、添付メディアは8MBくらいのCompactFlashだったけど、その後、1GBのCompactFlashでも動いた。しかしCompactFlashの速度向上につれて、連写の速度も向上。速すぎるCompactFlashでは時々撮影に失敗するという現象に出くわした。
  3. SP-560UZ(オリンパス)
    3台目。2007年発売。イオンレイクタウンのオープンの際にワゴンセールされていたのを購入。スーパーマクロモードで小さな物を写したり、自作のインターバルタイマーを接続してTimeLapse動画を作ってみたり、面白いカメラでした。
    OLYMPUS DIGITAL CAMERA OLYMPUS DIGITAL CAMERA OLYMPUS DIGITAL CAMERA
  4. Optio E50(ペンタックス)
    2008年発売。800万画素。旅行にいくために成田に向かう途中で「カメラの充電器忘れた」という嫁に、成田のイオンで買わされたデジカメ。とにかく写るものという選択だったので絵が綺麗とは言えなかった。また、単三電池2本で駆動のため、アルカリ電池での場合に恐ろしく電池の持ちが悪かった。(それでも後述のSZ-30MRよりマシだし、エネループであればそれなりには持った・・・が、充電式電池をまともに使えない嫁にはどうにもならなかった)
    現在は会社の机の中に放置。たかがデジカメを使うのに1日以上前に設備としての予約がいるというのは馬鹿馬鹿しいので自前で準備。
    GOPTIO
  5. PowerShot S90(キヤノン)
    2009年発売。1000万画素。SP-560UZでは大きくて普段持ち歩きにくいので購入。裏面照射CCD搭載で暗いところでも綺麗に写るようになった。F2のレンズ搭載でボケさせることもできる。・・・が、暗いところで綺麗に写るところを見せたら、購入直後に嫁さんに奪われてしまった。現在も稼働中。
  6. CyberShot HX5V(ソニー)
    2009年発売。S90を奪われてしまったので代わりに購入。裏面照射CMOSセンサ搭載で暗いところでも写るけど、ワイド端でもF3.5なのでS90ほどの面白みはない。ただ、このデジカメ、なによりも動画機能が素晴らしい。強烈な手ブレ補正がかかるので、スキーの際に滑りながら手持ちビデオ撮影ができる。こんなビデオカメラが自分が学生のころにあれば・・・と思う。10倍ズームは実用的で、何があるかわからないけどとにかく1台持ち出すというならこいつだった。
    GHX5V-2GHX5V-1
  7. EOS Kiss X2ダブルズーム(キヤノン)
    2008年発売だけど、2009年にX3が出てから安くなったところで購入。その後、便利ズームB003とか、F2.8通し標準ズームB005とか購入。やっぱり綺麗です。さらにEF-S 10-22mm F3.5-4.5 USMとか購入して、広角レンズの楽しさにハマる。ただ、やっぱりデカい。重い。「写真を撮りにいくぞ~」という気合がないと持ち出すのが億劫になってしまう・・・。
  8. IXY210F(キヤノン)
    CHDKを動かすためのデジカメとしてPC DEPOにて3,980円にて中古品を購入。まだ現行機種だった間だったと思うのだけど。ソッコーでCHDKを導入してTimeLapse撮影用カメラとして使用。「ボ撮ルンです 」と組み合わせて東京スカイツリーからTimeLapse動画を撮影したりした。GIX210F結構綺麗に写ることと小さくて軽く、電池の持ちもいいので、荷物を極力減らしたいけどスマホのカメラじゃなぁ・・・という時に放り込んでおくカメラになった。
  9. RICOH PX(リコー)
    防水デジカメ。自分用。残念ながら水中(というより動きながら?)で結構ピントを外すことが多い。しっかりした感じでアウトドアでの安心感はあるのだけど。
    GPX-1 GPX-2 GPX-3 GPX-4
  10. FinePix Z33WP(富士フィルム)
    防水デジカメ。嫁用。非常にチャチな感じがするが、問題はない。室内で撮影するとPXの方が綺麗にみえるが、屋外や水中ではRICOH PXよりも絵作りは綺麗だと思う。さすがフィルムの会社といったところか?
    GWP-1 GWP-2 GWP-3 GWP-4 GWP-5
  11. SZ-30MR(オリンパス)
    2011年発売。HX5Vに変わる「とりあえず持っていこう」という時用にSP-560UZなみの楽しさと小型化を期待して購入。しかし強烈な電池の持ちの悪さで落胆させられてしまう。寒いところでは数枚撮ったらもう電池マーク・・・。電池の持ちさえよければいいデジカメなんで、もう5ミリ厚くてもいいから一回り、二回り大きな電池にしてほしかった・・・。ちなみに電池はRICOH PXと同一形状。
    OLYMPUS DIGITAL CAMERAOLYMPUS DIGITAL CAMERA OLYMPUS DIGITAL CAMERA OLYMPUS DIGITAL CAMERA

 

昨日の戦利品

昨日は帰りに時間があったので秋葉原に寄ってみました。
といっても、たいしたものは買ってないです。

IMG_6350s

まずはSanDiskのMicroSDHC 8GBを2個。RaspberryPi用にSDHCが欲しかったのですが、SDは色々ランク分けがあった上に、高かったのでMicroSDHCにしました。SanDiskにしたのは以前にベンチマークした際にSanDiskは実効で高い性能がでていたからです。やっぱり信頼のSanDiskですね。税別1個800円くらい。

IMG_6351s

こちらも以前ベンチマークで驚異的スピードを出したSanDisk製USB3.0メモリの16GB版。税別2093円。

6349s

最後はTranscendの無線LAN内蔵SDHCカード。スマートフォンからデジカメ内の画像にアクセスできる、というので衝動買いで購入したのですが、うちに帰って調べてみたらコイツを入れようと思っていたHX5Vには対応してないとのこと。税別4562円。

Linuxで写真をHDR処理する

先日、所用があって出かけた帰りに天気が良かったので散歩していました。で、持ち歩いていたカメラで写真を撮っていたのですが、都内の空気はちょっと霞んでいるせいもあって、どうも写真が白っぽくなっていけません。適正露出を何度も試してもいいのですが、それも面倒なのでオートブラケット撮影を試みてみました。

しかし、それでもなかなか思ったようにはなりませんので、帰宅後にLinux上でHDR処理を試みてみましたら、こんな結果になりました。

HDRについては以前調べたことがあって、Linuxでもqtpfsguiというソフトウェアを使うと可能なことがわかっています。今回、このqtpfsguiを使ってみました。環境はLinuxMint13(32bit)とLinuxMint11(64bit)です。

“Linuxで写真をHDR処理する” の続きを読む

CHDK/Luaを使うための情報

CHDK/Luaを使いこなすための情報収集をしました。

  • http://chdk.wikia.com/wiki/Lua
    CHDKのWebサイト内のLuaに関する説明ページ
    ここに重要なリンク集や、スクリプトの起動方法、サンプル、ライブラリに関する情報、スクリプトの例などがある。
  • http://www.lua.org/home.html
    Lua言語に関するページ。
    LuaはCHDKオリジナルの言語というわけではなく、ブラジルのリオデジャネイロのPontifical Catholic(カトリック?)大学で設計・実装・メンテナンスされている汎用の言語のようです。特徴は高速性、移植性、組み込み可能、パワルフかつシンプル、小さい(ソースは20Kライン)、フリー(MITライセンス?)で、なおかついろいろな商業製品にも採用されている・・・らしいです。
  • http://chdk.wikia.com/wiki/Lua/Lua_syntax
    Luaの文法の説明。C言語でもなく、BASICでもなく、PerlやPythonともまた違う感じです。
  • http://chdk.wikia.com/wiki/CHDK_Scripting_Cross_Reference_Page
    CHDKで使える関数の一覧
  • http://chdk.wikia.com/wiki/Lua/Lua_Reference
    Luaのライブラリの説明

とにかくインターバル撮影

IXY210FにせっかくいれたCHDK、インターバル撮影ができなければ意味がありません。

で、ググってみたら、こちらのページ
基本的にはコピペのようですが、とにかく追試して実際に動作することを確認できました。(感謝)

で、ここで使われているスクリプトが、Luaというスクリプトです。

この説明は

http://chdk.wikia.com/wiki/Lua

にあって、最初に参考にさせていただいたスクリプトもここに記載されているものでした。

uBASICというスクリプトに比べてかなり強力なことができそうなので、調べてみたいと思います。

IXY210FにCHDKを入れてみた

CHDKを入れてTimeLapse撮影をするために購入したIXY210Fですが、なかなかCHDKの導入の方法が分からずそのままにしていました。・・・・が、今回CHDKの導入方法がわかりましたので、試してみました。

インストール(というか導入)

参考:CHDK Installation Guide.pdf

  1. ファームウェアのバージョン確認
    CHDKを入れる際は元々入っているファームウェアのバージョンがわかっていないといけません。
    通常の機種だとSDにルートディレクトリに「ver.req」や「vers.req」という空のファイルを置いたSD Cardを挿入して電源投入し、特定のキー操作をするとバージョンが表示されるはずです。
    ・・・・・されるはずなのですが、ちっともうまくいきません。これがしばらく放置していた原因です。
    今回は諦めて(最悪、復活不可になってもいい、と覚悟して)、4種類あるファームウェアを総当たりで試してみることにしました。
  2.  CHDKファイルのダウンロード
    http://chdk.wikia.com/wiki/CHDK
    に各機種用のファイルがあるように見えますが、IXY210F用のものは見当たりません。
    まだ開発中なので、「for Developpers」のリンクを辿った
    http://chdk.wikia.com/wiki/For_Developers
    に海外での機種名「ELPH100 HS (IXUS 115 HS & IXUS 117 HS)」で開発ページをみることができます。
    そこから上の方の地味な「Downloads」のリンクを辿って、さらに「The Latest Builds – Unstatble trunk 1.1」を辿った先に、開発中の対象機種を含めたzipファイルのダウンロードリンクがありますので、とりあえずFirmware1.01用のa,b,cバージョンのそれぞれのファイルをダウンロードしました。
    なお、「http://chdk.wikia.com」の下のページは(多分マルウェアだと思うのですが)ダウンロードやポップアップの広告リンクが『これでもか!』というくらい多数出てきますので、うっかり踏まないよう気をつけないといけません。ダウンロードしたファイルは展開しておきます。
  3. SD Cardのフォーマット&書き込み
    SD Cardの作成、と言った方が良いかもしれません。自分は
    http://chdk.wikia.com/wiki/Prepare_your_SD_card
    のページを参考にしました。
    SD Cardをフォーマットして、ブート可能にセット、ファイルを書き込むようなのですがそれをやってくれるツールのLinux版がLICKS(Linux Installer for CHDK and SDM)です。
    ここで、 コピーするファイルのコピー元(「Copy all files from」)に上でダウンロードしたCHDKファイルを展開したディレクトリを指定して、下の方の「Prepare Card」を押すとSD Cardのフォーマットと書き込みをやってくれます。書き込みが終わったら「Eject Card」でSD Cardを取り出します。
    なお、4GB以上のカードでパーティションを切って使うフォーマットにも対応しているようですが、いまのところカメラ側でパーティションを切り替える方法がわかりません・・・。
  4. CHDKを起動させる
    書き込まれた SD Card をライトプロテクト状態にしてIXY210Fにセットして電源ONします。
    自分の場合には3種類のファイルをトライして、1.01B用のファームウェアで起動しました。起動は電源ボタンで起動する場合と再生ボタンでしか起動しない場合がありましたが、法則はまだよくわかりません。
    ファームウェアのバージョンが違っていると、うんともすんとも言わなくなりました。自分の場合は SD Cardを取り出して電源ボタンを押しても何とも言わなくなったので、少し焦りましたが、電池を外して10秒くらい待つとカード無しで起動できる(普通のSDならカードありでも起動するでしょうが)ことが確認できました。
    他の機種でも電池を外せば復活するのかはわかりませんので、ご注意を。
  5. 起動後の操作
    CHDKの拡張機能の設定画面を出したり、スクリプトを起動したりするには「FUNC.SET」を押しながら「ズーム拡大(つまり右)」の操作をします。そうすると画面下に<ALT>表示がでますので、この状態で「MENU」を押すと拡張機能のメニューがでます。<ALT>のままシャッターを押すとスクリプトが動作するようですので、通常の撮影画面に戻るには、再度「FUNC.SET」を押しながら「ズーム拡大(つまり右)」の操作が必要です。

使い方は他のページにゆずりますが、いまのところInterval撮影に必要なスクリプトがうまく動作しません・・・・。
ベータ版だからでしょうか・・・・?

TimeLapse動画で空を撮ってみました

ちょっと前に作ったTimeLapse用タイマーを使ってTimeLapse動画で空を撮ってみました。

撮影に使用したカメラはSP-560UZで、場所は自宅ベランダから。撮影したJPG画像をAviDemuxで合成しています。合成の際にCROPをかけて空以外のもの(建物など)は切り落としています。(避雷針が残っちゃってますが、気にならないのでよしとしましょう)

1回目

マニュアルフォーカス、撮影条件(シャッタースピード、絞り)もマニュアルです。

撮影中は放置してあったのですが、ご覧の通り途中から曇り出して空が暗くなったために真っ暗な画像になってしまいました。

2回目

撮影条件がマニュアルだと空の明るさに追従できなくなるので、絞り優先に変更して続きを撮影してみました。もう夕方なのでかなり暗かったです。

既に空一面曇りなのでナニですが、途中で空がどんどん暗くなるのに、カメラがシャッタースピードを自分で調整して明るさに追従してくれています。

お手軽に撮影する分にはこちらの方が良さそうです。

TimeLapse用タイマーの製作

金環日食をEOS Utilityで連続撮影したものをAvidemuxでつないでみたら面白かったのに味をしめて、TimeLapse撮影用のタイマーを製作してみました。

必要要件は、

  • 電池で動作すること
  • 現地では単体で動作可能なこと
  • きめ細かい設定ができること
  • 製作が簡単なこと
  • 手持ちのカメラであるCanon EOS Kiss X2およびオリンパスSP-560UZで動作すること
    (SP-560UZはレリーズケーブルはつくし、マニュアルモードはあるしで、多分TimeLapseに向いていると思う・・・)

などを考えました。これらの要件を以下のような設計仕様に落とします。

  • 電池はなるべく小型化することを考えて単4電池1本の構成とし、HT7733Aによるステップアップレギュレータで3.3Vを生成することにしました。
  • きめ細かい設定については、制御はワンチップマイコン(PIC16F1823)で行い、設定は115.2kbpsのシリアルUART経由で行うことにしました。シリアル接続は秋月電子の新製品のケーブルを使えるようにしました。
  • 設定情報はPIC16F1823の内部のEEPROMに保存することとします。
  • 現地の状況に応じて設定を変える際にPCを必要としないように、設定は16種類をあらかじめEEPROMに保存しておき、ロータリーDIPSWで選択するようにします。
  • 動作状況がわかるようにLEDを一つ取り付けて、状態に応じてLEDを点滅、点灯させます。

で、適当に回路図を引きます。ちゃちゃっと試してみる版の回路図なので、デジタルトランジスタのDTC123Aをはじめとして、適当なシンボルを使っています。

そして、ちゃちゃっと秋月ユニバーサル基板で製作しました。ケースは100円ショップで見つけたポリプロピレンのケースにハンダごてでケーブルを通すための溝をつけました。

カメラ側は2.5mmのステレオミニプラグになっていて、 EOS KissX2につなぐ場合はそのまま接続(まだ試してません)、SP-560UZにつなぐ方は以前改造したリモートレリーズに接続します。

接続するとこんな感じになります。

HITECH-Cでソフトを作って動作させてみると、電池の消費電流は撮影直前のLEDの点灯が多い時間帯で20mA程度、撮影の合間の待ち時間では10mA程度でした。単4のエネループの容量は700mAhですから、1回の充電で20時間程度は動作しそうです。プログラムの内容としてはもう少し機能を追加したい所でしたが、ROMもRAMもケチケチで作っても95%程度使ってしまっており拡張の余地はありません。

8bitのPICではスタックポインタがない(正確にはスタックフレームが作れない)ので、ローカル変数も静的にメモリ割り当てされてしまうように見えます。そのために、メモリを減らそうと思うとコードサイズが増えてしまいます。PIC12F1822/16F1823は32MHz動作するようになったため、外付けデバイス無しでUARTで115.2kbpsが使えて、いろいろ便利な面はあるのですが、所詮アーキテクチャが・・・・なので、簡単な用途にしか使いにくいところです。

拡張の余地があれば、FusionPCBで専用基板を作ってみようかとも思っていたのですが、拡張の余地がないのでは面白くないので、専用基板を作るのはやめにしました。(ライブラリを作る手間もかかる割りに、面白いことができないのでは・・・ね)

ただ、今回の製作では設定にPCが必要になってしまっています。これを無しにする方法は考えようかな、と思っています。