【OpenCV】cv2.drawMarker()の使い方【ポインターを描画する】

【OpenCV】cv2.drawMarker()の使い方【ポインターを描画する】プログラミング
ゆうすけ
ゆうすけ

cv2.drawMarker()ってどう使うんですか・・・?

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

cv2.drawMarkerはポインターを描画できる便利な関数だ。
関数の使い方も解説しよう。

 

✔️ 本記事のテーマ

 cv2.drawMarkerの使い方

 

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

本記事は「OpenCV の drawMarker関数」について書いています。

 

この記事を読むことで
「cv2.drawMarkerの使い方 や 画像にポインターを描画する方法」
について理解できます。

 

OpenCVには画像処理を行うための様々な関数が用意されています。

その中の一つにcv2.drawMarker関数があります。

 

cv2.drawMarker関数を使えばプログラムで「ポインターを描画する」ことができます。

 

この記事ではcv2.drawMarker関数の使い方や関数に与える引数まで徹底的に解説します。

 

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

 

cv2.drawMarker関数のサンプルコード

cv2.drawMarker関数のサンプルコード

cv2.drawMarkerを使用したサンプルコードは以下のようなコードです。
この記事ではこのサンプルコードに沿って解説していきます。

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.imwrite('./sample_after.png', img)

 

このサンプルコードによって、生成される画像がこちらです。

OpenCVのdrawMarker関数のサンプル画像

 

画像中に十字ポインターが描画されていることが分かるかと思います。

 

cv2.drawMarker関数の引数について

cv2.drawMarker関数の引数について

サンプルコードの通り、cv2.drawMarker関数は7個の引数を取ります。

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関数の第1引数:img

cv2.drawMarker関数の第1引数 img対象の画像データです。
Ndarray 型で指定します。

 

OpenCVで画像処理を行うためには、
まずcv2.imread関数によって画像データを読み込む必要があります。

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

 

サンプルコードではpythonファイルと同階層にある sample.png を読み込んでいます。

 

このようにして、読み込んだ画像データをcv2.drawMarker関数に引数として渡すことで、
その画像データに対してポインターを描画します。

 

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

 

cv2.drawMarkerの第2引数:position

cv2.drawMarkerの第2引数 position は描画するポインターの座標です。
(int型, int型)のtupleで指定します。

 

座標は(x座標のピクセル, y座標のピクセル)の形式で指定する必要があります。

 

サンプルコードでは position=(100, 300) と指定しているので、
x座標: 100px, y座標: 300pxの位置にポインターを描画しています。

 

試しに、 position=(100, 100) とすると、以下の画像のように描画されます。

cv2.drawMarker(img,
               position=(100, 100),
               color=(0, 255, 0),
               markerType=cv2.MARKER_CROSS,
               markerSize=20,
               thickness=2,
               line_type=cv2.LINE_4
               )

OpenCVのdrawMarker関数の引数position画像

 

 

cv2.drawMarker関数の第3引数:color

cv2.drawMarkerの第3引数 color は描画するポインターの色です。
(int型, int型, int型)のtupleで指定します。

 

colorは以下のBGR形式で指定する必要があります。

color = (青, 緑, 赤)

このような順番で3原色を数値で指定します。
各色の最大値は255です。

 

サンプルコードでは color=(0, 255, 0) としているので緑色を指定していることになります。

 

試しに color=(0, 0, 255)とすると、以下の画像のように赤色のポインターが描画されます。

cv2.drawMarker(img,
               position=(100, 300),
               color=(0, 0, 255),
               markerType=cv2.MARKER_CROSS,
               markerSize=20,
               thickness=2,
               line_type=cv2.LINE_4
               )

OpenCVのdrawMarker関数の引数color画像

 

 

cv2.drawMarkerの第4引数:markerType

cv2.drawMarkerの第4引数 markerType は描画するポインターの種類です。
OpenCVの独自コードで指定します。

 

markerType では以下のコードを選択することができます。

  • cv2.MARKER_CROSS
  • cv2.MARKER_TILTED_CROSS
  • cv2.MARKER_STAR
  • cv2.MARKER_DIAMOND
  • cv2.MARKER_SQUARE
  • cv2.MARKER_TRIANGLE_UP
  • cv2.MARKER_TRIANGLE_DOWN

 

各コードを使うことで描画するポインターの図形が異なります。


