Jupyter/Pythonを使ったHalcon開発環境の構築

## はじめに
画像処理ライブラリはたくさん存在しますが、よくインターネット上で知られているのはOpenCVかと思います。オープンなライブラリなので、コストをかげずに画像処理したい方には十分ですが、周りに使いこなしている方やインターネット上のコミュニティから情報を収集しないと、使いこなしが難しいライブラリのように感じます。趣味、学術分野や詳しい人がいそうな企業であれば問題ないかもしれませんが、画像処理を本業としないけど画像処理を使って業務効率化を目指したい方には敷居が高いです。今回紹介するHalconは、製造業の画像処理が得意なちょっと高価な有償ライブラリで、周りに画像処理が得意な人はいないが、自分は画像処理を使って製造現場の効率化を図りたいと考えている人には最適なソリューションです。国内ではリンクスが代理店をしており、購入後のサポートも優秀ですので、孤独な戦いをする必要なく画像処理を業務に適用できます。
ただ、サポートが優秀でも、どんなことをやりたいのか？は、開発者にしか決められません。なので、とにかくHalconで画像処理で試してみて、やりたいことのイメージを膨らませ、具体的に画像処理にて改善したいプロセスを検討することが大事です。本記事では、この画像処理アルゴリズム開発を、高効率で実施するための環境作りを目指したいと思います。
## 一般的なHalcon画像処理アルゴリズム開発について
Halconには優秀なHDevelopというIDEが存在します。通常はこれを使って開発するのがよいです。豊富なサンプルプログラムへの容易なアクセスおよび画像処理に特化したデバッグ機能があります。通常のプログラム開発では、文字列や数値を扱いますが、画像もデバッグ対称な変数として使える画像処理特化型デバッグツールが存在するので、アルゴリズム開発には、このHDevelopを使うほうが便利です。そして、アルゴリズムを開発し実際の現場に適用する際、エンドユーザーうけの良いGUI作成には、VB,C#の.net開発環境のVisual Studioを使って開発もできます。また、HDevelopを使わず、いきなりVisual Studioを使って開発できるようですが、HalconのIDEほど直感的にデバッグすることができない印象があり、日本語で細かなチュートリアル的なマニュアルが見当たらない状況です。なので基本は、HDevelopで開発し、そのプログラムをVB,C#に移植します。HDevelopは標準でVB,C#への言語変換のエクスポートをサポートしていますので安心です。
## Python/Jupyterを使うメリット
いままで、いかにHDevelopを使うと容易にアルゴリズム開発できるかを説明してきました。GUIもVB,C#で簡単に作ることができます。では、なぜ本記事はPython/Jupterを使うことことを提案するのか？と疑問に持つ方もいるかもしれません。その解は、学術的な環境やアルゴリズムの文献はなぜpythonやJupyterを使っているのかを考えるとよいかと思います。私の考えは、Pythonは、言語仕様の優位性より無償・有償ライブラリが多く存在することが人気の理由だと考えています。私はC#を主として20年以上プログラム開発をしてきましたが、正直pythonのライブラリの豊富さにはかないません。C#では実現したいものはゼロから自分で作るに対して、pythonは、まず実現したいことは、この世の中の誰かがすでに作っているはずという視点からライブラリを検索し使い方を学び、自分用に実装するという形態をよくとります。この違いは、アウトプットを出すまでの期間が全然違います。また情けないことに最近の.net界隈は、numpyをC#でも使えるようにするとか、pythonからライブラリを輸入するような感じになっています。なので私も輸出元のpythonを習得したくなりました。次にJupyterのメリットは、正直最近までよくわからなかったですが、画像アルゴリズム開発をしていると、画像の加工と適用したアルゴリズムをメモとプログラムコードを一緒に記述することで、頭の整理が進みます。そして、メモはただのテキストだけではなく、markdwon,texを使って文書整形でき、数式、画像を一緒のファイルにまとめられるという点が良いです。そしてメモは、サンプルプログラムを試せる配布可能なレポートとしての役割を持たせることができます。しかも、このJupyterのプログラムのなかにスライドバーなどのGUIを埋め込んで容易に変数を可変することもできますので、パラメータを変えながら画像の変化する様子を確認できる動的なレポートとなります。これは、紙ベースのレポートではできなかったことで、パソコンで文書を読む時代にふさわしいレポートになります。
なので、私は、HDevelopで開発し、GUIを作成しエンドユーザー向けのソフトに仕立てる際、VB,C#に移植するということをやっていましたが、本記事のお題に記載してあるとおり、python/Jupterで基礎的なアルゴリズムを検証し、pythonを使ったGUIで、開発を進めていけると効率がよいのではと考えています。




