うまくスキップができない

理系大学院生の備忘録だったり,頭の中身

画像の色を検知する

目的

画像をインプットしたらその画像が何色なのかを判別してヒストグラムで可視化する.

目次

色識別方法

openCV で画像を読み込んで, HSV方式に変換して検出する.

色検知に関してはRGB方式ではなくHSV方式でするのが一般的らしい.
RGBでは一つの色を表現するのにR,G,Bそれぞれのパラメータを細かく設定する必要があるが,
HSVではHue(色相)で色を調節できるので都合がいいらしい.
HSV = Hue(色相),Saturation(彩度),Value(明度)

opneCVではそれぞれの値の範囲が
Hue(色相) : 0 ~ 180
Saturation(彩度) : 0 ~ 255
Value(明度) : 0 ~ 255
で表現される.

特に色相はこんな感じ(左が0で右は180)
f:id:appli-in:20180218183137p:plain

画像

今回用いる画像は以下の2つ

f:id:appli-in:20180218183716j:plain
画像1

f:id:appli-in:20180218183732p:plain
画像2

手順

まず画像を読み込みHSVに変換

img_scr = cv2.imread("picture_name.png")
img_hsv = cv2.cvtColor(img_scr, cv2.COLOR_BGR2HSV)

openCVでは画像をimreadで読み込んだときはRGBではなくBGRとして読み込まれているので

画像のサイズを取得し,検出した色を格納する配列を用意

height = img_hsv.shape[0]
width = img_hsv.shape[1]
pixels = []

ピクセルを調べてある閾値を満たしたらpixels[]に格納する.
ここでは白色や暗い色を検知したくないので
Saturation(彩度)を45以下
Value(明度)を32以上とした.

for y in range(height):
    for x in range(width):
        if (img_hsv[y, x, 1] > 45 and 32 < img_hsv[y, x, 2]):
            pixels.append(img_hsv[y, x, 0])

今回は色相を12分割して色を判断する.
ヒストグラムの出力

plt.xlim(0,180) # x軸の範囲
plt.xticks([0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180]) # x軸の目盛りの設定
plt.hist(pixels, bins=12, range=(0,180)) # ヒストグラムの出力 

その後最頻値を求めて その画像の色を判断する.

# 軸の作成 (0から180を13等分[12個の区間を出したいため]) 
bins = np.linspace(0, 180, 13)  

# pixelsをそれぞれの要素を12分割した色範囲に格納  
index = np.digitize(pixels,bins) 

# 最頻値を求めるためにCounterを使う
c = Counter(index)
print(c)
mode = c.most_common(1)

# 最頻値の出力
print(mode[0][0])

結果

f:id:appli-in:20180218185351p:plain
画像1の結果
Counter({1: 188904, 2: 4436, 3: 3005, 12: 2650, 4: 570, 5: 106, 6: 4})
最頻値 : 1

f:id:appli-in:20180218185445p:plain
画像2の結果
Counter({1: 5373, 5: 5372, 9: 5368, 11: 1998, 3: 1996, 7: 1996, 2: 39, 10: 39, 6: 37, 4: 36, 8: 34, 12: 30})
最頻値 : 1

一応カラーバーと見比べても判定できているっぽい

ソースコード

# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
from collections import Counter

# 画像を読み込み
img_scr = cv2.imread("tomato.jpg")

# BGR->HSV に変換
img_hsv = cv2.cvtColor(img_scr, cv2.COLOR_BGR2HSV)

height = img_hsv.shape[0]
width = img_hsv.shape[1]

pixels = []

for y in range(height):
    for x in range(width):
        if (img_hsv[y, x, 1] > 45 and 32 < img_hsv[y, x, 2]):
            pixels.append(img_hsv[y, x, 0])

plt.xlim(0,180)
plt.xticks([0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180])
plt.hist(pixels, bins=12, range=(0,180), align="mid",rwidth=1.0,color="blue")

bins = np.linspace(0, 180, 13)
print(bins)
index = np.digitize(pixels,bins)
c = Counter(index)
print (c)
mode = c.most_common(1)
print(mode[0][0])

AnacondaでopenCVを導入 windows10版

画像認識をやりたくて
pythonopenCVを導入したときに出たエラーとその対策 導入方法はエラー①へ

目次

環境

  • Windows10
  • Python3.6.1(Anaconda 4.4.0)

エラー①:ImportError: No module named cv2

最初に何も考えずにAnacondaに入ってるっしょとおもって

import cv2  

としたときのエラー
原因:そんなもの入ってません(ダウンロードしましょう)

まずopenCVをダウンロードしましょう
下記リンクから
自分のバージョンにあったファイルをダウンロード
https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

