(0)目次&概説
(1) OpenCVとは
(2) OpenCVのインストール
(2-1) インストール資源の入手
(2-2) インストール時の注意事項
(2-3) インストールの実行
(3) OpenCVで静止画像の読込み
(3-1) サンプルプログラム
(3-2) サンプルプログラム解説
(4) こんなエラーが出たらどうする?
(4-1) AttributeError: ‘XXX’ object has no attribute ‘ZZZ’
(1) OpenCVとは
OpenCVとは「Open Source Computer Vision Library」の略で、動画や画像の処理に使う様々な機能が実装されています。また多くのプラットフォームや公式言語をサポートしており、OSはWindowsやLinuxやMacOSに加えてiOSやAndroidもサポートしており、言語はCやC++のみならずJavaやPythonも利用可能です。
(2) OpenCVのインストール
(2-1) インストール資源の入手
PyPIのページより資源をダウンロードします。
https://pypi.org/project/opencv-python/#files
(図1)
(2-2) インストール時の注意事項
依存パッケージとして「NumPy」が必要ですが、pipコマンドでのインストールならば依存関係も含めて対応してくれます(もし無い場合でも、オンライン接続があればダウンロードしてくれます)。
①NumPyインストール未済の場合のメッセージ例
Collecting numpy>=1.10.2 (from opencv-python) Downloading numpy-1.18.1-cp37-cp37m-win_amd64.whl (12.8MB) 100% |████████████████████████████████| 12.8MB 252kB/s
②NumPyインストール済みの場合のメッセージ例
Requirement already satisfied: numpy>=1.14.5 in c:\program files (x86)\microsoft visual studio\shared\python37_64\lib\site-packages (from opencv-python==4.1.2.30) (1.18.1)
(2-3) インストールの実行
(2-3-1) インストール資源の入手
先ほどダウンロードした資源を任意のディレクトリに配備します。私の例では次のディレクトリに配備してインストールを行っています。
C:\Users\Rainbow\Desktop\opencv_python-4.1.2.30-cp37-cp37m-win_amd64.whl
(図2)
(2-3-2) インストールの実施
依存パッケージ等の条件をクリアしていると、次のようにインストールが正常に完了します。
(図3)
インストール実行
↓
インストール完了
C:\Users\Rainbow\Desktop>pip install opencv_python-4.1.2.30-cp37-cp37m-win_amd64.whl Processing c:\users\rainbow\desktop\opencv_python-4.1.2.30-cp37-cp37m-win_amd64.whl Requirement already satisfied: numpy>=1.14.5 in c:\program files (x86)\microsoft visual studio\shared\python37_64\lib\site-packages (from opencv-python==4.1.2.30) (1.18.1) Installing collected packages: opencv-python Successfully installed opencv-python-4.1.2.30
(3) OpenCVで静止画像の読込み
(3-1) サンプルプログラム
次のプログラムはOpenCVで画像を「カラー読み込み」&「縮小」して表示するサンプルプログラムです。
import numpy as np import cv2 import os import sys def main(): TARGET_FILE=r'C:\Users\Rainbow\Desktop\RainbowPlanet_work\TestData\MOA176.jpg' #IMG_SIZE=(400,400) #意図しない縦横比率になるためresizeには使用せず img=cv2.imread(TARGET_FILE,cv2.IMREAD_COLOR) try: height,width=img.shape[0],img.shape[1] resized_img = cv2.resize(img,(width//8,height//8)) cv2.imshow('RainbowImage',resized_img) cv2.waitKey(0) cv2.destroyAllWindows() except AttributeError: print("Failed to load image file.") sys.exit(1) if __name__ == '__main__': main()
■実行例
(図4)
(3-2) サンプルプログラム解説
上記のサンプルプログラムの解説です。
行数 | 処理概要 | 備考 |
7行目 | 「”」の前に「r」を付けるとraw文字列となり、エスケープシーケンス(エスケープ文字)を無効化するため、パスの中の「\」等が通常の文字として扱えます。 | 例えば次の2つのパスは同じ意味になります。 TARGET_FILE=r’C:\TestData\MOA176.jpg’ TARGET_FILE=’C:\\TestData\\MOA176.jpg’ |
8行目 | コメントアウトされていますが、後に画像を表示する際のサイズを指定するための変数です。WidthとHeightを指定していますが、値指定すると縦横比がずれてしまう事があるため、今回はresizeメソッドで縦横比を維持して縮小し、こちらはコメントアウトしています。 | |
9行目 | OpenCVの「cv2.imread([引数1],[引数2])」メソッドで画像を読み込んでいます。 引数1=画像のパス 引数2=画像の読み込み方法です |
第二引数の種類は以下です。 「-1」または「cv2.IMREAD_UNCHANGED」: カラー画像(透明度考慮あり) 「0」または「cv2.IMREAD_GRAYSCALE」: グレースケール 「1」または「cv2.IMREAD_COLOR」: カラー画像(透明度考慮せず) |
10行目~18行目 | 例外処理の開始である「try」句です。構文は下記の通りです。 try: [例外が発生する可能性のある処理] except [例外名]: [例外が発生した際の処理] |
|
11行目 | 「cv2.imread().shape[]」で画像の形状を求めています。引数の「0」が高さ(height)で「1」が幅(width)です。 | |
12行目 | 「cv2.resize([引数1],[引数2])」で画像のリサイズを行っています。 引数1=画像のパス 引数2=リサイズ後の大きさ(width,height) |
|
13行目 | 「cv2.imshow([引数1],[引数2])」で画像をウィンドウで表示してます。 引数1=ウィンドウの名前 引数2=読み込んだ画像データ[cv2.imread()] |
|
14行目 | 「cv2.wait()」関数でキーボードからの入力があるまで処理を待ちます。これをしないと画像が表示されないままプログラムが終了してしまいます。 | ()の中に入れる数字の単位はミリ秒なのでwait(1000)なら1秒間表示されます。 |
15行目 | 「cv2.destroyAllWindows()」で全てのウィンドウを閉じています。例えば「cv2.wait(3000)」の後にこのコマンドを用意すると、3秒後にウィンドウが全て閉じます。 | |
16行目 | 例外「AttributeError」が起きた時の対応です。AttributeErrorは属性が存在しない時のエラーで、次の例では画像が読み込めていないので、高さや幅の情報がないにも関わらず取得しようとしたため、このエラーが起きています。 | |
18行目 | 例外が起きた際に、exceptの分岐に入ってメインプロセスを終了させます。 | exit(1)にて指定している数字はステータスコードで、「1」が異常終了です。 インタラクティブシェル等では、終了の指定は余り意識する事がないかも知れませんが、サービスとして提供する際に必要となってくる。 |
(4) こんなエラーが出たらどうする?
(4-1) AttributeError: ‘XXX’ object has no attribute ‘ZZZ’
上記のサンプルプログラムでそのエラーが出る場合は「画像自体が存在しない」事が原因の一つとして考えられます。
■エラー例
(図5)
事象を再現するため、意図的にエラーを出すプログラムを紹介します。上記のサンプルプログラムと異なるのは次の2点です。
①画像が存在しないファイル(MOA17.jpg)を指定している
②try/catchを外しているため、例外が発生する
なので上記ポイントを改善すると例外を回避できる可能性があります。
■エラー再現プログラム
import numpy as np import cv2 import os import sys def main(): TARGET_FILE=r'C:\Users\Rainbow\Desktop\RainbowPlanet_work\TestData\MOA17.jpg' #IMG_SIZE=(400,400) #意図しない縦横比率になるためresizeには使用せず img=cv2.imread(TARGET_FILE,cv2.IMREAD_COLOR) height,width=img.shape[:2] resized_img = cv2.resize(img,(width//8,height//8)) cv2.imshow('RainbowImage',resized_img) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': main()