## 開発環境
Windows10のVisual Studio Code（以後Vscode）の拡張機能を使ってpython/Jupyterを使って説明します。pythonには、いくつか種類がありますが、メジャーなものは、python.org、anacondaが配布するものになります。anacondaは最初からいろいろ入っているので初心者にはよいのですが、pythonでの開発は、冒頭で話をしたとおり、世の中にあるライブラリを取り寄せて自分用にアレンジするスタイルをとるため、配布されているライブラリに合わせて、pythonのバージョン、ライブラリがimportしている他のライブラリのバージョンを合わせて選択する必要があります。よってpythonには１つ１つのプログラムに最適なPythonバージョン、ライブラリが1パッケージになったものを適用できるように仮想環境と呼ばれる仕組みが存在します。最初からいろいろ入っているanacondaは一見親切そうに見えますが、全部のプログラムが動作するひとつの環境というのは存在しないので、使いこなしていくと、anaconda環境をリセットしないといけない状況になりがちです。その点、python.orgが配布するpythonはシンプルなので、ほしいものを後から自分で追加するスタイルなので、本来のpythonの使い方にあっています。

## インストール
pythonのインストールが終わったら、すぐにでもライブラリを入れたくなりますが、いったん一呼吸してください。venvコマンドで、まずは仮想環境を作成することが最優先事項です。その後、仮想環境を立ち上げて、そこにpipコマンドで、必要なライブラリを入れていくことになります。下記に一通りの流れを示します。本記事は、halconを使うことが目的なので、細かいインストール方法は、私が参考にしたホームページのリンクをつけたいと思います。

Pythonは下記ホームページが詳しくてわかりやすかったです。

