Python とビルド済みのOpenCVバイナリパッケージ
ビルド済みのOpenCVバイナリパッケージについてメモ書き。 あくまでもPython向けにOpenCV 3.xをインストールする方法の1つです。
非力なマシンに最適。
背景
そもそもOpenCVソースコード自体にPython用のバインディングは含まれています。ただソースからビルドするか、OpenCVのバイナリをインストール後に必要なファイルを所定の場所にコピー((すればPythonからOpenCVを使用できます。
この場合の難点はOpenCVのビルド時に検出されたPythonのバージョンでしか使用できないという問題があります。
環境によっては有効化されていないモジュールがある可能性がありますがそこまでは調査していません。あしからず。
前提
前提条件は次のとおり。
この記事を書いている時点で最新版は3.4.2.17。バージョン番号はOpenCVのバージョンに対応します。
現時点でOpenCVの最新版は3.4.3。このライブラリ(というかビルド済みバイナリ)は3.4.2に対応しています。
PythonのバージョンとCPUアーキテクチャ別のビルド済みパッケージというのがこの記事で紹介しているPythonモジュール。
あくまでも非公式パッケージです。
メリット
このパッケージのメリットは導入が楽な点。特に別途OpenCVのインストールが不要。
デメリット
デメリットはパッケージをインストールするたびにOpenCV一式をインストールするのでディスク容量を消費する点。
ある程度汎用的な環境向けにビルドされているのであまり最適化はされていない。新しいバージョンがリリースされてから若干のタイムラグがある点にも注意が必要です。
なお、インストールに成功したからと言って動作するとは限らず、追加で依存しているライブラリのインストールが必要な場合があります。
パッケージ名
本体のみとcontribあり、GUI関連機能(highuiモジュール)ありとなしで合計4つのパッケージがある。
以下の4つのパッケージのうちどれか1つを選んでインストールする。
本体のみ
headless
の方はGUI関連機能を無効にしたパッケージ。サーバー環境向け。
contribあり
opencv_contribリポジトリを組み合わせてビルドしたパッケージ。headless
については本体のみのパッケージと同じ。
Linux環境でcontribつきのパッケージの利用は不要な機能のための依存パッケージをインストールする必要があるので逆に面倒な可能性があります。
インストール時の注意
環境によっては追加のパッケージをインストールする必要があります。エラーメッセージから該当のファイルを含むパッケージを特定してインストールします。
macOSの場合はHomebrewでopencv
パッケージが依存しているパッケージ一式をインストールすればOpenCV本体は動くはずです。具体的にはbrew info opencv
を実行しRequired:
という行に列挙されているパッケージのうち、python本体以外をインストール*1。
参考:Raspbian Liteでビルド済みのOpenCVパッケージを使うための依存パッケージいろいろ
具体例
Python 3.7、opencv-pythonのバージョンは3.4.2.17。
作業ディレクトリを作成。contribにある二値化処理アルゴリズムを試したいのでopencv-contrib-python
をインストール。
$ mkdir work $ cd work
pyenv
などを使う場合はこのタイミングで使用するPythonのバージョンに切り替え。
venv
モジュールで仮想環境を作成して有効化。
$ python3 -m venv venv $ source venv/bin/activate
この状態でpip
コマンドはpip3
コマンドへのリンクになっています。
contribありのパッケージをインストールします。
$ pip install opencv-contrib-python-headless
大抵の場合はNumPyとmatplotlibも使うのでついでにインストール。
$ pip install numpy matplotlib
まとめ
他のインストール手段でインストールされるモジュール類とのconflictに注意。
こういう記事が意外なところで役に立つと思っていたりします。まあ気休めですけど。
おしまい。
詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識
- 作者: Gary Bradski,Adrian Kaehler,松田晃一,小沼千絵,永田雅人,花形理
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/05/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
*1:まあ楽ができればそれが正義
技術書を書くツールの検討メモ
メモ書き。書きかけのブログ記事が滞留しておりよろしくないのでさっさと公開しておきます。
要件
- EPUB形式、PDFの両方を生成できること
- テキストベースでバージョン管理システムが使えること
- 原稿ファイルの分割をサポートしていること
できれば「コラム」のような囲み領域を使った補足情報(「囲み記事」または「カコミ」と呼ぶらしい)を入れることができると望ましい。
最悪、EPUB形式からCalibreでPDFにすることもできる。
TeX
昔は指示されたわけでもないのにレポートをLaTeXで書いた。卒論と修論もLaTeXだった*1。
- 作者: 奥村晴彦,黒木裕介
- 出版社/メーカー: 技術評論社
- 発売日: 2017/01/24
- メディア: 大型本
- この商品を含むブログ (2件) を見る
昔はともかく流石にダイレクトにTeXは無理。
Re:View
Re:View記法を覚える必要あり。日本語のノウハウ記事が結構ある*2。
テンプレートが配布されているのでとっつきやすい。
また、テンプレートを配布している団体による解説本がある。
TechBooster/C89-FirstStepReVIEW-v2: 技術書をかこう!はじめてのRe:VIEWは技術書の執筆ノウハウ本のリポジトリです
開発チームがちょっと属人的っぽいので保留。過去のしがらみによるジレンマが怖い。
バージョン3.0で大きな変更が入るらしいのでそれからでも遅くはなさそう。
GitBook
Markdown · GitBook Toolchain Documentation
悪くはないが、囲み記事の実現方法が不明。
Pandoc(+ alpha)
Markdownの拡張でspan
やdiv
相当の機能があるらしいのでいいかも。
ビューワーが対応しているかが問題だけどCSSである程度は囲み記事を実現できるはず。
Sphinx (RestructuredText)
Overview — Sphinx 1.8.0+ documentation
literalinclude
という機能で、外部ファイルの指定範囲を読み込んだりできる。ソースコードの一部を読み込んで解説する、というスタイルなら断然有利。
ただ、Sphinxは書籍作成用ではない、という話を聞いた気がする。
MDPreview
詳細不詳。リブロワークスという会社(ふりがなプログラミングの会社)のMarkdownベースのプレビューツールを使う方法。
Markdwon+CSS(+ Vivliostyle.js)からIndesign用のデータ(XML?)を生成するらしい。
- Markdownプレビューツールを使った新しい編集・制作フローのご提案 – リブロワークス – LibroWorks
- MorkdownプレビューツールをAtomパッケージ化しました – リブロワークス – LibroWorks
PDFを生成できるみたいだけどIndesignを使っている会社で商業出版する場合以外はどうするんだろう
囲み記事用のタグなど、Markdownを一部拡張している。
lwohtsu/language-mdbp: markdown grammer for MDBP with ATOM
ブラウザでPDF生成
[2018/09/08 追記]
CSS組版。ブラウザでHTMLを表示して印刷メニューでPDFにするらしい。pandocでepubを生成させてもいいのかも。
CSSのカウンタで章番号をふるとして、目次はどうするんだろう。
関連:https://www.antenna.co.jp/AHF/ahf5/CSSInfo/CSS-Page-Tutorial.pdf
原稿データの管理
バージョン管理システムを使う前提だけど、アウトラインエディタ系のツールを使うのもありかも知れない。
Scrivener | Literature & Latte
先に章構成を固めて書くなら問題ないか。
参考記事
- 技術書を書きたいITエンジニア必見!?「プロを目指す人のためのRuby入門」の舞台裏をお見せします - give IT a try
- どのように40万文字を超える技術書籍を執筆したのか? - Qiita
- CLIP STUDIOで技術系同人誌を作ろう! 原稿作成→データ入稿までの一連の流れを公開 | マンガでわかるWebデザイン ※画像ベース
まとめ
悩むくらいならRe:Viewでガシガシ書いていくのがいいかも知れない。 とりあえずMarkdown形式で書き始めておけば途中でスイッチするのは不可能ではなさそう。Re:View形式に関してもMarkdown形式からの変換ツールがある。
技術同人誌を書こう! アウトプットのススメ (技術書典シリーズ(NextPublishing))
- 出版社/メーカー: インプレスR&D
- 発売日: 2018/04/13
- メディア: Kindle版
- この商品を含むブログを見る
いまさらながらZenFone 3 Max(ZC553KL)でDSDS
Dual SIM、Dual Standby、です。購入後一年以上経ってからというのもどうかという気もしますが。
構成
- 本体:ZenFone 3 Max(ZC553KL)
- SIM1:microSIM(SMS対応データ通信用ドコモ回線)→4G
- SIM2:nanoSIM(通話対応、ドコモ回線)→3G
どちらも格安SIMです。あまりかけ放題系のサービスが使えないので率直に言ってありがたみのない組み合わせとなります。
ZenFone3 MaxはSIMフリーの国内向けです。将来の移行を踏まえて音声通話用がnanoSIMにしてあります。
ZenFone3 MaxはmicroSDスロットがnanoSIM用のスロットになっています(排他利用方式)。
ZC553KLでDSDSするためにはAndorid 7.xへのアップデートが必要です。アップデートでDSDSに対応したという不思議な端末。
設定手順
1枚目はすでに設定済みという前提です。
- SIM1を無効にしてSIM2のAPNなどを設定(「もっと見る」をタップして「無線とネットワーク」という画面に移動。「モバイルネットワーク」をタップして各種設定)
- SIM1を有効化する
- 「デュアルSIMカード設定」から各種設定
- 「音声呼び出し」「SMSメッセージ」「データサービスネットワーク」「優先Bluetooth通話設定」の各項目を設定
私の現在の設定は以下のようになっています。ご参考まで。
動作のチェック
モバイルデータ通史をSIM1、他をSIM2にセット。SIM2は3G回線。
この状態でSIM2への受電、SMS受信とも問題なし。SMSメッセージをSIM1に設定してもSIM2あてのSMSは受信できた。
「デュアルSIM通話転送」は試していません。
ステータスバーのアンテナの状態は以下のとおり。
感想
まあ普通、という感じですね。ガラケーとの2台持ち寄りは断然便利です。
SIM2枚刺しの利便性よりもWifのあるところを探して居座るほうが有意義に思います。
コスト削減策としてはキャリア回線とデータ通信用の格安SIMというスタイルがいいのかな。
データSIMの割引期間が終わっていしまうので、しばらくしたら音声対応のSIM1枚の運用に変更する予定です。
Android 8.xへのアップデート、提供予定があるのか、はっきりしてほしい。
厚生労働省ブラック企業リスト8月版(2018年)
今月もまあ惰性のやっつけ仕事エントリです。
公開されているPDFですがファイル名が先月と同じであれれという感じですね。どうなっているんだ。
データの入手元
ファイルは労働基準関係法令違反に係る公表事案というリンクから。
先月と同じファイル名です。
データの更新のない都道府県もあるのは先月までと同様です。
「平成30年7月31日」という表記の全角数字と半角数字の使い分けはかなり気持ち悪い。
それと微妙に社名に含まれる空白の位置を変えるのはやめて欲しい > 神奈川労働局。
機械可読データ(タブ区切りテキスト形式)
厚生労働省ブラック企業リスト(2018年08月31日版) · GitHub
ブラック企業の一覧をリストアップしています。
PDFからTSVへの変換スクリプト
Convert PDF to TSV ( for Japan's MHLW illegal company list ) rev. 2
先月と同じで変更なし。
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
前月との比較
先月の416件から429件に増加。掲載終了が多いなか、岩手労働局と徳島労働局の+3件を筆頭に新規追加のおかげでトータルとしては持ち直した感じ。
労働局名 | 当月公表件数 | 前月公表件数 | 新規掲載 | 掲載終了 | 差分 |
---|---|---|---|---|---|
北海道労働局 | 16 | 15 | 3 | 2 | +1 |
青森労働局 | 8 | 8 | 0 | 0 | +/-0 |
岩手労働局 | 11 | 8 | 3 | 0 | +3 |
宮城労働局 | 4 | 4 | 0 | 0 | +/-0 |
秋田労働局 | 2 | 4 | 0 | 2 | -2 |
山形労働局 | 3 | 3 | 0 | 0 | +/-0 |
福島労働局 | 7 | 8 | 0 | 1 | -1 |
茨城労働局 | 7 | 5 | 2 | 0 | +2 |
栃木労働局 | 8 | 7 | 2 | 1 | +1 |
群馬労働局 | 5 | 3 | 5 | 3 | +2 |
埼玉労働局 | 7 | 9 | 0 | 2 | -2 |
千葉労働局 | 11 | 9 | 2 | 0 | +2 |
東京労働局 | 17 | 17 | 2 | 2 | +/-0 |
神奈川労働局 | 9 | 8 | 1 | 0 | +1 |
新潟労働局 | 10 | 10 | 2 | 2 | +/-0 |
富山労働局 | 6 | 5 | 1 | 0 | +1 |
石川労働局 | 6 | 6 | 1 | 1 | +/-0 |
福井労働局 | 7 | 8 | 0 | 1 | -1 |
山梨労働局 | 9 | 9 | 1 | 1 | +/-0 |
長野労働局 | 20 | 22 | 2 | 4 | -2 |
岐阜労働局 | 14 | 13 | 2 | 1 | +1 |
静岡労働局 | 7 | 8 | 0 | 1 | -1 |
愛知労働局 | 30 | 29 | 3 | 2 | +1 |
三重労働局 | 7 | 7 | 0 | 0 | +/-0 |
滋賀労働局 | 7 | 8 | 1 | 2 | -1 |
京都労働局 | 6 | 5 | 1 | 0 | +1 |
大阪労働局 | 29 | 30 | 1 | 2 | -1 |
兵庫労働局 | 12 | 12 | 4 | 4 | +/-0 |
奈良労働局 | 8 | 5 | 3 | 0 | +3 |
和歌山労働局 | 11 | 10 | 1 | 0 | +1 |
鳥取労働局 | 2 | 2 | 0 | 0 | +/-0 |
島根労働局 | 5 | 5 | 1 | 1 | +/-0 |
岡山労働局 | 6 | 6 | 1 | 1 | +/-0 |
広島労働局 | 18 | 16 | 4 | 2 | +2 |
山口労働局 | 4 | 4 | 0 | 0 | +/-0 |
徳島労働局 | 8 | 5 | 3 | 0 | +3 |
香川労働局 | 1 | 1 | 0 | 0 | +/-0 |
愛媛労働局 | 11 | 11 | 1 | 1 | +/-0 |
高知労働局 | 8 | 7 | 2 | 1 | +1 |
福岡労働局 | 15 | 16 | 2 | 3 | -1 |
佐賀労働局 | 6 | 7 | 0 | 1 | -1 |
長崎労働局 | 5 | 5 | 0 | 0 | +/-0 |
熊本労働局 | 7 | 11 | 1 | 4 | -4 |
大分労働局 | 11 | 10 | 1 | 0 | +1 |
宮崎労働局 | 2 | 1 | 1 | 0 | +1 |
鹿児島労働局 | 4 | 4 | 0 | 0 | +/-0 |
沖縄労働局 | 12 | 10 | 2 | 0 | +2 |
鳥取労働局は1月31日から変化なし。
先月から変化なし
鹿児島、長崎、山口、香川、三重、青森。半年以上更新のない鳥取はレジェンド。
まとめ
掲載データに大きな変化はなし。
今月も手抜きですがここまで。
- 作者: 今野晴貴
- 出版社/メーカー: イースト・プレス
- 発売日: 2018/08/05
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 森井博子
- 出版社/メーカー: 宝島社
- 発売日: 2017/06/09
- メディア: 新書
- この商品を含むブログ (1件) を見る
Pmod HATとマイクモジュール(Pmod MIC3)
とりあえずゲットした部品を使えるようにしただけ。ものは7月末に届きました。
経緯
某コンテストの、部品提供キャンペーンに応募したらブツが送られてきたので。
みんなのラズパイコンテスト |ラズパイマガジン、 日経Linux、日経ソフトウエア 主催
応募しないと返却義務が発生するんで何とかしないといけない。
作品のアイディアはすでに固まっているのでマイクからの入力データの処理について調べさえすればあとは難しくないはず。
付属品など
本体の方はスペーサー×4。ただし両側がメスでネジが×2×4。ラジオベンチがないとバラすのに不便かも。
スペーサーは市販の片側メスのタイプを使ってます。
- 出版社/メーカー: サンワダイレクト
- メディア: エレクトロニクス
- この商品を含むブログを見る
サンハヤト Raspberry Pi用スペーサー 黄銅製 MPS-M2611
- 出版社/メーカー: サンハヤト
- メディア: Tools & Hardware
- この商品を含むブログを見る
環境・その他
ハード
ラズパイはRaspberry 3 model B+。
コンポーネントをつなぐ拡張基板の名称がPmod HATという名称。今回ゲットしたモジュール(子コンポーネント)はPmod MIC3というMEMSマイクモジュール。 マイク以外にもモジュールはたくさんあります。
- Pmod HAT Adapter [Reference.Digilentinc]
- PmodMIC: Microphone with Digital Interface (RETIRED) - Digilent
RETIREDってEOLってことですよね、売れなかった?
USBマイクでいいんじゃないかというツッコミはなしで。
ドキュメント
ライブラリ
- DesignSpark.Pmod — DesignSpark.Pmod 0.2.0 documentation
- DesignSparkrs/DesignSpark.Pmod: DesignSpark Python library for Pmods
セットアップ
ハードウェアの接続は普通のpHATと同じようにGPIOコネクタに接続するだけ。本体をセットしたらマイクユニットを取り付ける。GNDのピンが本体側とマイクモジュール側で一致していればOK。SPIプロトコルを使うのでJAまたはJBのコネクタのどちらかに接続する。
写真はJAAに接続しています。音量調整は黄色いネジを回して調整。初期状態はミュート最小音量(感度?)。
SPIの有効化
Raspbianのセットアップは完了しているものとする。
$ sudo rasp-config
特に難しくはない。忘れずに再起動する。
パッケージの追加
$ sudo apt install python3-pip python3-dev libfreetype6-dev libjpeg-dev libopenjp2-7-dev libtiff-dev build-essential
venv
モジュールもインストール。
$ sudo apt install python3-venv
Python環境のセットアップとライブラリのインストール
作業ディレクトリの作成。
$ mkdir myproject $ cd myproject
仮想環境の作成、有効化。
$ python3 -m venv venv $ . venv/bin/activate
本命のライブラリをインストール。
$ pip install designspark.pmod
ハードウェアの注意
- 初期状態はマイクボリュームが最小なので黄色いプラスネジを右に回す。
- JAでもJBでもいいが、2段になっている上の段に差し込む
動作チェック
リファレンスのサンプルの接続先のみ変更。
#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (c) 2017 RS Components Ltd # SPDX-License-Identifier: MIT License """ Print a continous sound level reading out. """ from DesignSpark.Pmod.HAT import createPmod import time s = ':' lut = [s] for i in range(128): s+=':' lut.append(s) if __name__ == '__main__': mic = createPmod('MIC3','JAA') time.sleep(0.1) try: while True: int = mic.readIntegerValue() #print(int) print(lut[int>>5]) snd = mic.readPhysicalValue() #print(snd) #time.sleep(0.01) except KeyboardInterrupt: pass finally: mic.cleanup()
JBA
という箇所をJAA
に。
ref. 3. Basic Examples — DesignSpark.Pmod 0.2.0 documentation
動作の様子
上記のコードをsample.py
という名前で保存して、実行する際は以下のように。
$ python sample.py
音に合わせて出力される:
の個数が変動する。
readIntegerValue()
またはreadPhysicalValue()
でそれぞれ整数、実数で値が取れる。
まとめ
とりあえず動作チェックまで。日本語の情報が殆ど無いのが残念なところ。
接続さえ間違えなければ特に難しくない。
[2018/08/31 追記]
Python経由で扱うのは限界がある。まずLinuxはリアルタイムOSではないし、Pythonでマイクロ秒間隔でセンサからデータを取れるかというとちょっと微妙。
ALSA経由でデータを取れるようにするか、Cでがっつりコードを書くか、要検討。