SSブログ
前の10件 | -

Android StudioでFire TV Stickのアプリ開発 [Android]

Fire TV Stick(4Kじゃないほう)を手に入れたのでいろいろ調べているうちに
初Androidマシンを手に入れたことに気づいた。
いくつかのアプリのインストールからAndroid Studioをインストールして
Androidアプリ開発を試して、実際にFire TV Stickへインストールして
実行するまでのメモです。

まずは Fire TV Stickに入れたアプリ。
1. AirReciever (iPhoneからの画面ミラー)
 有料ですがiPhoneの画面ミラーが便利です。
 検索画面から普通にインストール可能。

2. VLC
 無料の動画再生ソフト。
 家にはラズパイ上で動いているDLNAサーバーがあるのでそこに接続して再生できるのが良い。
 検索画面から普通にインストール可能。

3. KODI
 無料の動画再生ソフト。
 普通にアプリのインストールは出来ないので、PCにadbLinkをインストールして、そこからFire TV Stickへインストールしました。
 ネットでインストール方法を探すとES File Explorerを使う方法が出てくるけど、よく調べるとマルウェアっぽいのでやめたほうが良さそうな雰囲気。

ここからはPC上でのアプリ開発と、作ったアプリをFire TV Stickへインストールする方法。
1. Android Studio (PC)
 ここからダウンロードしてインストールします。
 Fire TV Stick向けにアプリ開発をするための注意点としては、
 Fire TV StickのOSが Android 5.1 (Lolipop) ベースなので、
 Minimum API level は "API 22: Android 5.1 (Lolipop) に合わせて、
 実行エミュレータ環境も Virtual Device に "Android TV (720p) API 22" を選択しておくこと。
 また、Kotlinを選択しておくことで、アプリ開発はJavaではなくKotlinで開発できる。
 実際のアプリ開発手順は省略。
 アプリをBuildするとコンパイル済みのパッケージが
  "<プロジェクトディレクトリ>\app\build\outputs\apk\debug\app-debug.apk" に作られる。

2. adbの使いかた (PC)
 コンパイルしたapk を Fire TV Stickへインストールしたり、ファイルを転送したりするツール。
 Android Studioをインストールすると下記にインストールされている。
 c:\Users\<ユーザー名>\AppData\Local\Android\Sdk\platform-tools

 コマンドプロンプトを起動して、そのディレクトリに移動して実行してみる。
 % cd \Users\<ユーザー名>\AppData\Local\Android\Sdk\platform-tools

 Fire TV Stick への接続
 先にFire TV StickのIPアドレスを調べておき、開発者オプションの
 ADBデバッガと不明ソースからのアプリをオンにしておく。
 % adb connect IPアドレス:5555
 Fire TV Stickに接続していいかの確認画面が出るので、OKを押すと接続できる。

 接続したことの確認
 % adb devices
 List of devices attached
 192.168.0.60:5555 device
 と出ていればOK

 うまく接続できていないときは、
 % adb kill-server
 % adb start-server
 などとしてみる。

 作ったapkのインストール
 % adb install <フルパスapkファイル名>
 Performing Push Install
 <フルパスapkファイル名>: 1 file pushed. 1.1 MB/s (2289198 bytes in 1.980s)
    pkg: /data/local/tmp/app-debug.apk
 Success
 と出ていれば成功

 apkのアップデート
 % adb install -r <フルパスapkファイル名>

 shellを起動する
 % adb shell
 > cd /storage/sdcard0/Movies
 など Fire TV Stickのファイル構造を見ることができる。

 動画ファイルを転送するのは /storage/sdcard0/Moviesへファイルを転送すれば良い。
 % adb push movie_1.mp4 /storage/sdcard0/Movies/
 これで、VLCなどを起動すると、ビデオのフォルダの中に転送したファイルが見れるようになる。

 切断
 % adb disconnect

nice!(1)  コメント(0) 

WSLでffmpegをコンパイル [WSL]

Windows Subsystem for Linux (以下 WSL)上でffmpegをコンパイルしてみた。

1. Windows10上にUbuntu 18.04をインストールする。
 方法は省略。
 その後最新にアップデートしておく。
 sudo apt update
 sudo apt upgrade
 その後コンパイラ環境をインストールしておく。
 sudo apt install build-essential
 sudo apt install nasm

2. コンパイル済みffmpegをインストールしてみる。
 sudo apt install ffmpeg
 試してみるが、内蔵aacのエンコーダはあるが音質が悪いらしい。
 音質のいいlibfdk-aacはライセンスの都合上バイナリ配布出来ないので、
 自分でコンパイルが必要になる。

