iTermの新しいバージョンには、ターミナル内に画像を表示できる機能がついている。
(公式ページの画像を転載)
画像処理などのプログラムを書くとき、ちょっとした変更を加えて実行するのを繰り返して何度も試行錯誤することが多い。そういうときに、iTermの画像表示コマンドを使うと高速にトライアンドエラーできて捗る。
たとえば、画像から顔認識するプログラムを書くとする。このとき、標準出力に画像バイナリを出力するようにしておく。
import cv2
import sys
path = sys.argv[1]
cascade_file = "/usr/local/Cellar/opencv/2.4.12_2/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
image = cv2.imread(path)
cascade = cv2.CascadeClassifier(cascade_file)
faces = cascade.detectMultiScale(image)
(x, y, w, h) = faces[0]
flag, buf = cv2.imencode('.png', image[y:y+h, x:x+w])
print(buf.tobytes())
pipeして画像表示コマンドに流すとiTerm内に画像を表示できる。画像を名前をつけて保存したり、GUIで表示したりする処理をプログラムに書かずにすむ。
python face_detect.py ~/Downloads/trump.jpg | term-img
term-img というnpmで入るコマンドを使っている。公式のimgcatコマンドでも同じだと思う。
画像を保存したい場合は、標準出力を保存すればいい。
python face_detect.py ~/Downloads/trump.jpg > president.jpg
ほかのコマンドと組み合わせる
顔がでかすぎるから小さくしたいときもあると思う。そういうときは、たとえば imagemagickにpipeから流すことでリサイズできる。
python face_detect.py ~/Downloads/trump.jpg | convert -resize 200x200 - jpg:- | term-img
グリッチしたくなったとき
急にアートな気分になったときは、そのあとにsedに流して画像を壊せばいい。
python face_detect.py ~/Downloads/trump.jpg | convert -resize 64x64 - jpg:- | sed 's/0/1/g' | term-img
たくさんグリッチしたくなったとき
さらに破壊衝動を抑えられなくなったときには、for文で回すとそのまま画像が表示されて高速に破壊された画像を確認できる。
for i in $(seq 1 9); do python face_detect.py ~/Downloads/trump.jpg | convert -resize 64x64 - jpg:- | sed "s/0/$i/g" | term-img; done