ブログ

PythonとOpenCVの小技①

本当ならオリンピックがいよいよ始まるという時期だった7月4連休、家でゴロ寝も飽きたのでせっせと記事更新のsayaです。

最近は記事を見てくださる方の傾向としてPythonとUSBカメラあたりを見てくれている方が多いようなので、少し私がよく使っているプログラムを公開します。(ま、私もネットから探してくたりしてるんでるが)

画面上にラインを引く

プログラムをいろいろ処理する上で、「写真全体を処理する」ことは実はそんなに多く無いんです。大体が「特定の部分を抜き出して処理する」とか「特定の部分を抜き出して表示する」とかなんですね。

そこでよく使われるのが「画面上に赤線で枠を描写したいんだけど・・・」といった技術です。枠を描けばどこを処理しているか一目瞭然。また私もユーザー向けにUSBカメラを使ったGUIアプリを作ったりしますが、処理部には必ずこの枠線を表示して、どこを処理しているかを明確にしています。

コード全文を用意しようと考えたんですけど、考えてみたら「あ、設定値とかすごいモジュール化されててすごいめんどう・・・」となったので、重要部分だけ書きます。気が向いたら起動確認したコード全文掲載します。

まず重要なのはnumpyモジュールをインストールすることです。(私はPython3.xとpip3を使用していますが、インストール次は必ずpython2.x系とは違うことがわかるように明示しています)

これでUSBカメラの画像を取得した時に、データ配列を操作できるモジュールをインストールすることができました。

インポートも素直にできます。

さて、USBカメラから画像を読み込むのは別ページまたはWEBで検索していただくとしまして、以下には赤線を引く処理を示します。

このframeに対して、ピクセルの色を直接変更します。

ここで出てくる[]の中の書き方ですが、まず[100:102:]は、画面の上から100ピクセルを開始として102ピクセルを終了とする。その間の全てのピクセルを指定という意味になります。最後の引数を省略することで、すべて指定という意味になります。

これは使いかたを調べていただいた方が詳しくわかりますが、この最後の引数は「○○ピクセル毎の間隔で指定する」という意味になりますので、例えば[0:100:20]だと0から100ピクセルまで20ピクセル毎に、今回なら赤線を指定するという意味になります。ぶっちゃけ私もいまだに使いながら混乱するところです。

あと、余談ですがOpenCV関係を調べていくとこの画像配列は2次元ではなく3次元で表記される、みたいな話がでてくることがあります。私も詳しく調べたわけではないのですが、ピクセルは場所情報(2次元)と色情報(1次元)をもっているので、合わせて3次元になるそうです。(よくわからん)

あとは通常通りcv2.imshow(window_name, frame)と画面に表示するコードで赤線が引けるかと思います。

注意して欲しい点としては、画像データ(frame)のピクセルを直接指定して書き換えているので、書き換えたところは元に戻りません。レイヤーとかで重ねているわけでは無いので。なので赤線の枠の部分を処理の判定に含めたりしてしまうと異常値が出たりするので、そこだけは気をつけてください。

というわけで今回は簡単な小技でした。実際に動くコードはまた後日掲載したいと思います。

そろそろ梅雨明けというわりには雨がしっかり降っている7月末。

コメントを残す

*