Horus(Ciclop 3D Scanner 制御ソフトウェア)のPython3.x化


#1

Horus
0.2 rc1


0.1.2.4
https://www.bq.com/en/support/ciclop/support-sheet

はじめまして :grinning:
HE3DのCiclopを購入して色々遊んでいます。


↑勢い余ってこんなレビューも書いてみました、ESIです。

Ciclop 3D Scannerの制御ソフトウェアであるHorusはPython2.7に基づいていますが、Python2.7の開発終了が2020年1月1日に迫っています。そこで、HorusをPython3系で動くようにしてしまおうと色々試みております。

現在2.7系の最新安定版である2.7.16からのHorus0.2rc1の起動とスキャンに成功。

動作にはpip経由でpyopengl pyserial numpy scipy matplotlibを導入する必要があります。また、OpenCVが、2.4.13.6、wxPythonが3.0.2.0と、pipで導入可能なものよりやや古いバージョンが必要でした。

加えて、
src\horus\gui\workbench\calibration\pages\camera_intrinsics.py
src\horus\gui\workbench\calibration\pages\laser_triangulation.py
src\horus\gui\workbench\calibration\pages\platform_extrinsics.py
の"axisbg"を"facecolor"に書き換える必要があります。

OpenCVやwxPythonはバージョンが随分上がってしまっているので、全てのライブラリをpipで導入可能なバージョン(かつPython3系で導入可能なバージョン)で済ませるにはある程度コードに手を入れる必要がありそうです。


#2

wxPython 4.0.4 で立ち上がりました。
カメラやArduinoUNOへの接続は成功(表示させるのはまだ)。


現在object has no attributeの嵐。ひとつひとつコツコツ潰していく必要がありそうです。

出典
AttributeError: ‘module’ object has no attribute ‘SystemSettings_GetFont’
Wxpython API has changed as of version 4.0
wxPython Project Phoenix Migration Guide
Classic vs Phoenix

コードの変更部分
src\horus\gui\splash.py
import time
import wx._core

import time
import wx._core
import wx.adv

class SplashScreen(wx.SplashScreen):

class SplashScreen(wx.adv.SplashScreen):

(bitmap, wx.SPLASH_CENTRE_ON_SCREEN, 0, None)

(bitmap, wx.adv.SPLASH_CENTRE_ON_SCREEN, 0, None)

src\horus\gui\workbench\control\panels.py
self.request.Bind(wx.wx.EVT_KEY_DOWN, self.on_key_pressed)

self.request.Bind(wx.EVT_KEY_DOWN, self.on_key_pressed)

src\horus\gui\workbench\workbench.py
wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)

wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X)

上記3ファイルの該当部分の書き換えでGUIの起動までは到達可能です。


#3

はじめまして,管理人のTohruです
これはすごい!知恵の共有に感謝します!
去年BQ社に問い合わせしてみたいですが,どうやらこの製品は生産中止で,放棄してる状態です.今はクローズソースの何かを作ってる様子です.
コピペやメモ書きでも構いませんので,もしよかったらアマゾンのレビューもここで保存させていただきとありがたいです.

スポンサーからクーポン券が貰えそうで,申請してみます(欲しいグッズはあるかどうかはわからないが...)


#4

こちらこそ、情報共有の場を用意して下さっていることに感謝します。

google groupsのトピックも放置気味なのでもしかしてとは思っていましたが、やはりですか。新しいバージョンのOSへのインストールにも対応してほしいなんて投稿もありましたし、このスキャナとソフトウェアにはまだまだ需要がありそうではあるのですが。

加えて言うなら少し手を加えればフォトグラメトリ用のシステムに簡単に流用出来そうですし、赤色以外のレーザーを使えるように改造すると可視光域で透明な物体のスキャンや表面で多重散乱を起こす物体のスキャンにも道が開けるはず。

将来性があるハードなので、このまま消えていくのは勿体ない。よって、今年12月末(python2.x系列のサポート終了)に間に合うリリースを目指してHorusの更新作業を続けます。