3. 必要なライブラリをインストールしておく。
 sudo apt install fdkaac libfdk-aac-dev
 sudo apt install libx264 libx264-dev
 sudo apt install libvpx libvpx-dev

4. ffmpegのソースをダウンロードしてコンパイル。
 git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
 cd ffmpeg
 ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libvpx --disable-ffplay --disable-ffprobe --disable-debug --disable-x86asm
 make
 これで ffmpegのバイナリが出来る。

5. mp4ファイルへの変換
 ../ffmpeg/ffmpeg -threads 3 -i "input.mpeg" -c:v libx264 -b:v 900k -s 800x450 -aspect 16:9 -c:a libfdk_aac -b:a 48k -ac 2 -y "output.mp4"

6. VP9ファイルへの変換
 ../ffmpeg/ffmpeg -threads 3 -i "input.mpeg" -c:v libvpx-vp9 -b:v 900k -s 800x450 -aspect 16:9 -c:a libfdk_aac -b:a 48k -ac 2 -y "output.mkv"


タグ:FFmpeg WSL
nice!(0)  コメント(0) 

Rasberry Pi のPythonでRAW現像プログラムテスト [Raspberry Pi]

rawpyというPythonのモジュールでカメラのRAWファイルを読み込んで、
自分でRAW現像のプログラムがかけるという情報を得たので試してみた。
なお、作ったプログラムはgithubに置いてあるので、参照してください。
(ブログ中の画像ファイルはすべて画素数を小さく加工してあります)

参考記事 というか、下記の手順をそのまま試してみた。
ゼロから作るRAW現像その1 - 基本的な処理
http://uzusayuu.hatenadiary.jp/entry/2018/09/23/162412


1. 必要なモジュールのインストール
 % pip3 install rawpy
 としてみるとなにやら libraw が無いというようなエラーが出た。
 Raspberry Pi では使えないかと一瞬思ったが、librawというのが必要なのかも? と思い
 % sudo apt-get install libraw-bin libraw-dev libraw-doc
 % pip3 install rawpy
 あっさりインストール出来た。ついでに他に必要なモジュールもインストールしておく。
 % pip3 install imageio

2. 最初のテスト
 まずはrawpyがPENTAXのRAWファイル (*.PEF) に対応してるかが不安だったので、
 RAWファイルを読み込んで、RAWファイルの情報を取得するものを作ってみる。
 ファイルは raw_info.py (github参照)
 実行してみると、(下記は一部のみ表示)
 % python3 raw_info.py
 camera_whitebalance
 [13312.0, 8192.0, 9152.0, 8192.0]
 color_desc
 b'RGBG'
 sizes
 ImageSizes(raw_height=2624, raw_width=3936, height=2616, width=3896, top_margin=0, left_margin=0, iheight=2616, iwidth=3896, pixel_aspect=1.0, flip=5)
 ちゃんと情報が表示された。PENTAXに対応してて良かった。

3. try1 RAWファイルを読み込んで無理やり表示
 今回のテストとして下記のRAWファイルを入力した。
 ただし、この画像は通常の現像ソフトを使って明るさやコントラストなどを調整した画像です。
IMGP0243_e01_sa2_c2_1024_s.jpg

 最初のファイルは try1.py (githubを参照)。
 実行した結果はこうなった。
try1_s.png
 なんとなくRAWファイルが読み込めているのが分かる。
 縦横が違うのは最後に調整すればいいので、今は気にしない。

4. try2 Black level 調整
 黒レベルの調整を行ってみる。
 ただし調整するためのblack_level_per_channelの値が[0, 0, 0, 0]なので変化はないはず。
 ファイルは try2.py (githubを参照)
 結果は下記の画像。
try2_s.png
 全然変わってない。

5. try3 demosaicの実行
 RAWファイルの1画素の値はRGBの値ではなくて、RかGかBのどれかの色の値しか持っていない。
 だいたい2x2の画素で下記のように配置されている (R=Red, G=Green, B=Blue)
   R G
   G  B
 これを合成することで各画素の色を作り出すようになっている。
 ただし、ここでは最初のお試しなので、4つの画素から1つの画素を作る簡易でモザイク処理を
 試してみる。(結果的に画素数は縦横半分の大きさになる)
  R = R
  G = 2つのGの値の平均値
  B = B
 という計算をして色を作り出して画像を作ってみた。
 ファイルは try3.py (githubを参照)
 結果は下記の画像
