OpenCV・PILを使ってブログアイコン(favicon)を作ってみた。
前回、ブログアイコンを作るためにOpenCVをインストールしました。
今回は実際にブログアイコンを作ってみました。
最新版(2018/12/26)は以下の記事参照
www.kinacon-blog.work
【ブログアイコンについては以下】
ブログアイコン(favicon)を高精細ディスプレイに対応するなど、見やすく表示されるようにしました - はてなブログ開発ブログ
ブログアイコンを作るに当たって、問題が発覚しました。
問題
- OpenCVでひらがなの描画ができなかった
- ひらがなの良いフォントがなかった
解決方法
- PIL(最初から入ってました)を使用する
- フリーの日本語フォントをダウンロードする
コード
PILで日本語を入力するところは以下のサイト参考にしました。
【OpenCV】【Python】画像上に日本語のテキストを描画 - Qiita
ブログアイコンのサイズは64×64が最大らしいのでこのサイズで作りました。
スマートフォン(iPhone、Android)のホーム画面の
ショートカットは192×192になるので
結局、192×192にしておけばよいのかな?
わたしは、スマホは別にいいので今回は64×64で作りました。
(cv2.resizeでサイズは変えられる)
# -*- coding: utf-8 -*- import cv2 import numpy as np from PIL import ImageFont, ImageDraw, Image #色はBGRで設定する def put_jtext(bgr_img, text, point, font_size, color): # 日本語フォントを画像に描画する font_path = "/home/kina/genjyuugothic-l/GenJyuuGothicL-Bold.ttf" font = ImageFont.truetype(font_path, font_size) #PILはRGBで処理 color_rgb = color[-1::-1] rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) pil_img = Image.fromarray(rgb_img) draw = ImageDraw.Draw(pil_img) draw.text(point, text, fill=color_rgb, font=font) rgb_img = np.asarray(pil_img) bgr_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2BGR) return bgr_img # ベース画像を作成 width = 360 height = 360 base_img = np.zeros((height, width, 3), np.uint8) # デザイン # 背景を黄色にする color = (0,255,255); # 黃 base_img[:] = tuple(color) # 文字を書く text1 = u"きな" text2 = u"こ" point1 = (width/2-140,height/2-140) point2 = (width/2-70,height/2-20) red = (0, 0, 255) #赤 font_size = 140 dst_img1 = put_jtext(base_img, text1, point1, font_size, red) dst_img2 = put_jtext(dst_img1, text2, point2, font_size, red) # 円を書く cv2.circle(dst_img2, (width/2, height/2), 160, red, 20) # リサイズする size = (64,64) dst64 = cv2.resize(dst_img2,size) cv2.imwrite('favicon_64.jpg', dst64)
はてなブログでブログアイコンコンを設定
- Settings を開く
- Blogaiconに参照ボタンで画像を設定
- 左下のUpdateをクリック
以上。
詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識
- 作者: Gary Bradski,Adrian Kaehler,松田晃一,小沼千絵,永田雅人,花形理
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/05/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
pythonで端末画面を保存する。
ブログにコマンドラインを貼り付けるとき
以下の作業を毎回行っていた。
結構めんどいので、自動化しようと思う。
pythonの勉強がてら端末画面切り出しアプリを作ってみます。
pythonでスクリーンショットの取り込み
まずは、スクリーンショットの取り込みです。
pythonではPyAutoGuiを使用するとスクリーンショットが取得できるようです。
PyAutoGuiのインストール
PyAutoGuiはpipでインストールする。
sudo apt install python-xlib scrot pip install pyautogui
コード
import pyautogui sc = pyautogui.screenshot() sc.save('screen.png')
pythonでアプリケーションの座標取得
次は端末画面のみをスクショするため、端末の位置座標を取得します。
subprocessでxwininfoを使用すれば取得できるようです。
from subprocess import Popen, PIPE import re cmd = ["xwininfo", "-name", terminal_name] p = Popen(cmd, stdout = PIPE, stderr = PIPE) ret = str(p.communicate()) coord = re.search('X:\s+(\d+)[^Y]+Y:\s+(\d+)', ret) appwin_x,appwin_y = coord.groups()
完成
# -*- coding: utf-8 -*- import os import sys import re from subprocess import Popen, PIPE import pyautogui class SaveTerminal(): def __init__(self, argvs): self.argvs = argvs # コマンドライン引数の判定処理 if len(self.argvs) == 2: filename = argvs[1] if os.path.splitext(filename)[1] != '.png': filename = os.path.splitext(filename)[0] + ".png" elif len(self.argvs) == 1: filename = "default.png" elif len(self.argvs) > 2: print("エラー:引数は1つです。") exit() # osでユーザ名、コンピュータ名、カレントディレクトリを取得する。 user = os.getlogin() host = os.uname()[1] cdir = os.getcwd().replace("/home/"+user, "~") # ターミナルの名前 terminal = user + "@" + host +": " + cdir # コマンド cmd = ["xwininfo", "-name", terminal] # subprocessでのxwininfoの情報を取得する p = Popen(cmd, stdout = PIPE, stderr = PIPE) ret = str(p.communicate()) # xwininfoの情報から正規表現で端末の左上の座標を取得する coord = re.search('X:\s+(\d+)[^Y]+Y:\s+(\d+)', ret) appwin_x,appwin_y = coord.groups() # xwininfoの情報から正規表現で端末のサイズを取得する coord = re.search('Width:\s+(\d+)[^Y]+Height:\s+(\d+)', ret) appwin_w,appwin_h = coord.groups() # 切り出す領域を指定する。 # このアプリを呼び出す行は不要なのでサイズを高さを短くしている input = (int(appwin_x), int(appwin_y), int(appwin_w), int(appwin_h)-33) sc = pyautogui.screenshot(region=input) sc.save(filename) print("端末画面を「" + filename + "」で保存しました。") if __name__ == "__main__": argvs = sys.argv SaveTerminal(argvs)
引数にファイル名を入れればその名前で保存できます。
以上。
独学プログラマー Python言語の基本から仕事のやり方まで
- 作者: コーリー・アルソフ
- 出版社/メーカー: 日経BP社
- 発売日: 2018/03/20
- メディア: Kindle版
- この商品を含むブログを見る
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
ubuntu18.04にpipを入れた。
前回、ubuntu16.04でpipをaptで入れるとVersionが8.1.1から上げれずエラーが出る問題があったので
今回は最初から「get.pip.py」でインストールを試みる。
python2.7はget.pip.pyでインストール
sudo python get-pip.py
python3.6もget.pip.pyでインストールするが・・・エラー!?
sudo python3 get-pip.py
エラー
ImportError: cannot import name 'sysconfig'
以下の記事に解決策を発見
Ubuntu16.04にPython3.6をインストールするとget-pip.py実行時にエラー
python3.6はaptでいけるとのこと。
sudo apt install python3-pip
8.1.1じゃない!!
ubuntu18.04でAtomを入れ直した。
Atomがおかしくなった・・・編集画面が出てこない。
こんな記事があったので
Ubuntu 18.04のAtomで日本語入力できない?できるよ! : 回れ右の内輪差
AtomをPPAで入れてみた
sudo add-apt-repository ppa:webupd8team/atom sudo apt update sudo apt install atom
ちゃんと動いた。
USB関連のLinuxコマンド
USBカメラを接続に関して使用するコマンドを記載しておく。
階層的に表示
lsusb -t
詳細を表示
usb/のあとはlsusbとかで確認する。
lsusb -D /dev/bus/usb/003/007
USBドライバの表示
ls /sys/bus/usb/drivers ls /sys/bus/usb/drivers/uvcvideo/ #uvcカメラのドライバを確認
USBカメラが認識しなくなった。(解決)
エラー
カメラの情報を確認しようと以下をコマンドしたところ
v4l2-ctl -d /dev/video1 --list-formats-ext
Failed to open /dev/video0: No such file or directory
video0がない。
解決方法
とりあえず、以下で解決できた。
sudo mknod /dev/video0 c 81 0 sudo chmod 666 /dev/video0 sudo chown root.video /dev/video0 modprobe -a uvcvideo
ROS melodicでカメラ表示できなかったので、dockerでkineticの環境を作りました。
ros melodicでusbカメラの表示できなかったので、dockerでkineticの環境を作ることにしました。
dockerのインストールはこちらを参照しました。
- rosのイメージ取得する
sudo docker pull ros:kinetic
- dockerでイメージの確認する
sudo docker images
- コンテナを作成する。停止はexitか「ctrl + d」
sudo docker run -it ros:kinetic
- コンテナを確認と 止まってるコンテナを削除する
sudo docker ps -a sudo docker rm $(sudo docker ps -aq)
ダウンロードしたイメージにはcv_bridgeがないみたい。
ROSのパッケージをインストールする必要がありそうだ。
環境設定はdockerfileで作ったほうが良さそうだ。
今回はここまで。
プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化
- 作者: WINGSプロジェクト阿佐志保
- 出版社/メーカー: 翔泳社
- 発売日: 2018/04/11
- メディア: Kindle版
- この商品を含むブログを見る