あとクーポン券助かります。貰えたときは電子部品カテゴリにいいなぁと思うものが結構ありますので活用させていただきます(いつかはCiclopで取り込んだものをCNCで出力なんてことも出来たら楽しそう)。

Amazonレビューの転載の件、了解しました。アーカイブという位置付けで返信で軽くまとめて投稿しておきます。商品レビューの形は文章の長期保存性や公開性に不安がありましたので、私としても助かります。

※ クーポン券の話は「Horus(Ciclop 3D Scanner 制御ソフトウェア)のPython3.x化」の記事に対してですし、転載してもカスタマーレビューのガイドライン違反にはあたらないと判断します。

金品などの対価(レビューの対価として支払い、ボーナスコンテンツ、キャンペーンやコンテストへの参加資格、値引き、追加商品その景品等)を受けることを目的としてレビューを投稿すること
注: ただし、Amazonの要求により投稿するレビュー(Amazon Vine 先取りプログラム等)は除きます。


#5


上記レビューの写しです。

レビューの出典

Horusで悪戦苦闘

関連画像
てっぺん、及び緑色の部分が抜けます

回転対称な物体はきれいに形を得ることが出来ます

webカメラはスタンドに加えてフロントの化粧板も外します
(化粧板は外し忘れがちなので注意)

キャリブレーション用紙はプレート手前側のみに貼り付けます


レーザーはターンテーブル中央で交差させると良さそう
(加えてカメラから見て並行であること)

竹尺を使ってカメラの簡易ピント合わせ

左右点群の一致率が悪い場合はAdvanced Modeでの設定を行う



※ それでも一致しない場合、左レーザーで一周、右レーザーで一周の計二周分の点群を合成して一回分とするのがよさそう

ROIを表示することで、スキャン可能エリアを視認しやすくなります

スキャン

スキャン後、点群のメッシュ化

3Dモデリングソフトで加工
※ 用途によってポリゴンメッシュの細かさを使い分けましょう

スライサーでスライスし、3Dプリンタで出力

立体物の縮小コピーの図

麦のヒゲも取得出来ました

縦方向の点群密度は恐らくカメラの解像度依存

全高8cmと小型のデスクトップアーミーのフリー配付モデルの取り込み









※ キカイダー?いいえシルフィです

スキャンして得たデータですが、立体物の制作以外にも3DCG用途で様々な可能性を秘めています。以下は作例としてショートアニメの制作過程です。

モチーフとしたい立体物の取り込み


点群を合成し欠落を補完




頂点カラーをテクスチャに変換すると扱いやすい

あとはいい感じにエフェクトをつけて動かすと完成

https://drive.google.com/file/d/1ZLc70MK91gfW_Shl9mI3bzqDUWlNybw0/view?usp=sharing


#6

スキャニング成功!

コツコツとコード書き換え中

https://wxpython.org/Phoenix/docs/html/wx.ShowEvent.html

if 文は True or False で判断する → 0,1 or bool
GetShowは廃止、GetShowに近そうでboolで値が返るもの→IsShown

GetShow→IsShown
src\horus\gui\util\image_view.py
src\horus\gui\util\scene_view.py
src\horus\gui\workbench\workbench.py
src\horus\gui\workbench\scanning\view_page.py

https://wxpython.org/Phoenix/docs/html/wx.Image.html
https://wxpython.org/Phoenix/docs/html/wx.Image.html#wx.Image.GetAlpha

GetAlphaDataは廃止、GetAlphaかGetAlphaBufferかで迷う
とりあえずGetAlphaBufferで動作(正しいか否かは未検証)

GetAlphaData→GetAlphaBuffer
src\horus\gui\util\opengl_helpers.py

サイドペインの表示が壊れていたり、“wxPyDeprecationWarning: Call to deprecated item”(意訳:廃止されたクラスやメソッドなんて使わないでよね、ぷんぷん)って警告だらけだったりですが、一応wxPython4.0.4で動作するところまでは来ました。細部の修正は後回しにして、次はopencv-pythonのバージョンアップを行います。Python3.x対応までもう一息。


#7