バージョンは コンソール上で

python -V

で確認
下図の様なものがでてきます
f:id:appli-in:20180212175703p:plain ここでは python 3.6.1で64bitなので
"opencv_python‑3.4.0‑cp36‑cp36m‑win_amd64.whl"
を選択
cp◯◯がpythonのバージョン
win_◯◯がOSのbit数(64の場合はamd64)

次にAnaconda promptを開きます
windonwsメニューから実行できます(下図赤枠部)
f:id:appli-in:20180212172833p:plain

openCVのwhlファイルをダウンロードしたディレクトリに移動して

 pip install opencv_python‑3.4.0‑cp36‑cp36m‑win_amd64.whl

を実行

エラー②:opencv_python-X.X.X-cpXX-cpXXm-win_amd64.whl is not a supported wheel on this platform

※Xは数字が入ります

原因:ダウンロードしたopenCVのバージョンが一致していない.
(python 3.6なのにopencv_python-3.4.0-cp37...をダウンロードしていたり)

python -V   

でバージョンを確認して適切なバージョンのものをダウンロードしましょう.

エラー③:ImportError: numpy.core.multiarray failed to import

ダウンロードして
これでいけるやろ
と思って

import cv2

としたときのエラー

原因:numpyのバージョンが合ってません
Anaconda promptで

pip install numpy --upgrade

でバージョンを最新にすると解決

Logicool M720 のジェスチャーボタンが壊れたので応急処置

研究室のPCのマウスとして
logicoolのM720 を使っているのですが

今日研究室にきて操作するとなんかおかしい
触っているだけなのにジェスチャーボタン(図1)を押したときの挙動がする...

f:id:appli-in:20180125064712j:plain
図1.ジェスチャーボタン

おかしいと思っていじっていると
いつもジェスチャーボタンを押すと鳴る"パカパカ"音がしない...
常に押された状態で固まってるみたい
押した後に反発して戻ってくるはずが,反発しない感じ

とりあえず
裏蓋を開けてネジを外す.
しかし,分解するには裏のすべり止めみたいのを剥がさなきゃいけないっぽい
(他の機種を分解した記事があった) ry0.github.io

困った...

上の記事と同じ機種で他の方も同様の現象が起こってるみたい
価格.com - 『2年1ヶ月で故障・・・』 ロジクール MX MASTER Wireless Mouse MX2000 [ブラック] Seven★Starsさんのレビュー評価・評判

しばらくして
どうやら底面と内部に余裕がなくて
押しっぱなしになっているらしいことがわかった
(反発するやつが機能しないのか?)

底面を図2の赤矢印の方向に力を加えながらジェスチャーボタンを押すといつもの挙動に!!

f:id:appli-in:20180125065035j:plain
図2.力を加える方向

何かを詰めて赤矢印の方向に力を加えられればとりあえず直りそう

机にあった付箋を何回か折りたたんで
ピッタリハマる様にカット

それを(図3のように)詰めてフタをしたら

f:id:appli-in:20180125065243j:plain
図3.折りたたんでカットした付箋と詰めるところ

とりあえずいつも通りの動きになった
以上で応急処置完了
※この時にネジをきつく締めすぎるとダメなので注意

一応2年の保証があるので修理できるけど(購入は2017年8月)
修論提出1週間前にマウスがないのは致命的なので保留
(こんな記事書いてる場合ではない)

とりあえず直ってよかった

b-mobile(格安SIM)の通信料

以前記事にした
b-mobileの通信料の請求がきたので公開
appli-in.hatenablog.jp

1ヶ月の通信料
1093(税込み) でした
通信データ量が1GB超えてなかったので(先月分の通信料の確認が出来なかった)
基本料金+電話代のみ
いかにキャリア通信を使っていなかったかが明らかになってしまった
正直1GBは超えるやろと思っていたけど
いい意味で予想を裏切られた

内訳はこんな感じ
通信料
f:id:appli-in:20180121175448p:plain

通話料 f:id:appli-in:20180121175515p:plain

どうやら
通信料は20始まりで19締めなんだけど
電話代に関しては月ごとの請求のよう

格安SIMにしてよかったー

SoftBankのiPhone6でも格安SIM

経緯

先日SoftBankで契約したスマホプランの2年契約が過ぎて更新月だったので
契約を見直そうとしたときに問題は起こりました...

iPhone6ではSIMロックを解除できないのです...

困った...

多くの格安SIMSIMロックを解除した端末でしか使えない.
SIMロックを解除していない場合
契約したキャリアのインフラを使ってるMVNOのSIMなら使える.

それじゃあY!mobileがあるじゃないか!
と調べてみるとY!mobileMVNOじゃないから
SoftBankiPhone6は使えないということが判明...
(同じ会社じゃないのかよ...)

