2013年12月22日日曜日

[Android] 撮った写真を自動でバックアップするならBitcasaが便利


Androidで撮影した写真を自動でバックアップするためにはGoogle+に登録しないといけないのですが、あいにく僕はGoogle+を利用していません。そこで、何か他に良い方法はないかなーと探していたところ、最適なサービスを見つけました。

Bitcasaを使うと、簡単にAndroidで撮影した写真を自動でクラウドストレージにアップロード出来ます。

なぜBitcasaが良いと思ったのか、特徴とともに説明します。

無料で5GB〜20GBまで使える

Bitcasaに登録すると、無料アカウントでも標準で5GBのストレージが付いてきます。

さらに、スマホとPCにBitcasaのアプリケーションを入れるだけで、それぞれ500MBずつ容量が追加。合計で6GBを利用することが出来ます。スマホで撮影した写真が1枚あたり約3MBなので、ざっと2,000枚はバックアップ可能です。

また、他の人をBitcasaに招待すると、1人あたり1GBの容量が追加され、最大で20GBまで無料で利用できるようになります。一般的なスマホはデータフォルダの容量がが16GBか32GBくらいなので、十分すぎる量になるわけです。


設定が簡単

登録したはいいけど、アプリの設定が面倒だったり、使いにくかったりするのはあまりイケてないですよね。

その点、Bitcasaは非常にシンプルで使いやすいです。

撮影した写真を同期するには、設定の「カメラの自動アップロード」をオンにするだけ。写真をたくさん撮って転送量が気になる人は、「WiFiでのみアップロード・ダウンロード」を設定しておけば、WiFiに接続した時に自動で同期されます。



アプリが使いやすい

アプリの表示も簡潔で分かりやすくなっています。

メイン画面は、写真・音楽・ビデオ・文書と、ファイルの種類ごとにまとめられて表示されています。
例えば写真を選択すると、アルバムごとに写真の一覧がサムネイル表示されます。写真をタップすれば一枚ずつ拡大して閲覧でき、長押しすれば複数選択で共有したりお気に入り登録したりすることができます。
ギャラリーや他のエクスプローラ系のアプリと同様の挙動をするのでとても分かりやすいです。




アプリやウェブページの日本語対応など、まだイマイチな部分もありますが、それ以上に便利で使いやすいBitcasa!

アカウントの作成は、BitcasaのFreeプランの"Sign Up"から行えます。


2013年12月12日木曜日

[OpenCV] PythonのOpenCVで特定の色の画像を判別

複数の画像の中から、特定の色(の多い)の画像のみを抽出する方法を考えてみました。


1.RGB値の平均を求める方法


例えば、このトマトの画像が「赤い」かを判別してみます。



>>> import cv2
>>> img = cv2.imread('tomato.jpg')
>>> averages = img.mean(0).mean(0) # BGRの値を全ピクセルで平均した値
>>> averages
array([ 184.32241784,  194.90715962,  241.32643779])
>>> blue_average, green_average, red_average = averages
>>> if red_average > green_average and red_average > blue_average:
...     print "The image is RED"
... 
The image is RED

img.mean(0).mean(0) では、BGRの値を全ピクセルで平均した値を求めています。

いわゆる赤が BGR = (0, 0, 255) で表されるので、Rの値がBやGよりも大きければ赤い画像です(厳密にはBとGの値が同じくらいで、Rよりも有意に小さい必要がありますが)

この画像では、B,Gの平均値が約190であるのに対してRの平均値が240なので、「赤い」画像であると言って良さそうです。


2.BGRをHSVに変換して、色相から判別する方法


ウェブページなどではいわゆるRGB値(赤青緑)を用いて色を表現しますが、HSV値(色相・彩度・明度)を用いて色を表現する方法があります。

HSV色空間 - Wikipedia

このH(色相)を用いることで、画像が「赤い」かを判別することができそうです。

>>> import cv
>>> import cv2
>>> img_bgr = cv2.imread('tomato.jpg')
>>> img_hsv = cv2.cvtColor(img_bgr, cv.CV_BGR2HSV) # 画像をBGRからHSV色空間に変換
>>> average_hue = img_hsv[:,:,0].mean() # Hの値を全ピクセルで平均した値
>>> average_hue
11.173327464788729

ここで、赤が最も強い(Rの値がB,Gよりも高い)場合、H(色相)は300°〜60°に分布します(OpenCVでは値域が0〜179のため0〜30,150〜179)。よって、色相の平均値がこの値の範囲に収まっていれば、「赤い」画像になります。