PyOpenGLしてみる
OpenGL/GLUTについて
上記を参考にして、64bit版python2.7(on Windows10)でもHorusを動作させることに成功。C:\Python27_64 に Python2.7 の 64bit 版をインストール、C:\Python27_64\Lib\site-packages\OpenGL\DLLS に glut32.dll と glut64.dll( 64bit 版 glut32.dll のリネーム)を放り込むだけの簡単な対策でO.K.でした。

Horus の opencv-python のバージョンアップ作業では、2.4.13.6 ではキャプチャに成功しますが、3.0.0 に上げると失敗することを確認しました。
こちらの記事にあるような単純なキャプチャプログラムは両者で問題なく動作します。よって、Horus で起きている問題は OpenCV の2.4系から3系へのバージョンアップの際の仕様変更が原因であろうと推測。

仕様関連のURL:
https://docs.opencv.org/2.4.13.6/
https://docs.opencv.org/3.0.0/
http://opencv.jp/opencv-2svn/py/index.html

先ずは関連が深そうな以下のスクリプトから原因箇所の探索を行う予定です。

\src\horus\engine\driver\camera.py


#8

opencv のバージョンを 3.4.1.15 まで上げられました(on Windows10 64bit)。

\src\horus\engine\driver\camera.py

↑これの “cv2.cv.CV_CAP” となっている部分を “cv2.CAP” と置き換えることで 3.4.1.15 までの opencv-python では問題なく動作します。

関連URL
Migrating Code from OpenCV 2.4.x to 3.0+
https://breakthrough.github.io/Installing-OpenCV/migrating/

しかし、3.4.1.15 から 3.4.2.16 に上げようとすると描画が乱れたりカメラへのアクセスに不具合が生じたりと問題が生じます。


Version3.4.2のChangelog には “Video I/O: improved support of Microsoft Media Foundation (MSMF)” とありますので、この辺りに原因があるのかもしれません。

また、試験的に 2to3 で python3 対応コードを出力してみました。こちらは GUI の起動まで行けました。とはいえ、str型、int型、float型の扱いでバグだらけ。全自動でpython3.x系列に移行とはいかないようです。


#9

これこそオープンソースの魅力ですね.
ソフトウェア面ではあまりお手伝いことできないですが,部品調達などはお任せください.

ESIさんの記事はかなり参考になると思いますので,一応ライセンスを設定したらどうでしょう.(creative commonsとか?)
いざという時は小生とスポンサーが味方になれると思います.


#10

温かい言葉に勇気づけられます :smile:

提案頂きましたので、ライセンスを明示しておきます。投稿した文章のうち、出典からの引用を除く部分はクリエイティブ・コモンズ 表示 4.0 国際 ライセンスで自由に利用下さい。

私が投稿した画像と動画についても同じくクリエイティブ・コモンズ 表示 4.0 国際 ライセンスで自由に利用下さい。

なお、今後ここにオリジナルのソフトウェアコードを投稿することがあればMITライセンスを適用するつもりです(緩いので)。


#11

本日のHorusの改造の進捗ですが、wxPython 関連部分の4系列への移植作業がほぼ完了出来ました。Error も Warning も吐かなくなって気分爽快です。残るはOpenCV周りの不具合修正とPython2から3へのコンバートに伴い混入するバグ潰し、及びサイドペインの描画の適正化。

なかなか順調です。


#12

Windows10(64bit)上のPython2.7.16(64bit)でHorusのopencv-pythonを最新版(4.1.0.25)に差し替えて動作させることに成功しました。

https://answers.opencv.org/question/205485/webcam-works-inconsistently/
↑こちらにWindowsでMSMFからカメラにアクセスしようとしてバグとなる場合のワークアラウンドが書かれていましたので、これを元にHorusのコードを修正しました。「DirectShowを使ってね」ってことのようです。

src\horus\engine\driver\camera.pyの114行目を修正


#13

サイドペインの表示の修正ですが、原因となっているのはどうやら

のふたつ。

