【python】OpenCVの関数一覧と使い方

プログラミング
ゆうすけ
ゆうすけ

OpenCVを使ってみたいけど、関数の使い方が分からない・・・。

資格マフィア
資格マフィア

OpenCVの関数一覧とその使い方を説明しよう。


✔️ 本記事のテーマ

 OpenCVの代表的な関数一覧と使い方

 

✔️ 読者さんへの前置きメッセージ


本記事は「OpenCVの関数を処理ベースで」一覧化しています。


処理ベースでまとめているので、
目次から解説部分に飛ぶと、使うべき関数とその使い方を解説しています。


OpenCVは非常に強力なライブラリです。
その使い方をマスターすれば、特に画像処理などで役にたつでしょう。


それでは、順に解説していきましょう。

 

OpenCV の代表的な関数(画像処理)

OpenCV には画像処理のための便利な関数が数多く用意されています。

 

具体的には以下のような関数が用意されています。

 

これらの関数の使い方について、解説していこうと思います。
(上の目次はページ内リンクになっています)

 

(前準備)OpenCV のインストール

前提:OpenCVのimport

OpenCV はサードパーティ製の Python ライブラリです。

 

そのため、開発環境に OpenCV ライブラリをインストールしていないと、
Python ファイルの中で OpenCV を使うことができません。

 

以下のコマンドをターミナルやコマンドプロンプトで実行することで、
OpenCV ライブラリをインストールすることができます。

pip install opencv-python

 

環境ごとに追加作業が必要な場合もありますが、
基本的には、上記コマンドを実行することでインストールは完了します。

 

なお、OpenCVのインストールについての詳細はは
【python】opencvのインストール方法
の記事で書いているので、良ければ参考にしてみて下さい。

 

基本の OpenCV 関数

画像を読み込む OpenCV の関数

画像を読み込む OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

 

画像を読み込むには、cv2.imread 関数を使います。

 

OpenCV で画像処理をするには、
まず画像を読み込む必要があるので、使用頻度の高い関数です。

 

引数ファイル PATH を指定することで、任意の画像を読み込むことができます。

 

なお、OpenCV で画像を読み込む方法については
OpenCVで画像を読み込む方法【Python】
の記事で解説しています。

 

画像をグレースケール化する OpenCV の関数

画像をグレースケール化する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 画像のグレースケール化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

 

画像をグレースケール化するには、cv2.cvtColor 関数を使用します。

 

cv2.cvtColor 関数を使う際は
第1引数で 読み込んだ画像データ
第2引数で OpenCV の独自コード を指定します。

 

なお、OpenCV で画像をグレースケール化する方法については
OpenCVでグレースケール画像を簡単に作成する【Python】
の記事で解説してます。

 

画像をリサイズする OpenCV の関数

画像をリサイズする OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 画像のリサイズ
img_resize = cv2.resize(img, (200,200))

 

画像をリサイズするには、cv2.resize 関数を使用します。

 

(幅, 高さ)の形式で指定したサイズにリサイズします。
サンプルコードでいうと、幅200px、高さ200pxの画像にリサイズしています。

 

なお、OpenCV で画像をリサイズする方法については
OpenCVで画像をリサイズする【cv2.resize】
の記事で解説しています。

 

画像を回転する OpenCV の関数

画像を回転する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 画像の回転
img_rotate = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

 

画像を回転するには、cv2.rotate 関数を使用します。

 

第2引数で指定するコードによって、回転方法を変えることが出来ます。

ROTATE_90_CLOCKWISE : 時計回り
ROTATE_90_COUNTERCLOCKWISE : 反時計回り
ROTATE_180 : 180°回転

 

なお、OpenCV で画像を回転する方法については
OpenCVで画像を回転させる【Python】
の記事で解説しています。

 

描画系の OpenCV 関数

画像に文字を印字する OpenCV の関数

画像に文字を印字する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 文字の印字
cv2.putText(img,
            text='sample text',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)


画像に文字を印字するには、cv2.putText 関数を使用します。

 

putText 関数は引数が多いので、それぞれの引数に適切な値を設定しましょう。

 

なお、OpenCV で文字を印字する方法については
【OpenCV】cv2.putText関数の使い方【文字を描画する】
の記事で解説しています。

 

画像に円を描画する OpenCV の関数

画像に円を描画する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 円の描画
cv2.circle(img,
           center=(100, 150),
           radius=60,
           color=(0, 255, 0),
           thickness=3,
           lineType=cv2.LINE_4,
           shift=0)


画像を保存するには、cv2.circle 関数を使用します。

 

cv2.circle 関数を使うことで、プログラムで画像に円を描くことができます。

 

なお、OpenCV で円を描画する方法については
【OpenCV】cv2.circle関数の使い方【円を描画する】
の記事で解説しています。

 