[Windows版Pythonのインストール](https://www.python.jp/install/windows/install.html)



Pythonのインストールが終わりましたら、次はコマンドプロンプトを開き、下記のコマンドを実行します。今回は、c:\python\venvのフォルダをあらかじめ作成していることが前提です。ここはお使いの環境に合わせて仮想環境を用意するフォルダを作成して、読み替えてください。参考までに仮想環境に本記事のパッケージをインストールするとおおよそ600MB程度消費します。十分容量のあるドライブを選択することをお勧めします。すぐにGBクラスまでいきます。
``` io
cd c:\python\venv
python -m venv .ha2211
cd c:\python\venv\.ha2211\Script
activete  
```
ここまでくるとコマンドプロンプトの先頭に仮想環境にいることを示す(.ha2211)が表示されていると思います。
``` io
(.ha2211) C:\python\pyvenv\.ha2211\Scripts>
```
ここで、一度どのくらいパッケージがインストールされているか確認したいと思います。
私の環境では下記のリストになりました。なにもインストールされていません。この程度であれば、仮想環境のフォルダは60MB程度のドライブの容量を消費します。
``` io
pip list

Package    Version
---------- -------
pip        22.3.1
setuptools 65.5.0
```
では、ここから必要なパッケージをインストールしていきたいと思います。
まずは、Halconですが、私は最新の22.11Progress版を使っているので下記のように記載します。お使いのバージョンに合わせたものをインストールする必要がありますので、ここはHalconのサポートに確認してください。
``` io
pip install -Iv mvtec-halcon==2211
```
次に、Jupyter notebookを使って開発するためのパッケージをインストールします。
``` io
pip install notebook
```

Jupyter上にスライドバーやボタン等を配置できるようにするipywidgetライブラリと画像表示用にpillowをインストールします。

``` io
pip install ipywidget
pip install pillow
```
HalconのHObjectをnumpy形式にするために、numpyもインストールします。
``` io
pip install numpy
```
最後に動作確認として、pythonのインタラクティブシェルにてHalconをインポートできるか確認します。
下記のように何事もエラーなく実行できればOKです。
``` io
C:\python\pyvenv\.ha2211\Scripts>python
Python 3.11.1 (tags/v3.11.1:a7a450f, Dec  6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import halcon as ha
>>>
```

ここまでできれば、もうHlaconをpythonで使用する準備は整いました。


## インストール（Vscode）
Vscodeのインストールは、下記ホームページからダウンロードすれば簡単に終わります。1点注意点があるとすれば、インストール先がProgramFilesではなく、デフォルト設定通りUserフォルダにしたほうがよさそうです。

[Visual Studio Code ダウンロード](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

インストール後、最初に起動した際、なにやらバックグラウンドでいろいろ拡張機能をダウンロードが始まり、その後ソフトの再起動を求められるかもしれません。その指示に従えば、日本語仕様になると思います。
もしうまくいかない場合は、メニューの「view」→「Command Palette」を開き、「Configure Display Language」と入力すると、該当する設定が開きますので日本語を選択することで強制的に日本語化できます。
このCommand Paletteで、コマンドを入力して所望の設定に飛ぶというのがVscodeの特徴です。便利なのか不便なのかよくわかりませんが、初心者でかつネットですぐに検索してやりたいことを探す癖のない人は面倒くさいエディタかもしれません。
次に、test.pyという空ファイルを作成すると、python関連の拡張機能のダウンロードが始まります。また、test.ipynbを作成すると、python拡張機能同様に、今度はjupyter関連の拡張機能のダウンロードが始まります。うまくできなかった場合は。拡張機能で「jupyter」を検索すると、jupyter拡張機能のインストールすることができます。

また、仮想環境を適用してjupyterを使う場合は、下記のホームページを参考にしました。

[VS CodeでJupyterしてみよう](https://atmarkit.itmedia.co.jp/ait/articles/2108/06/news030.html)



## Jupter notebookサンプルコード
ここからは、実際にJupyterでHlaconを操るサンプルコードを書いてみたいと思います。まず画像処理の基本である画像の表示を簡単にする関数を事前に用意します。下記debugimgはHalconのHobjectをnumpy_arrayに変換したものをpillowでjupyter notebook上に表示するものです。ただ、単純に画像を表示するだけでは、高解像度の画像であれば、ディスプレイに入りきれない状態になりますので、縮小表示して、ipywidgetsのスライドバーで任意のサイズに変更する機能を有しています。この関数は、4行のプログラムですが、今回インストールしたライブラリすべてをテストできるようになっています。簡単なプログラムですが、今後pythonでhalcon画像処理をする上でので基礎となるコードとなります。




```python
import halcon as ha
from PIL import Image
import ipywidgets as widgets
def debugimg(image_hobject,mk=0.1):
    #Halcon HObject->numpy arrayに変換
    nimg=ha.himage_as_numpy_array(image_hobject)
    #numpy array形式の配列をpillowで扱える形式に変換
    pimg=Image.fromarray(nimg)
    #引数mkで画像のサイズを変換したデータをjupyter上に表示
    return pimg.resize((round(pimg.width*mk),round(pimg.height*mk)))
    
```

上記コードを定義して、先に実行しておくことで、下記コードを実行するとサイズ変更可能な画像を表示することができます。


```python
himg=ha.read_image('C:/temp/test.jpg')
widgets.interact(debugimg,image_hobject=himg,mk=(0,1,0.01))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/2b842589-6f3e-c708-d2d3-f1186bc435de.png)





## まとめ
非常に簡単なプログラムですが、Halconとpythonが容易につながることを示すことができたかと思います。冒頭でもコメントしましたが、pythonには豊富なライブラリが多数あります。特に私が興味あるのは、ロボット関連です。Halconとロボット関連を組み合わせたシステムを作る際にも、Halconとpythonは良い組み合わせになると期待しています。今後このあたりの記事も書いていきたいと思います。