try3_s.png
 なんとなく色が出てるけど全体的に青っぽい感じ。

4. try4 ホワイトバランスの調整
 RAWファイルにcamera_whitebalance [13312.0, 8192.0, 9152.0, 8192.0] という値があるので
 これを利用してホワイトバランスの調整を行う。
 調整値は、下記の式になるらしい。
  R = 13312 / 8192
  G = 8192 / 8192
  B = 9152 / 8192
 ファイルは try4.py (githubを参照)
 これでRGBの値を調整した結果が下記の画像
try4_s.png
 全体的に暗いけど、赤みが増した感じ。try3の結果より色がいいが、ちょっと赤く感じる。

5. try5 ガンマ補正
 目に映る色の強度はリニアではないので、それに合わせてガンマ補正を行う。
 ファイルは try5.py (githubを参照)
 結果が下記の画像
try5_s.png
 コントラストが低めだけど、少し明るくなった感じ。

6. try6 カラーマトリクス補正
 カメラのセンサーの色の癖を見た目に合わせて調整する。
 ただしRAWファイルに保管されているcolor_matrixの値がすべて "0" だったので、
 かわりにrgb_xyz_matrix
  [[ 0.9566 -0.2863 -0.0803]
   [-0.717 1.5172 0.2112]
   [-0.0818 0.0803 0.9705]
   [ 0. 0. 0. ]]
 を利用してみた。
 ファイルは try6.py (githubを参照)
 結果が下記の画像。
try6_s.png
 赤が強すぎて色味がエグい感じに見える。
 たぶんrgb_xyz_matrixを使うのが間違いな感じ。これは失敗。

とりあえずここまでで try5.pyの結果、RAWファイルから画像ファイルを作り出せるようになった。
PythonでRAWファイルの現像を自分で試せるとは思っていなかった。
しかもRaspberry Piで動くのは便利。
処理時間はtry5.pyで10分くらい時間がかかっているのはしょうがないかな?

nice!(0)  コメント(0) 

Pythonistaでgitを使う [Pythonista]

プログラムのソース管理である Github に Pythonistaから直接アクセスして、
作ったプログラムを登録してみた。

1. まずはgithub にアカウントの登録
 https://github.co.jp/ でアカウントを登録し、
 その後に "New repository" から新しいレポジトリを作っておく。
 するとそのレポジトリは "https://github.com/アカウント名/レポジトリ.git" でアクセス出来るようになる。

2. Pythonista で git を使う環境 stash をインストールする
 Pythonista を起動し、画面の右から左へスワイプするとコンソール画面が出るので、
 そこで、
 
    import requests as r; exec(r.get('http://bit.ly/get-stash').text)
 

 とするとインストールが始まるので、
 
    Installation completed.
 

 と出るのを待つ。
 終わったらPythonistaを再起動(ホーム画面ダブルタップからPythonistaを上へスワイプして終了し、再度起動する)
 するとPythonistaのホームに "launch_stash.py" が配置されるので、それを選択して実行すると、
 シェルが起動する。

3. gitを使ってみる
 stash を起動して、githubに登録したいファイルのあるディレクトリに移動する。
 
    $ cd (directory)
 

 git の初期化をする。
 
    git init .
 

 なにやらエラーが出てうまく動いていない様子。
 
    gittle  already exists
    funky already exists
 

 調べてみたけど的を得た解答が見つからなかったけど、ふとPython 2.7で実行することを思いつく。
 stashを実行するときに実行ボタンを長押しするとPython 2.7を選択できるので、そこから実行し、
 gitの初期化をしてみる。
 
    git init .
 

 エラーが出なくてうまく動いている様子。ls -a で見ると ".git" ディレクトリも出来ているので、うまく出来た。
 まずはローカルレポジトリにファイルを追加して、commitする。
 
    git add (ファイル名)
    git commit
 

 その後 Github へ登録してみる。
 
    git push https://github.com/(アカウント名)/(レポジトリ).git
 

 うまく出来たようなので、Webからgithubへアクセスしてファイルを確認してみると、
 ちゃんとソースが登録されていた。

Pythonistaから直接githubへアクセス出来るのはすごいな~
stash は普通のシェルだから、Pythonista上でプログラムのコピーは面倒なんだけど、
stash でディレクトリを作ってファイルコピーすればバックアップも簡単に出来る。
便利。

タグ:Pythonista GitHub
nice!(0)  コメント(1) 

PythonistaでSonyのデジカメのリモートコントロール [Pythonista]

