Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

OpenCV Python

PythonにOpenCVを導入して画像を読込み&表示&拡大縮小してみる

投稿日:2020年1月23日 更新日:

(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()

 

目次にもどる

 

Adsense審査用広告コード


Adsense審査用広告コード


-OpenCV, Python

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Pythonでargparseを用いて引数を受け取って実行する方法

<目次> (1) Pythonでargparseを用いて引数を受け取って実行する方法  (1-1) argparseとは?  (1-2) 基本的な使い方  (1-3) サンプルプログラム (2) 参考 …

Slack AppのWorkflow Stepsの使い方

  <目次> (1) Slack AppのWorkflow Stepsの使い方  (1-0) やりたいこと  (1-1) STEP1:Slackボットの開発(所要時間:60分)  (1-2) …

Pythonでcsvのカラム名・テーブルのレコードを取得する方法

今回PythonのPandasライブラリを用いてcsvファイルを読み込み、カラム名やテーブルのレコードを取得する方法をご紹介します。 <目次> (1) Pythonでcsvのカラム名・テーブルのレコー …

Pythonの「Import “requests” could not be resolved from source Pylance」エラーの原因と対処について

  <目次> (1) Pythonの「Import “requests” could not be resolved from source Pylance」エラーの …

CondaHTTPError: HTTP 000 CONNECTION FAILED for url XXXXエラーの対処方法

  <目次> (1) CondaHTTPError: HTTP 000 CONNECTION FAILED for url XXXXエラーの対処方法  (1-1) 事象概要とエラーメッセージ …

  • English (United States)
  • 日本語
Top