Windows固有の問題なのか、他のOSでも発生する問題なのかを切り分けるためRaspbian(on Raspberry Pi 3 B+)でHorusを起動させてみました。V4Lに関連するエラーを吐きスキャンこそ出来ませんが、UI周りでの問題は見られません。


#14


一連のコード修正作業に一段落つきました。Windows10でのサイドペインの表示が適正に。

src\horus\gui\workbench\workbench.py

src\horus\gui\util\custom_panels.py

Raspbianのライブラリは安定性を重視してかやや古め。そのためか、V4L2とOpenCVに関わるエラーが発生します。Ciclop/Horusの公式GitHubにこの問題の解説修正済みソースコードが上がっていました。最新のOpenCVでも同様か否かを確認します。

Windows10上ではOpenCVのバージョンによっては起動直後に [ WARN:0] terminating async callback が出ます(その後のスキャンに影響はありませんでした)。この WARNING も原因を見つけ修正しようと思います。

Horusのマルチプラットフォーム対応
とりあえず Windows, Mac, Linux(x86-64/ARM), FreeBSD の Python2.7.16 上で動かしたい。
本格的な Python3.x 系への移植は上記4種のOSで問題なく動くことを確認し、 “[ WARN:0] terminating async callback” を直してから取り掛かります。

Windows10(64bit)https://www.microsoft.com/ja-jp/windows
※ ReactOS 頑張れ。

MacOS(Mojave)https://www.apple.com/jp/macos/mojave/
※ 「もじゃべ」ではない。
※ Debian GNU/Darwin とかあったらいいのに。

Linux
Fedora https://getfedora.org/ja/
Ubuntu https://www.ubuntu.com/ https://www.ubuntulinux.jp/
Raspbian https://www.raspberrypi.org/downloads/raspbian/
※ Slackware や Gentoo 、Archも個性的で魅力的なディストリだと思う。

FreeBSD
GhostBSD https://www.ghostbsd.org/
Debian GNU/kFreeBSD https://www.debian.org/ports/kfreebsd-gnu/index.ja.html

今後の予定(未定)
Python や関連ライブラリを揃えられそうなので Debian GNU/Hurd での Horus の起動とスキャンも試したい。
NetBSDとかDragonFly BSDとかSolarisとかHaikuとかRISC OSとかArcaOSとかReactOSとかでの動作確認は Horus の Python3.x 系への移植が成功してから。あとCiclopを流用しての簡易フォトグラメトリ用サンプルコードも書きたい。

その他
Horus/Ciclop 以外の3Dスキャナプロジェクトとして FreeLSS http://www.freelss.org/ があります。こちらは現在も開発が続いている模様。改造や機能追加の折には色々と参考に出来そうです。


#15

車輪の再発明してました :sob:

開発版のソースに"Bugfix wxpython 3.0"

先に見ておけば良かった。

それと、GhostBSD(デスクトップ向けFreeBSDディストリビューション)の Python2.7.16 でHorusの立ち上げ成功です。

他OS・ハードにおける状況
OpenIndiana(Solaris系)
Haiku(BeOS系)
これらでは必要なライブラリが不足するため、自力ビルドが必要そうです。

Debian/GNU Hurd(GNU Hurd系)
USBカメラを認識してくれませんでした。もう少しOSの開発が進んでから再挑戦。

Debian/GNU kFreeBSD(FreeBSD系)
開発終了っぽいです。残念。
https://www.debian.org/ports/kfreebsd-gnu/index.en.html
daily images でもビルドされてる様子がないし。

daily-build-overview.kfreebsd-amd64.png

daily-build-overview.kfreebsd-i386.png

ReactOS(Windows NT系)
USBを繋いでハングアップさえしなければ、Windows用のソフトウェア資産が流用可能なので割と有望であると思われます。検証予定。

試した中で、新しめのライブラリで実用出来そうな環境は、Windows, Linux, FreeBSD の3つ。

次点で OpenIndiana と Haiku 。Debian GNU/Hurd はOpenCVとUSB周りが厳しめ。ArcaOS(OS/2)とReactOSは今後の検証で確認。