Wifiに繋がるソニーのデジカメはWifi経由でカメラをコントロールするための
Camera Remote APIを公開しているので、
iPhone上で動くPythonistaから接続を試してみた。

1. SSDPでデジカメの接続先を探す
 iPhoneをデジカメのWifiに接続して、SSDPを送ることでカメラのIPアドレスと
 接続するURLを調べられるようだ。
 ということでPythonistaからSSDPを送ってみる。
import socket

MSEARCH_REQUEST_LINES = (
	'M-SEARCH * HTTP/1.1',
	'HOST: 239.255.255.250:1900',
	'MAN: "ssdp:discover"',
	'MX: %(timeout)s',
	'ST:urn:schemas-sony-com:service:ScalarWebAPI:1',
	'',
	''
)

timeout = 5
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(timeout)
req = '\r\n'.join(MSEARCH_REQUEST_LINES) % {'timeout': timeout}
sock.sendto(bytes(req, encoding='utf-8'), ('239.255.255.250', 1900))
while True:
	try:
		res, device = sock.recvfrom(4096)
		print('----------- from %s' % (device,))
		print(res)
		print('-----------')
	except socket.timeout:
		print("timeout")
		break

sock.close()

 実行してみたけどtimeoutしてデジカメが検出出来なかった。
 不思議なことにiPhoneをデジカメのWifiに繋いでも、iPhoneのWifi接続マークが出なくて、
 "4G"のままになっていた。けど状態でソニーが作ったデジカメをコントロールするアプリはちゃんと動くし、さらに普通にネットにも繋がってるという、両方に繋がっている状態に見える。
 よくわからない状態だったので、ネットで調べてると接続先URLを見つけたのでそこへ接続することにした。

 後で分かったことだけど、デジカメにWifiで繋ぐと、デジカメのIPは10.0.0.1、iPhoneのIPは10.0.1.1となっているが、
 デフォルトゲートウェイが設定されていないせいで、SSDPの通信はデジカメに行かないでインターネット側に送っていたらしい。
 iPhoneの"4G"の通信を止めてやることで、上のプログラムを実行するとデジカメから反応があった。
b'HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
EXT: 
LOCATION: http://10.0.0.1:64321/scalarwebapi_dd.xml
SERVER: UPnP/1.0 SonyImagingDevice/1.0
ST: urn:schemas-sony-com:service:ScalarWebAPI:1
USN: uuid:00000000-xxxx-xxxx-xxxx-xxxxxxxx::urn:schemas-sony-com:service:ScalarWebAPI:1
X-AV-Physical-Unit-Info: pa=""; pl=;
X-AV-Server-Info: av=5.0; hn=""; cn="Sony Corporation"; mn="SonyImagingDevice"; mv="1.0";

 このLOCATIONに書いてあるURLにアクセスすると、カメラをコントロールするためのURLを返してくれるらしい。

2. デジカメのコントロール
 JSONでカメラをコントロールするためのコマンドを書いてURLへ送ることでカメラが動いてくれるらしい。
 試しにシャッターを切るコマンドを送ってみた。
import json
import requests

SONY_CAMERA_URL = 'http://10.0.0.1:10000/sony/camera'

def sony_cam_control_1 ():
	req_body = json.dumps({
			'method' : 'actTakePicture',
			'params' : [],
			'id'     : 1,
			'version': '1.0'	})
	res = requests.post(SONY_CAMERA_URL, data=req_body)
	#print("%s" %(res))
	print(res.json())
	return res.json()

ret = sony_cam_control_1()

 ちゃんとシャッターを切ってくれた。
 これでカメラをコントロール出来るようになった。
 後はシャッターボタンとかのUIを作ってやれば、写真を撮るアプリが出来そう。


nice!(0)  コメント(4) 

Raspberry Pi で Tensorflow その2 [Raspberry Pi]

TensorflowがRaspberry Piを正式にサポートしたということなので、
再度インストールしてみた。

まずは前回インストールしたパッケージのアンインストール。
% sudo pip uninstall tensorflow


そしてTensorFlowのインストール
% sudo apt install libatlas-base-dev
% sudo pip3 install tensorflow


ちゃんと入ったか確認してみる。
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> hello = tensorflow.constant("Hello, TensorFlow")
>>> sess = tensorflow.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow'
>>> exit()

ちゃんとPython3 で動いている。

サンプルの画像分類を試す
前回と同じように実行したがエラーとなった。
$ python3 classify_image.py --model_dir ./imagenet/
Traceback (most recent call last):
  File "classify_image.py", line 227, in 
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
TypeError: run() got an unexpected keyword argument 'argv'


