OpenCVを使ってみたいけど、関数の使い方が分からない・・・。
OpenCVの関数一覧とその使い方を説明しよう。
✔️ 本記事のテーマ
OpenCVの代表的な関数一覧と使い方
✔️ 読者さんへの前置きメッセージ
本記事は「OpenCVの関数を処理ベースで」一覧化しています。
処理ベースでまとめているので、
目次から解説部分に飛ぶと、使うべき関数とその使い方を解説しています。
OpenCVは非常に強力なライブラリです。
その使い方をマスターすれば、特に画像処理などで役にたつでしょう。
それでは、順に解説していきましょう。
OpenCV の代表的な関数(画像処理)
OpenCV には画像処理のための便利な関数が数多く用意されています。
具体的には以下のような関数が用意されています。
- 基本のOpenCV 関数
- 描画系の OpenCV 関数
- 検出系の OpenCV 関数
- ファイル出力系の OpenCV 関数
これらの関数の使い方について、解説していこうと思います。
(上の目次はページ内リンクになっています)
(前準備)OpenCV のインストール
OpenCV はサードパーティ製の Python ライブラリです。
そのため、開発環境に OpenCV ライブラリをインストールしていないと、
Python ファイルの中で OpenCV を使うことができません。
以下のコマンドをターミナルやコマンドプロンプトで実行することで、
OpenCV ライブラリをインストールすることができます。
pip install opencv-python
環境ごとに追加作業が必要な場合もありますが、
基本的には、上記コマンドを実行することでインストールは完了します。
なお、OpenCVのインストールについての詳細はは
「【python】opencvのインストール方法」
の記事で書いているので、良ければ参考にしてみて下さい。
基本の OpenCV 関数
画像を読み込む OpenCV の関数
import cv2
# 画像の読み込み
img = cv2.imread('./sample.png')
画像を読み込むには、cv2.imread 関数を使います。
OpenCV で画像処理をするには、
まず画像を読み込む必要があるので、使用頻度の高い関数です。
引数でファイル PATH を指定することで、任意の画像を読み込むことができます。
なお、OpenCV で画像を読み込む方法については
「OpenCVで画像を読み込む方法【Python】」
の記事で解説しています。
画像をグレースケール化する 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 の関数
import cv2
# 画像の読み込み
img = cv2.imread('./sample.png')
# 画像のリサイズ
img_resize = cv2.resize(img, (200,200))
画像をリサイズするには、cv2.resize 関数を使用します。
(幅, 高さ)の形式で指定したサイズにリサイズします。
サンプルコードでいうと、幅200px、高さ200pxの画像にリサイズしています。
なお、OpenCV で画像をリサイズする方法については
「OpenCVで画像をリサイズする【cv2.resize】」
の記事で解説しています。
画像を回転する 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 の関数
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 の関数
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 の関数
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 の関数
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 の関数
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 の関数
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 の関数
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 の関数
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 の関数
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 の関数
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 の関数
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 の画像処理は流れとして、
- cv2.imread 関数で画像を読み込む
- OpenCV の関数で画像処理を加える
- cv2.imwrite 関数で画像を保存する
といった使い方をします。
なお、OpenCV で画像を保存する方法については
「OpenCVで画像を保存する方法【Python】」
の記事で解説しています。
画像処理プログラミングを独学で勉強するなら
今回は、OpenCVの使い方について解説しました。
OpenCVは画像処理には欠かすことのできないライブラリです。
もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。
この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。
OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説した多くの関数も掲載されています。
エンジニアとしての自身の価値をチェックする(完全無料)
エンジニアとして、
自分の価値がどれくらいのものかご存知でしょうか?
エンジニアとしてIT業界に身を置いていると
今の会社でずっと働くのか、フリーランスとして独立するのか …
と様々な選択肢があります。
どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも
自身の価値を知っておくことはとても重要です。
TechClips ME では、
職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。
▼▼▼▼▼
▲▲▲▲▲
しかもTechClips MEでは想定年収を企業から提示してくれるので、
自身の価値を数字で分かりやすくたしかめることができます。
登録はもちろん完全無料なので、一度登録してみると良いかもしれません。
コメント
[…] 【python】OpenCVの関数一覧と使い方 […]