MacOSは手元のがOS9と漢字Talkなので、新環境の準備が整い次第検証を開始します。

AndroidとiOSはどうなんだろう。Python 仕えるよ 使えるよ、みたいな話はちらほら聞きますが、wxWidgetsやOpenCVをPythonから呼び出すとなると厳しそう。


#16

FreeBSD(GhostBSD 19.04)で Horus に Webcam 画像を表示出来ました。

Linux(Raspbian 9.9)は Python3.x 系に opencv-python と wxpython を入れるところで足踏み中。ライブラリが揃えられない場合はラズパイ向けの別ディストリやPC向けディストリで再挑戦します。


#17

Linux(Raspbian 9.9)での進捗です。

Python3 と Python2 に opencv-python 4.1.0 と wxpython 4.0.4 を野良ビルドで導入成功です。加えて pbuilder(chroot下でDebianパッケージを構築するための環境構築ソフト) や checkinstall(野良ビルドをインストール時にパッケージ化するソフト - tgz・rpm・deb対応) の併用で簡易 Debian パッケージ化も出来ました。

なお、Raspbian9.9 上の python-opencv 4.1.0 でも Windows10 の場合と同様にキャプチャサイズの変更に関連して不具合があります。この辺りが原因で Horus 内にカメラからの画像を表示出来ていません。

全体の進捗状況(2019/05/13 Python2.7.16)
Windows10 ◎(Horus起動可能、スキャン可能、Horus内に画像表示可能)
GhostBSD △(Horus起動可能、スキャン不可、Horus内に画像表示可能)
Raspbian △(Horus起動可能、スキャン不可、Horus内に画像表示不可)
MacOS 未着手

おまけ
\ ←これ(バックスラッシュ)で文字装飾をエスケープ出来ますね :grinning:


#18

参考
ARM の OpenCV のビルドで checkinstall がコケる問題

その対策パッチが施されたcheckinstall

sudo checkinstall make install でも回避出来るかもしれない。
※ 野良ビルドパッケージのインストール後は sudo ldconfig を忘れずに。


#19

ラズパイ限定なのか他でもなのかはこれから検証ですが、Linux上の公式版/最新版 opencv-python の野良ビルドで色々と動作不良です。

Linux版(debian系)はこちらからソースを貰ってきてリコンパイルが必要かもしれません。
https://launchpad.net/~bqlabs/+archive/ubuntu/horus/
http://ppa.launchpad.net/bqlabs/horus/ubuntu/pool/main/o/opencv/

opencv_2.4.9.1.2-wily1.debian.tar.gz
opencv_2.4.9.1.2-wily1.dsc
opencv_2.4.9.1.2.orig.tar.gz

の3つを落としてきて、(必要に応じてdscを書き換えて)、構築時の依存パッケージをインストールし、dpkg-buildpackage。pbuilderでchroot環境を作って行うと良さそう。

出典/参考
Debian 新メンテナーガイド
https://www.debian.org/doc/manuals/maint-guide/index.ja.html

Debian 管理者ハンドブックの「第 15 章 Debian パッケージの作成」
https://debian-handbook.info/browse/ja-JP/stable/debian-packaging.html

PC向けのLinuxに関しては、ベーシックなディストリビューションとして
・Slackware
・CentOS
・Debian GNU/Linux
この辺りを検証ターゲットにする予定です。

・Ubuntu
・Fedora
・Gentoo
・Arch
・(Debian sid)
この辺りは余力があれば。

Linuxだけでメジャーなものが四、五系統はあるので、いろいろ面白いです。


#20

Horus (on Linux)続報です。

bqlabs の Horus 用改変版 OpenCV はどうにもビルドプロセスがコケる為、 Raspbian への移植は一時断念。Linux に関しては PC 向けディストリビューションで動作させることに集中します。

GhostBSD の Web カメラ画像取得のバックエンドは Linux から移植された v4l なのですが、あちらではそれほど苦労せず Horus 内での表示まで辿り着いています。

あるいは、PC 上の Linux であれば Raspbian 上とは状況が異なるかもしれません。検証を続けます。