ただし、色相を使う場合には注意点が一つあり、真っ白な点や真っ黒な点のように、どの色相にもあてはまる点の色相は0になります。このような点を含めて平均値を求めてしまうと、平均値は必ず0に近い値になってしまいます。このような点を排除するため、S(彩度)の値を使います。

彩度とは読んで字の如く「色の鮮やかさ」のことで、白や黒は0.0、赤・緑・青は1.0(100%, OpenCVでは255)です。よって、この彩度に閾値を設け、彩度が一定の値よりも低い点を排除して平均を求めることで、より正しい色相を求めることが出来ます。

以下が修正版のコードです。

>>> import cv
>>> import cv2
>>> img_bgr = cv2.imread('tomato.jpg')
>>> img_hsv = cv2.cvtColor(img_bgr, cv.CV_BGR2HSV) # 画像をBGRからHSV色空間に変換
>>> valid_hue_list = [[ hsv[0] for hsv in img_line if hsv[1] > 0]
... for img_line in img_hsv] #彩度が0より大きい点のみを採用
>>> average_hue = (sum([sum(line) for line in valid_hue_list]) / 
... float(sum([len(line) for line in valid_hue_list])))
>>> average_hue
21.157771912765661

先程よりも0から遠い、大きな値になりました。純粋な赤色ならばHの平均値は0.0になるはずですが、トマトのヘタは緑色(OpenCVでは色相の値が60.0)なので、その値に引っ張られて約20になったと思われます。


このように色相の平均を求めることで簡易的に色を判別できますが、他にも様々な方法が考えられます。

例えば、色相が赤・緑・青に属するピクセル数を数えて、その大きさが一定値を超えたらその色の画像である、と判断するような方法も考えられます。対象とする画像の特徴と計算時間等を考えることで、より良い方法が見つかるはずです。



2013年12月11日水曜日

[MacOSX] InterCheckというプロセスがCPUを占領している時の対応方法


なんか最近Macが重いなーと思ったら、InterCheckという名前のプロセスがCPUを1つ独占していました。これはどうやらSophos Anti-Virusのプロセスらしい。

さらに調べてみると、MacにインストールされていたSophosのバージョンが8で最新版ではないのが良くないみたい。

というわけで、古いSophosをアンインストールして新しいSophosをインストールしました。
今のところ、これで悪さをしなくなりました。


1.古いSophosのアンインストール


古いSophosは、/Library/Sophos Anti-Virus/Remove Sophos Ant-Virus.pkg からアンインストールできます。

Finderでの開き方がわからない人は、ターミナルを開いて open /Library/Sophos Anti-Virus/ と打つと Finder が開きます。

インストーラとか書いてあるけど、アンインストールされるのでそのまま実行してください。

メニューバーからSophosのアイコンが消えたら成功です。

詳しい方法は、Sophos Anti-Virus for Mac OS X アンインストール手順 (OS X 10.6 編)を参照。


2.新しいSophosのインストール


最新版のSophos9も個人利用ならば無償でダウンロードできます。

ちなみに Sophos 9.05(2013/12/11時点の最新版)から Mac OSX 10.9 Marvericksに対応しているそうです。

ダウンロードは、 Sophos Anti-Virus for Mac Home Edition から行うことが出来ます。



いやはや、もっと早く気付けばよかった。

[OpenCV] PythonのOpenCVで画像の連結

>>> import cv2
>>> img1 = cv2.imread('iphone.png')
>>> img2 = cv2.imread('imac.png')
>>> img3 = cv2.vconcat([img1, img2]) # 縦方向の連結
>>> cv2.imwrite('vconcat.png', img3)
True
>>> img4 = cv2.hconcat([img1, img2]) # 横方向の連結
>>> cv2.imwrite('hconcat.png', img4)
True

縦方向に連結した結果


横方向に連結した結果

2013年12月10日火曜日

[OpenCV] PythonのOpenCVで直線の描画

>>> import cv2
>>> img = cv2.imread('元の画像パス')
>>> cv2.line(img, (5, 5), (5, 100), (0, 0, 255)) # Draw Red Line
>>> cv2.line(img, (20, 20), (100, 20), (255, 0, 0), 3) # Draw Thick Blue Line
>>> cv2.line(img, (0, 0), (120, 120), (0, 255, 0), 5) # Draw Very Thick Green Line
>>> cv2.imwrite('出力先の画像パス', img)
True

こんな感じ。

2013年12月9日月曜日

[OpenCV] PythonのOpenCVで画像サイズの取得