結果的には最後の行を下記のように修正して動くようになった。
tf.app.run()


nice!(0)  コメント(0) 

PythonからTweet [Raspberry Pi]

PythonのプログラムからTweetしてみる。

まずはPythonからTweetするモジュールがあるのでそれをインストールする。
モジュールはいくつかあるようだけど、Twythonを使ってみた。
% sudo apt-get install python3-twython


前に作ったTwitterのCONSUMER_KEYとACCESS_TOKENを下記のように config.py として保存する。
CONSUMER_KEY = "xxxx"
CONSUMER_SECRET = "xxxx"
ACCESS_TOKEN = "xxxx"
ACCESS_TOKEN_SECRET = "xxxx"


そして、Pythonで下記のように作る。twi.py
Jpegの画像ファイルと、日付をつけてTweetしてみる。
from twython import Twython
from PIL import Image
import io
import config

twitter = Twython(config.CONSUMER_KEY, config.CONSUMER_SECRET, config.ACCESS_TOKEN, config.ACCESS_TOKEN_SECRET)

photo = Image.open("data/20180805/photo_20180805_173503.jpg")
image_io = io.BytesIO()
photo.save(image_io, format='JPEG')
image_io.seek(0)

image_ids = twitter.upload_media(media=image_io)
twitter.update_status(status="20180805 173503", media_ids=[image_ids['media_id']])


無事につぶやけました。

nice!(0)  コメント(0) 

PythonからTwitterへTweetするための設定

PythonのプログラムでTweetするための設定をしたのでメモ

1. まずは専用のアカウントを作成する。
 https://twitter.com/ へ行ってTwitterのアカウントを作る。
 ただし、プログラムからのTweetをするようなアプリを作る目的の時は、電話番号も登録する必要がある。

2. Twitterの開発者登録をする。
 Twitterにログインしたまま、https://apps.twitter.com/ へ行く。
 すると、いろいろWebで調べてみた感じと違って、開発者登録が必要と出ている。
 どうやら2018年7月から変わったらしい。
 開発者登録画面には、アプリの詳細を書く場所があって、300文字以上入力しないといけないとかいてある。
 しかも英語で・・・
 しょうがないので簡単に100文字くらいで書いて、"aaaaa" って感じで埋めてみた。
 登録されたらメールが来ると書いてあったので待ってみた。 
 
 3日くらいたってようやくメールが来たが、メールには、
 もっとアプリの詳細を書け、としか書いてなかった・・・
 しょうがないので英文でもう少し細かい内容の説明を書いてメールを返信。
 
 さらに2日くらいたって、「登録されました」と返信メールが来た。
 やっとスタートライン。面倒になったなぁ。

3. Consumer API keysとAccess tokenを受け取る。
 http://developer.twitter.com/en/account/get-started へ行って、
 新しいアプリの登録をして、
 Consumer API keysとAccess tokenを受け取る。
 この辺は他のブログに良く書いてあるのと同じなので省略。

これでようやくTweetする準備が完了した。
今日はここまで。


nice!(0)  コメント(0) 

WindowsにOpenCV [OpenCV]

前回はRaspberry PiにOpenCVをインストールしてみたけど、
今回はWindows上にOpenCVをインストールしてみた。

Windows上にAnacondaをインストールしておくことが必要。
Anacondaのインストールは省略。
Anaconda Prompt を起動したところからスタート。

まずはOpenCVのインストール
 Anaconda Forge というところに最新版のOpenCVがあることを確認したので、
 そこからインストールする。
 % conda install -c conda-forage opencv

動作確認
 python
 >>> import cv2
 >>> print(cv2.__version__)
 3.4.1
 >>> exit()

 ちゃんと 3.4.1 がインストールされた。

前回と同じ、camera_face.py を試してみる。
 Haarの認識モデルは下記のディレクトリにインストールされていたので、コピーしてくる。
  c:\Anaconda3\pkgs\opencv-3.4.1-py35_200\Library\etc\haarcascades\

 % cp c:\Anaconda3\pkgs\opencv-3.4.1-py35_200\Library\etc\haarcascades\haarcascade_frontalface_alt.xml .

 そして前回と同じように camera_face.py を作る。(ブログの都合上全角スペースでインデントしているので修正が必要かも)
  import cv2

  def camera_capture():
   cap = cv2.VideoCapture(0)

   while True:
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    face = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

    if len(face) > 0:
     for rect in face:
      cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255,255,255), thickness=1)

    cv2.imshow('camera capture', frame)

    key = cv2.waitKey(1)
    if key == 27:
     break

   cap.release()
   cv2.destroyAllWindows()

  cascade_path = "haarcascade_frontalface_alt.xml"
  faceCascade = cv2.CascadeClassifier(cascade_path)

  camera_capture()

 そして実行
 % python camera_face.py

