Kinaconの技術ブログ

Ubuntuはじめました。

OpenCV・PILを使ってブログアイコン(favicon)を作ってみた。

前回、ブログアイコンを作るためにOpenCVをインストールしました。

今回は実際にブログアイコンを作ってみました。

最新版(2018/12/26)は以下の記事参照
www.kinacon-blog.work



【ブログアイコンについては以下】
ブログアイコン(favicon)を高精細ディスプレイに対応するなど、見やすく表示されるようにしました - はてなブログ開発ブログ




ブログアイコンを作るに当たって、問題が発覚しました。

問題

  • OpenCVでひらがなの描画ができなかった
  • ひらがなの良いフォントがなかった

解決方法

  • PIL(最初から入ってました)を使用する
  • フリーの日本語フォントをダウンロードする

フォントのダウンロード

以下のサイトより、源の角ゴシックLをダウンロードしています。

源柔ゴシック (げんじゅうゴシック) | 自家製フォント工房


コード

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 ―コンピュータビジョンライブラリを使った画像処理・認識

詳解 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言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

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


f:id:m-oota-711:20180810185559p:plain

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
ちゃんと動いた。

f:id:m-oota-711:20180810181718p:plain


パッケージとフォントは過去の記事と同様に設定

kinacon.hatenablog.com

kinacon.hatenablog.com


日経Linux 2018年 9 月号

日経Linux 2018年 9 月号

USB関連のLinuxコマンド

USBカメラを接続に関して使用するコマンドを記載しておく。

USBデバイスの表示

lsusb

f:id:m-oota-711:20180810073931p:plain

階層的に表示

lsusb -t


f:id:m-oota-711:20180810075514p:plain


詳細を表示

usb/のあとはlsusbとかで確認する。

lsusb -D /dev/bus/usb/003/007


f:id:m-oota-711:20180810075921p:plain


USBドライバの表示

ls /sys/bus/usb/drivers

ls /sys/bus/usb/drivers/uvcvideo/  #uvcカメラのドライバを確認

f:id:m-oota-711:20180810080651p:plain

v4l2-ctlを使う

インストール
sudo apt install v4l-utils
webカメラ一覧を表示
v4l2-ctl --list-devices


f:id:m-oota-711:20180810174325p:plain

バイスごとの詳細を表示
v4l2-ctl -d /dev/video1 --info


f:id:m-oota-711:20180810175132p:plain

バイスのサポートするフォーマットの組み合わせを表示
v4l2-ctl -d /dev/video1 --list-formats-ext


f:id:m-oota-711:20180810175143p:plain

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

f:id:m-oota-711:20180805175056p:plain


  • dockerでイメージの確認する
sudo docker images


f:id:m-oota-711:20180805174417p:plain


  • コンテナを作成する。停止はexitか「ctrl + d」
sudo docker run -it ros:kinetic

f:id:m-oota-711:20180805174658p:plain



  • コンテナを確認と 止まってるコンテナを削除する
sudo docker ps -a
sudo docker rm $(sudo docker ps -aq)

f:id:m-oota-711:20180805174818p:plain



ダウンロードしたイメージにはcv_bridgeがないみたい。

ROSのパッケージをインストールする必要がありそうだ。

環境設定はdockerfileで作ったほうが良さそうだ。

今回はここまで。


プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化