2018年7月25日水曜日

PiCameraをOpenCVのCameraCaptureで使用する

v4l2ドライバーの読み込み


Raspberry Pi の PiCameraをOpenCVのカメラキャプチャで使用する場合、オフィシャルのV4L2ドライバーをロードする必要がある。

$ sudo modprobe bcm2835-v4l2

起動時に自動的にロードできるように、/etc/modules ファイルに以下の行を追加する。

bcm2835-v4l2


大きい解像度でカメラキャプチャすると画像が青みがかる


640×480などの解像度でカメラキャプチャする場合、問題ないが、1640×1232や3280×2464などの解像度を指定すると、カメラキャプチャした画像が青みがかってしまう。

原因は、bcm2835-v4l2は、パラメータを指定しない場合、1280×720までしか対応していないためである。これより大きい解像度を使う場合、ドライバーのロード時のパラメータを設定する必要がある(解像度が限定されている理由はv4l2ドライバーではFPSが低下するための模様)。

$ sudo modprobe bcm2835-v4l2 max_video_width=3280 max_video_height=2464

※解像度の指定はPiCamera v2.1の最大解像度

あとは、起動時にもパラメータを指定するために、/etc/modprobe.d/bcm2835-v4l2.conf ファイルを新規作成し、以下のオプションを指定する。
options bcm2835-v4l2 max_video_width=3280 max_video_height=2464


参考

2018年7月20日金曜日

cvui を Python で試す

OpenCVでGUIを描画する場合、highguiの機能だと難しいケースがある。
特に画像いじる際に、パラメータを変更しながらリアルタイムに確認したい場合など、trackBarだけだと結構厳しい。
やっぱり、ボタンとか、チェックボックスとかのGUIツールも欲しい。でもQtやWFPだと気軽には試せなくなってしまう。

そんな不満を解消するcvuiはC++の"header only"のOpenCVのUIを描画する軽量ライブラリで、ヘッダーファイルをインクルードすれば気軽に使えてしまうので重宝していた。

そんなcvuiがBETA releaseでPythonに対応していたので試してみる。

注意
Githubにも記載がる通り、あくまでBETA releaseです。
不具合や今後何があるかわかりません。

https://github.com/Dovyski/cvui/releases/tag/v2.7.0-BETA
NOTICE: this is a BETA release, a particularly special one. From now on, cvui has two implementations: a C++ and a Python one. The C++ implementation only received bug fixes since its last release, so there should be no problems regarding upgrades. The Python implementation, however, is brand new. Its API is unlikely to change until the final 2.7.0 release, but please bare in mind it might present problems and things could change to improve the overall Python experience of cvui.

インストール

Fedora 28, OpenCV3.4.1, Python 3.6.5 の環境にインストール
pipでpython版のcvuiをインストールする
$ sudo pip3 install cvui

簡単なサンプルを動かしてみる

テキストとボタンを描画する簡単なサンプル。
リファレンスのドキュメントはC++だが、PythonもほぼおなじようなIFで使用できる。
(Python用のドキュメントは見つからなかった)

テキストとボタンを表示する簡単なサンプルを作ってみる
WINDOW_NAME = "CVUI Sample"
import numpy as np
import cv2
import cvui

WINDOW_NAME = "CVUI Sample" # cvuiの初期化時に指定するWindow Name

def main():
    frame = np.zeros((200, 500, 3), np.uint8)
    is_on = False

    # cvuiの初期化
    cvui.init(WINDOW_NAME)

    while True:
        frame[:] = (49, 52, 49)

        # テキストの描画
        cvui.text(frame, 110, 80, "Hello, world!")
        # ボタンの描画と押下したときの判定
        if cvui.button(frame, 100, 40, "Button"):
            is_on = not(is_on)

        # ボタンが押されたら、テキストを描画する(トグルボタン)
        if is_on:
            cvui.text(frame, 150, 150, "Button Clicked")

        # 画像を描画する(cv2.imshowとおなじ)
        cvui.imshow(WINDOW_NAME, frame)

        if cv2.waitKey(20) == 27:
            break;

if __name__ == '__main__':
    main()

スクリーンショット

ボタンを押すと、トグルでテキストを表示・非表示する。




2018年7月9日月曜日

Raspberry pi 3 model B+ で Yoct(weston)

Raspberry Pi 3 Model B+を入手したので、YoctoでAArch64のイメージを作成してみる。
半年前(2017年後半?)ごろは、Raspberry Pi 3(無印)のAArch64では、Wifi、Bluetoothはドライバがないため、使えなかったが今回は使えそうなことが判明した。
なので、ブラウザ(Chromium)を組み込んだWestonのイメージを作成してみることにした。

準備

Chromiumをビルドするには、追加でlibatomicをビルド環境にインストールする
(筆者の環境はFedora28です)
$ sudo dnf install libatomic

ダウンロード・レイヤーの追加

master環境を引っ張ってくる。
Chromiumを追加するために、meta-browserも引っ張ってくる。
$ git clone git://git.yoctoproject.org/poky.git
$ cd poky/
$ git clone git://git.openembedded.org/meta-openembedded
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ git clone https://github.com/OSSystems/meta-browser
$ cd ../
$ source poky/oe-init-build-env rpi-build
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-python/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../poky/meta-raspberrypi/
$ bitbake-layers add-layer ../poky/meta-browser/

Bitbake

conf/local.confに以下を追加する。
(AArch64ビルドの指定と、Chromiumと日本語フォントの追加指定)
MACHINE ?= "raspberrypi3-64"
IMAGE_INSTALL_append = " chromium-ozone-wayland "
IMAGE_INSTALL_append = " source-han-sans-jp-fonts "

あとは、bitbakeコマンドでビルド

$ bitbake core-image-weston
WARNING: Host distribution "fedora-28" has not been validated with this version of the build system; you may possibly experience unexpected failures. It is recommended that you use a tested distribution.
Loading cache: 100% |#####################################################################| Time: 0:00:00
Loaded 3089 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION = "1.39.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "universal"
TARGET_SYS = "aarch64-poky-linux"
MACHINE = "raspberrypi3-64"
DISTRO = "poky"
DISTRO_VERSION = "2.5+snapshot-20180703"
TUNE_FEATURES = "aarch64"
TARGET_FPU = ""
meta 
meta-poky 
meta-yocto-bsp = "master:7cb125d7ee4b80fb33d87bdd0b257bc6daaff051"
meta-oe 
meta-multimedia 
meta-python 
meta-networking = "master:4517d1c695efd0b175f4e7242e1a7bb4361527d9"
meta-raspberrypi = "master:3b6549a5e016efe63c9d1463948b9de1ee5d89ed"
meta-browser = "master:1cd38d701a49eade80a04140f70d3383117b9745"

Initialising tasks: 100% |################################################################| Time: 0:00:03
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 4831 tasks of which 4803 didn't need to be rerun and all succeeded.

Summary: There was 1 WARNING message shown.

SDカード書き込み・起動

ifconfigコマンドでwlan0が認識していることを確認。
SSID、キーを登録して、ルーターからIPアドレスが払い出されることを確認。
Chromiumを起動して、googleのトップページが開けた!!