画像に四角形を描画する OpenCV の関数

画像に四角形を描画する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 四角形の描画
cv2.rectangle(img,
              pt1=(50, 150),
              pt2=(125, 250),
              color=(0, 255, 0),
              thickness=3,
              lineType=cv2.LINE_4,
              shift=0)


画像を保存するには、cv2.rectangle 関数を使用します。

 

円を描画する関数と基本的な使い方は同じです。

 

なお、OpenCV で四角形を描画する方法については
【OpenCV】cv2.rectangle関数の使い方【長方形を描画する】
の記事で解説しています。

 

画像に直線を描画する OpenCV の関数

画像に直線を描画する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 直線の描画
cv2.line(img,
         pt1=(50, 150),
         pt2=(300, 300),
         color=(0, 255, 0),
         thickness=3,
         lineType=cv2.LINE_4,
         shift=0)


画像を保存するには、cv2.line 関数を使用します。

 

直線の始点と終点は座標で指定します。

 

なお、OpenCV で直線を描画する方法については
【OpenCV】cv2.line関数の使い方【線分を描画する】
の記事で解説しています。

 

画像に矢印線を描画する OpenCV の関数

画像に矢印線を描画する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# 矢印線の描画
cv2.arrowedLine(img,
                pt1=(50, 150),
                pt2=(300, 300),
                color=(0, 255, 0),
                thickness=3,
                line_type=cv2.LINE_4,
                shift=0,
                tipLength=0.1)


矢印線を描画するには、cv2.arrowedLine 関数を使用します。

 

基本的な使い方は、直線を描画する関数と同じです。

 

なお、OpenCV で矢印線を描画する方法については
【OpenCV】cv2.arrowedLine関数の使い方【矢印を描画する】
の記事で解説しています。

 

画像にポインターを描画する OpenCV の関数

画像にポインターを描画する OpenCV の関数

import cv2


# 画像の読み込み
img = cv2.imread('./sample.png')

# ポインターの描画
cv2.drawMarker(img,
               position=(100, 300),
               color=(0, 255, 0),
               markerType=cv2.MARKER_CROSS,
               markerSize=20,
               thickness=2,
               line_type=cv2.LINE_4
               )


ポインターを描画するには、cv2.drawMarker 関数を使用します。

 

引数 markerType で描画するポインターの種類を設定します。

 

なお、OpenCV でポインターを描画する方法については
【OpenCV】cv2.drawMarker()の使い方【ポインターを描画する】
の記事で解説しています。

 

検出系の OpenCV 関数

画像から円を検出する OpenCV の関数

画像から円を検出する OpenCV の関数

import cv2
import numpy as np


img = cv2.imread("./sample.png")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=100, param2=60, minRadius=0, maxRadius=0)

circles = np.uint16(np.around(circles))

for circle in circles[0, :]:
    # 円周を描画する
    cv2.circle(img, (circle[0], circle[1]), circle[2], (0, 165, 255), 5)
    # 中心点を描画する
    cv2.circle(img, (circle[0], circle[1]), 2, (0, 0, 255), 3)


画像から円を検出するには、cv2.HoughCircles 関数を使用します。

 

ただし、cv2.HoughCircles 関数は前処理が必要なので、注意しましょう。

 

なお、OpenCV で画像から円を検出する方法については
【OpenCV】cv2.HoughCircles()の使い方【円を検出する】
の記事で解説しています。

 

画像から直線を検出する OpenCV の関数

画像から直線を検出する OpenCV の関数

import cv2
import numpy as np


img = cv2.imread("./sample.png")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

reversed_gray = cv2.bitwise_not(gray)

lines = cv2.HoughLinesP(reversed_gray, rho=1, theta=np.pi/360, threshold=80, minLineLength=400, maxLineGap=5)

for line in lines:
    x1, y1, x2, y2 = line[0]

    line_img = cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 3)


画像から直線を検出するには、cv2.HoughLinesP 関数を使用します。

 

直線を検出する際にも、前処理が重要になってきます。

 

なお、OpenCV で画像から直線を検出する方法については
【OpenCV】cv2.HoughLinesP()の使い方【直線を検出する】
の記事で解説しています。

 

画像から輪郭を検出する OpenCV の関数

画像から輪郭を検出する OpenCV の関数

import numpy as np
import cv2


# 画像を読み込む
img = cv2.imread('./sample.jpg')

# 画像のグレースケール化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 画像の白黒2値化
ret, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)

# 輪郭を抽出する
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 輪郭を画像に書き込む
output = cv2.drawContours(img, contours, -1, (0,255,0), 3)


画像から輪郭を検出するには、cv2.findContours 関数を使用します。

 

輪郭の検出をするためには画像を白黒2値化するのを忘れないようにしましょう。

 