PythonのOpenCVで画像のサイズを取得しようとした時の話。
画像はnumpyの3次元のndarray(配列)で定義されていて、画像サイズの取得には、numpy.ndarrayの属性を使ってあげればOK。
C++だと、cv::Matにはwidthやheightが定義されていたので、最初は戸惑うかもしれません。

例えば、横340px, 縦255pxの画像の場合は以下の通り。
>>> import cv2
>>> img = cv2.imread('画像のパス')
>>> img.shape
(255, 340, 3)
ちなみに最後の3は、BGRの3次元のこと。

頻繁に利用するならばこうしておけばとりあえず良いと思う。
>>> height, width = img.shape[:2]
>>> height
255
>>> width
340

紛らわしいのが size で、これは配列の要素数を表す。
>>> img.size
260100
260100 = 255 * 340 * 3 ということ。

ちなみに、配列の各要素のデータ型は、0~255までの符号なし8bit整数。
>>> img.dtype
dtype('uint8')

2013年12月8日日曜日

[OpenCV] MacOSX10.9にPythonのOpenCVをインストールして使うまで


重たい画像処理の計算を行う際には、計算速度を考えると圧倒的にC++でOpenCVを使うべきなのですが、ちょっとした画像の変換とかを行うだけならサラサラっと処理を書けるPythonでもいいかなと思い、PythonでOpenCVを使ってみました。

感想:いと遅し。


1.HomebrewでOpenCVのインストール


Homebrewにscienceのパッケージを追加。
$ brew tap homebrew/science

OpenCVをインストール。
$ brew install opencv

2.OpenCVをPythonのパスに追加


以下の内容を ~/.bash_profile に追記する。
$ vi ~/.bash_profile
# OpenCV for Python
# 2.X.Xの部分に自分がインストールしたOpenCVのバージョンを記入
export PYTHONPATH=/usr/local/Cellar/opencv/2.X.X/lib/python2.7/site-packages:$PYTHONPATH

~/.bash_profileを再読み込み
$ . ~/.bash_profile

3.PythonからOpenCVを使ってみる


試しに画像を表示してみます。
$ python
>>> import cv2
>>> img = cv2.imread('適当な画像のパス')
>>> cv2.imshow('ウィンドウ名', img)
>>> cv2.waitKey(0)

こんな感じで画像のウィンドウが表示されたら成功。


詳しい使い方は、OpenCVの公式ドキュメンテーションを見ればよくわかると思います。
Welcome to opencv documentation!

2013年12月2日月曜日

[ffmpeg] Skypeの通話を録音して低ビットレートのmp3ファイルで保存する



8ヶ月位前からSkype英会話を続けているのですが、復習用に会話を録音して保存しています。

Macの場合録音は非常に簡単で、QuickTime Playerのアイコンを右クリック、新規オーディオ収録で録音・保存できるのですが、保存形式がステレオのm4aファイルしか選択できません。すると、25分のレッスンを録音した場合約50MBのオーディオファイルになってしまい、1ヶ月で1.5GBも使ってしまうのでちょっと困ります。

そこで、録音したm4aファイルを、まとめて低ビットレート・モノラルのmp3ファイルに変換するシェルスクリプトを書きました。そもそも、Skype自体の音質もそこまで良いわけではないので、かなり圧縮してしまっても、全く問題なく聞き取れます。

HomeBrewでffmpegをインストール

$ brew install ffmpeg

m4aファイルを一括変換

$ vi m4a_converter.sh
#/bin/sh
# m4aファイルをmp3ファイルに変換するスクリプト

cd "m4aファイルの保存されているディレクトリ"
for f in ./*.m4a
do
    echo "convert ${f}"
    sf=${f##*/}
    fname=${sf%.*}
    ffmpeg -i ${fname}.m4a -acodec libmp3lame -ac 1 -ar 16000 -ab 24k ${fname}.mp3
    rm ${fname}.m4a


後は実行するだけ。
$ ./m4a_converter.sh

ちなみに、1ファイルのみを変換する場合は、

$ ffmepg -i 元のファイル -acodec libmp3lame -ac チャンネル数 -ar サンプリングレート -ab ビットレート 出力先ファイル

でOKです。

この変換をすれば25分のレッスンが大体5MB弱になるので、約1/10に圧縮されたことになります。すると、1ヶ月あたり約150MBなので、そのまま保存しておいてもそれほど邪魔にはなりません。

後はきちんと復習をできるか、がポイントですね。保存して満足してしまいそう。