例えば cv2.MARKER_STAR を使用すると以下のような図形が描画されます。

cv2.drawMarker(img,
               position=(100, 300),
               color=(0, 255, 0),
               markerType=cv2.MARKER_STAR,
               markerSize=20,
               thickness=2,
               line_type=cv2.LINE_4
               )

OpenCVのdrawMarker関数の引数markerType画像

 

全てのコードに対する詳細はOpenCVの公式ドキュメントにも記載されています。

 

ちなみに、 markerType はデフォルト引数なので
引数を渡さなくともcv2.drawMarker関数は動きます。
引数で値を渡さなかった場合は markerType=cv2.MARKER_CROSS の挙動になります。

 

なお、デフォルト引数については
pythonのデフォルト引数についての解説
の記事で解説しています。

 

cv2.drawMarkerの第5引数:markerSize

cv2.drawMarkerの第5引数 markerSize は描画するポインターのサイズです。
int型で指定します。

 

それなりに大きな値を渡してやらないと、点になって図形が潰れてしまいます。

 

試しに、 markerSize=2 とすると、以下の画像のような描画になります。

cv2.drawMarker(img,
               position=(100, 300),
               color=(0, 255, 0),
               markerType=cv2.MARKER_CROSS,
               markerSize=2,
               thickness=2,
               line_type=cv2.LINE_4
               )

OpenCVのdrawMarker関数の引数markerSize画像

ちなみに、markerSizeもデフォルト引数なので
引数を渡さなくともcv2.arrowedLine関数は動きます。
引数で値を渡さなかった場合は markerSize=20 の挙動になります。

 

なお、デフォルト引数については
pythonのデフォルト引数についての解説
の記事で解説しています。

 

cv2.drawMarker関数の第6引数:thickness

cv2.drawMarkerの第6引数 thickness は描画するポインターの線の太さです。
int型で指定します。

 

以下の形式で描画するポインターの線の太さを指定することができます。

thickness = 数値(ピクセル)

 

サンプルコードでは thickness=2 としているので太さ2pxの線を描画しています。

 

試しに、 thickness=6 とすると、以下の画像のように太い線で描画されます。

cv2.drawMarker(img,
               position=(100, 300),
               color=(0, 255, 0),
               markerType=cv2.MARKER_CROSS,
               markerSize=20,
               thickness=6,
               line_type=cv2.LINE_4
               )

OpenCVのdrawMarker関数の引数thickness画像

 

なお、引数thicknessに負の数を渡すと、cv2.errorが発生します。
(error msg から判断すると、内部では cv2.line() が動いているようです)

cv2.error: OpenCV(4.4.0) /private/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/pip-req-build-gi6lxw0x/opencv/modules/imgproc/src/drawing.cpp:1801: error: (-215:Assertion failed) 0 < thickness && thickness <= MAX_THICKNESS in function 'line'

thickness は1以上の整数で指定しましょう。

 

ちなみに、thicknessもデフォルト引数なので
引数を渡さなくともcv2.drawMarker関数は動きます。
引数で値を渡さなかった場合は thickness=1の挙動になります。

 

なお、デフォルト引数については
pythonのデフォルト引数についての解説
の記事で解説しています。

 

cv2.drawMarkerの第7引数:lineType

cv2.drawMarkerの第7引数lineType は線を描画するアルゴリズムの種類です。
OpenCVの独自コードで指定します。

 

引数lineTypeでは以下のアルゴリズムを選択することができます。

  • 4連結: cv2.LINE_4
  • 8連結: cv2.LINE_8(デフォルト)
  • アンチエイリアス: cv2.LINE_AA

 

lineTypeもデフォルト引数なので、引数を渡さなくともcv2.line関数は動きます。
引数で値を渡さなかった場合は lineType=cv2.LINE_8 の挙動になります。

 

アンチエイリアスとはピクセルの境目に出るギザギザを滑らかに表現する手法です。
ただ、長方形の描画では上記3つとも目でみてわかる違いはないです。
文字の描画などにすると違いが多少分かります。

 

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

 

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

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

OpenCVのdrawMarker関数の使い方と引数について解説しました。

 

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

 

もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。

 

この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。

 

OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説したcv2.drawMarker関数も掲載されています。

 

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


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


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


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

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

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

 

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

 

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

 

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


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

コメント

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