PCについてるカメラで取り込んで、顔の位置を認識してそこに四角い枠を追加して、
リアルタイムに表示された。

タグ:OpenCV
nice!(0)  コメント(0) 

Raspberry Pi で OpenCV [Raspberry Pi]

Raspberry Pi に OpenCV をインストールして、顔認識を試してみた。

OpenCVのインストール
 OpenCVをソースからビルドするのは時間がかかるので、今回はバイナリをインストールすることにした。

 % wget https://github.com/mt08xx/files/raw/master/opencv-rpi/libopencv3_3.4.1-20180304.1_armhf.deb
 % sudo apt install ./libopencv3_3.4.1-20180304.1_armhf.deb
 % sudo ldconfig

 動作確認
 % python -c 'import cv2; print(cv2.__version__)'
 3.4.1
 % python3 -c 'import cv2; print(cv2.__version__)'
 3.4.1

 ちゃんとOpenCVのバージョンが表示されてるので、インストールされている様子。


お試し1 画像ファイルの顔認識テスト
 OpenCVには最初から顔検出器用が用意されているのでそれを使用してみる。

 % vi face.py (ブログの都合上全角スペースでインデントしているので修正が必要かも)
  import cv2
  import os

  def face_detector(img_path, ):
   img = cv2.imread(img_path, cv2.IMREAD_COLOR)
   gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
   face = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

   if len(face) > 0:
    for rect in face:
     cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
   else:
    print("no face")

   cv2.imshow("result", img)
   cv2.imwrite("outimg/" + os.path.basename(img_path), img);
   key = cv2.waitKey(0)

  cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
  faceCascade = cv2.CascadeClassifier(cascade_path)

  img_files = os.listdir('inimg')
  for img_file in img_files:
   full_path_name = 'inimg/' + img_file
   print(full_path_name)
   face_detector(full_path_name)

 % mkdir inimg outimg

 顔が入っている適当な画像ファイルを inimgディレクトリに置いて、実行すると、
 顔を認識した部分に白い枠を追加して画像表示し、outimgディレクトリに出力してくれる。

 % pytone3 face.py

 うまく顔認識していることが確認出来た。


お試し2 USBカメラからのキャプチャ
 ラズパイ用のカメラもジュールは持っていないけどUSBにつなぐWebカメラ(130万画素)は持っているので、
 キャプチャしてみる。

 % vi getcamera.py (ブログの都合上全角スペースでインデントしているので修正が必要かも)
  import cv2

  def camera_capture():
   cap = cv2.VideoCapture(0)

   while True:
    ret, frame = cap.read()
    cv2.imshow('camera capture', frame)

    key = cv2.waitKey(1)
    if key == 27:
     break

    cap.release()
    cv2.destroyAllWindows()

  camera_capture()

 % python3 getcamera.py

 ちゃんとカメラから取り込んだ画像(640x480くらい)が15〜20フレーム/secくらいで表示された。
 ESCキーを押すと終了する。


お試し3 USBカメラからキャプチャして顔認識
 お試し1と2を組み合わせてリアルタイム顔認識を試してみる。

 % vi camera_face.py (ブログの都合上全角スペースでインデントしているので修正が必要かも)
  import cv2

  def camera_capture():
   cap = cv2.VideoCapture(0)

   while True:
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    face = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

    if len(face) > 0:
     for rect in face:
      cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255,255,255), thickness=1)

    cv2.imshow('camera capture', frame)

    key = cv2.waitKey(1)
    if key == 27:
     break

   cap.release()
   cv2.destroyAllWindows()

  cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
  faceCascade = cv2.CascadeClassifier(cascade_path)

  camera_capture()

 % python3 camera_face.py

 リアルタイムに顔認識出来るようになった。
 ただし 1〜2フレーム/sec とだいぶ遅くなった。

参考にしたサイトはここです。
http://uepon.hatenadiary.com/entry/2018/02/12/113432
https://qiita.com/mt08/items/e8e8e728cf106ac83218
https://tomosoft.jp/design/?p=8876


nice!(0)  コメント(0) 
前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。