調べて出てきたs-mobileはSoftBankiPhoneが使えるんだけど
データ通信のみ(電話番号がない)...
緊急連絡用に電話番号はないと困る...

auとかdocomoは結構選択肢の幅広がるのに...

でも,なんとかして月々の通信量を安くしたい!!
このままではSIMフリーの機種を
中古で買って格安SIMを使うしかないのか
と困っていたところにb-mobileが!!
www.bmobile.ne.jp

なんと
最低
月々990円
(めっちゃ安いじゃないですか)
で電話番号も持てる

あぁ最高か

即契約しました.

今まで月5000円近く払ってたのがバカみたいです
(最近のキャリアの通信料高くないですか??ホントに)

使ってみて

通信速度的には全然問題ないです.
しかも基本家ではWiFiで,研究室でもWiFiなので
キャリアの電波使うことないよね
外出先で調べもの程度だったら全然問題ないレベルの速度です.
めっちゃ速度遅かったらどうしようかとビクビクしてました.

まとめ

SoftBankiPhone6以前の機種使ってて
そろそろ契約更新かという人は検討の価値ありです.

契約のときに担当してくれたお姉さんも優しかったし(関係ない)

Karabiner-Elements キーマップ設定

明日がセンター試験で学校を追い出されたため早く帰ってきました.
受験生センター試験頑張って!

せっかく早く帰ってきたので
今までずっと放置していたmacのキーマップの設定をしました.

OSをSierraにしてからKarabinerが使えなくなって困っていたのですが
どうやらKarabiner-Elementsなるものが使えるらしく
とりあえずOSをアップデートしてKarabiner-Elementsをインストールしていたんですが
そのまま放置の状態でした.

研究室でつかっているキーボードが
FILCO Majestouch MINILA US67で

appli-in.hatenablog.jp

これがめちゃくちゃ使いやすい!
ホームポジション動かさずにバックスペースや十字キー押せるのが快適過ぎて

せっかくなのでFILCO Majestouch Likeな編集をすることに

目指すとこ

f:id:appli-in:20180112231518p:plain
目標キーマップ
"英数"または"かな"キーを押しながら(Fnの代わり)"E","S","D","F"で十字キー
"J" -> "Home","K" -> "End", ";"->"Back Space", ":"->"Return"
これだけでもだいぶ入力楽になるはず
(入力ソースの変換は下の画像の様にキーボードの設定からCommand+Spaceで変更している) f:id:appli-in:20180112232815p:plain

設定

"英数","かな"キーをそれぞれ正規の使い方をすることはもう一切無いのでこのように編集します.
(間違えて押してしまっても影響がないようにするため) f:id:appli-in:20180112233607p:plain

細かい設定はjsonファイルを作成してそちらを編集
公式ドキュメント(karabiner.json Reference Manual - Karabiner - Software for macOS)があるのでそちらを参照します.

jsonファイルを作成してその中にこのように設定を書き込みます.

{
  "title": "FILCO Majestouch MINILA Like Configulation",
  "rules": [
    {
      "description": "fn + f -> right_arrow",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "f",
            "modifiers": {
              "mandatory": [
                "fn"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "right_arrow"
            }
          ]
        }
      ]
    }
  ]
}

そしてそのファイルを

~/.config/karabiner/assets/complex_modifications/

の中に入れてKarabiner-Elementsを開いて
Complex_modificationsの"add rules"を押すと
こんな感じに表示されるので
f:id:appli-in:20180113014419p:plain
Enable を押すと適用されます.
※うまく行かない場合は再起動してみてください.

Karabinerのときと若干キーコードが変わっているっぽいので Karabiner-ElementsのEvent Viewerで確認したほうが良さそうです

書いたファイルはGithubに上げました
GitHub - YutaUme/Karabiner_Conf: Karabiner Configuration FIle

この記事によると
どうやらjsonファイル名は数字でないと認識しないこともあるみたい(もう修正されているのかもしれません)
qiita.com

これでだいぶタイピングが楽になった. (修論がんばろう)

溜まっていく下書きたち

最近お家ハック的な感じでラズパイ使って照明消したり
LEDマトリクス使って電光掲示板作ってみたりしてて
その他にも研究関連のプログラムについてとか
先月アメリカいったこととか
色々書きたいことがあって下書きまでかいて溜まっていくばかり...
今週木曜日乗り切れば少し余裕できるはずだし書いていこう
(書きたい事があることはいいこと)

そういえばTOEICの模試みたいの受けたら
文法力ゴミだったので英語の勉強しないとな.

タスク多すぎるんじゃ!!!