なお、OpenCV で画像から輪郭を検出する方法については
OpenCVで輪郭抽出をするコツ【サンプルコード】
の記事で解説しています。

 

画像から顔を検出する OpenCV の関数

画像から輪郭を検出する OpenCV の関数

import cv2


face_cascade_path = '/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml'

face_cascade = cv2.CascadeClassifier(face_cascade_path)

src = cv2.imread('/tmp/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    
cv2.imwrite('/tmp/lena_after.png', src)


画像から顔を検出するには、detectMultiScale 関数を使用します。

 

顔を検出するには OpenCV の検出器を使います。

 

なお、OpenCV で画像から顔を検出する方法については
OpenCVで顔を検出する【Python】
の記事で解説しています。

 

画像から目を検出する OpenCV の関数

画像から目を検出する OpenCV の関数

import cv2


eye_cascade_path = './haarcascade_eye.xml'

eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

src = cv2.imread('./sample.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

eyes = eye_cascade.detectMultiScale(src_gray)


for x, y, w, h in eyes:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)

cv2.imwrite('./sample_after.png', src)


画像から目を検出するにも、detectMultiScale 関数を使用します。

 

目を検出するときは、そのための検出器を使用します。

 

なお、OpenCV で画像から目を検出する方法については
画像から目を検出する【OpenCV】
の記事で解説しています。

 

ファイル出力系の OpenCV 関数

画像を PNG から JPG に変換する OpenCV の関数

import glob
import cv2


input_dir = './target_input/'
output_dir = './target_output/'


files = glob.glob(input_dir + '*')

for file in files:
    file_name = file.split('/')[-1]
    rm_ext_file_name = file_name.split('.')[0]

    img = cv2.imread(input_dir + rm_ext_file_name + '.png')
    cv2.imwrite(output_dir + rm_ext_file_name + '.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 95])


画像を PNG から JPG への変換は、cv2.imwrite 関数を応用して行います。

 

処理としては、拡張子を付け替えることで、画像の変換を実現します。

 

なお、OpenCV で画像を PNG から JPG に変換する方法については
PythonでPNG画像をJPG画像に変換する
の記事で解説しています。

 

画像を保存する OpenCV の関数

import cv2


img = cv2.imread('./sample.png')

# ...
# 画像処理をする
# ...

cv2.imwrite('./sample_after.png', img)


画像を保存するには、cv2.imwrite 関数を使用します。

 

第1引数で指定したPATHの画像ファイルとして保存します。

 

OpenCV の画像処理は流れとして、

  1. cv2.imread 関数で画像を読み込む
  2. OpenCV の関数で画像処理を加える
  3. cv2.imwrite 関数で画像を保存する

といった使い方をします。

 

なお、OpenCV で画像を保存する方法については
OpenCVで画像を保存する方法【Python】
の記事で解説しています。

 

画像処理プログラミングを独学で勉強するなら

OpenCVをマスターするには

今回は、OpenCVの使い方について解説しました。

 

OpenCVは画像処理には欠かすことのできないライブラリです。

 

もし、OpenCVについてスキルをつけるなら、Udemyの教材がオススメです。

>> 【Pythonで学ぶ】OpenCVでの画像処理入門

 

Udemyは動画ベースで学習ができます。
よって、実際のコードや図解を見ながら、学習を進めることができます。

 

さらに今なら30日間返金保証がついているので、
一度購入して自分の思っていたものと違った場合は費用がかかりません。

 

先ほどの教材はOpenCVの基礎から応用まで徹底的に解説しています。

 

OpenCVライブラリについて理解するところから、実際に画像処理を行うところまでを動画で解説しているので、非常に実践的な教材です。

 

また、Pythonについて基礎から学ぶのであれば、オンラインスクールがオススメです。


オンラインスクールで学習すると、講義も分かりやすく、
サポート体制もしっかりしているので、これからPythonを学ぶ人にもオススメです。


オンラインで無料レッスンを体験することもできるので、
自分にあっているかどうかを確かめることができます。


オススメは以下の3つです。
どのスクールも無料体験が用意されているので、
契約前に自分に最適なスクールを探すことができるでしょう。

✔️オススメのプログラミングスクール ベスト3

これらのプログラミングスクールは全て無料の体験コースがあります。

 

「雰囲気だけでも知りたい」
「プログラミング学習の全体像を知りたい」
「スクールに入るかどうか迷っている」
という方はとりあえず無料カウンセリングを受けてみることをオススメします。

 

無料カウンセリングだけなら費用はかかりませんし、
スクールに通うにしろ、独学で学ぶにしろ、
カウンセリングで得ることができる情報には価値があります

 

プログラミングスクールについては「プログラミングスクールで失敗しないためには【オススメベスト3も紹介】」の記事でも紹介しています。


気になった方はぜひチェックしてみて下さい〜!

コメント

タイトルとURLをコピーしました