opencv Advanced 02 - 画像上にさまざまな幾何学図形を描画します

OpenCV は、直線、長方形、円、楕円などの幾何学図形を描画したり、画像内の指定した位置にテキストの説明を追加したりできる便利な描画機能を提供します。

OpenCV には、直線を描画する関数 cv2.line()、長方形を描画する関数 cv2.rectangle()、円を描画する関数 cv2.circle()、楕円を描画する関数 cv2.ellipse()、多角形を描画する関数 ()、画像にテキストを追加する関数 cv2.putText() およびその他の描画関数。

これらの描画関数にはいくつかの共通パラメータがあり、主にソース画像、色、線属性などを設定するために使用されます。これらの一般的なパラメータについては、以下に簡単に説明します。

  • img : グラフィックスが描画されるキャリア イメージ (描画用のコンテナ キャリア、キャンバス、アートボードとも呼ばれます)。
  • color : 形状を描画する色。色は通常、BGR モデルを使用して表現されます (たとえば、緑の場合は (0, 255, 0))。グレースケール画像の場合、グレースケール値のみを渡すことができます。カラー チャネルの順序は RGB ではなく BGR であることに注意してください。
  • 太さ: 線の太さ。デフォルト値は 1 ですが、-1 に設定すると、グラフィックスを塗りつぶすことになります (つまり、描画されたグラフィックスが塗りつぶされます)。
  • lineType : 回線のタイプ。デフォルトは 8 つの接続タイプです。lineType パラメータの値と説明を表 19-1 に示します。

ここに画像の説明を挿入

  • シフト: データの精度。このパラメータは値の精度 (円の中心の座標など) を制御するために使用され、通常は設定する必要はありません。

直線を引く

OpenCVには直線(線分)を描画する関数 cv2.line() が用意されています。この関数の構文は次のとおりです。

img = cv2.line( img, pt1, pt2, color[, 太さ[, lineType ]])

式では次のようになります。

  • パラメータimg、color、thickness、lineTypeの意味は前述の通りです。
  • pt1は線分の最初の点(始点)を表します。
  • pt2 は線分の 2 番目の点 (端点) を表します。

例: cv2.line() 関数を使用して、黒い背景の画像内に 3 本の線分を描画します。

import numpy as np
import cv2
n = 300  # 图像尺寸

# 创建一个空白的彩色图像,尺寸为(n+1) x (n+1)3通道(RGB)
img = np.zeros((n+1, n+1, 3), np.uint8)

# 在图像上绘制蓝色直线,起点为(0,0),终点为(n,n),线宽为3
img = cv2.line(img, (0, 0), (n, n), (255, 0, 0), 3)

# 在图像上绘制绿色直线,起点为(0,100),终点为(n,100),线宽为1
img = cv2.line(img, (0, 100), (n, 100), (0, 255, 0), 1)

# 在图像上绘制红色直线,起点为(100,0),终点为(100,n),线宽为6
img = cv2.line(img, (100, 0), (100, n), (0, 0, 255), 6)

winname = 'line-demo'  # 窗口名称

# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)

# 在窗口中显示图像
cv2.imshow(winname, img)

# 等待键盘按键,0表示无限等待
cv2.waitKey(0)
cv2.destroyAllWindows()

操作結果:

ここに画像の説明を挿入

長方形を描く

OpenCV には、函数 cv2.rectangle()長方形を描画するためのメソッドが用意されています。この関数の構文は次のとおりです。

img = cv2.rectangle( img, pt1, pt2, color[, height[, lineType]] )

式では次のようになります。

  • パラメータimg、color、thickness、lineTypeの意味は前述の通りです。
  • pt1 は長方形の頂点です。
  • pt2 は、長方形の pt1 の反対側の頂点です。

関数 cv2.rectangle() を使用して、白い背景画像内に実線の長方形と中空の長方形を描画します。

コードは以下のように表示されます。

import numpy as np
import cv2

n = 300  # 图像尺寸

# 创建一个白色背景的彩色图像,尺寸为n x n,3通道(RGB)
img = np.ones((n, n, 3), np.uint8) * 255

# 在图像上绘制填充的红色矩形,左上角坐标为(50, 50),右下角坐标为(n-100, n-50),颜色为红色,厚度为-1表示填充, 0表示不填充
img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)

winname = 'rect-shixin'  # 窗口名称

# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)

# 在窗口中显示图像
cv2.imshow(winname, img)

# 等待键盘按键,0表示无限等待
cv2.waitKey(0)

# 关闭所有打开的窗口
cv2.destroyAllWindows()

ここに画像の説明を挿入
意思img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)

-1を0に変更すると、非実線の四角枠を描画できるようになり、以下のような効果になります。

ここに画像の説明を挿入

円を描く

OpenCV は函数 cv2.circle()円を描画するためのツールを提供します。この関数の構文は次のとおりです。

img = cv2.circle( img, center, radius, color[, thickness[, lineType]] )

式では次のようになります。

  • パラメータimg、color、thickness、lineTypeの意味は前述の通りです。

  • 中心は円の中心です。

  • 半径は半径です

関数 cv2.circle() を使用して、白い背景画像内に一連の同心円を描画します。

コードは以下のように表示されます。

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
# 将图像的中心作为圆心,实际值为 d/2
red = (0,0,255) # 设置白色变量
for r in range(5,round(d/2),12):
 cv2.circle(img,(centerX,centerY),r,red,3)
 # circle(载体图像,圆心,半径,颜色)
cv2.imshow("Demo19.3",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果:

ここに画像の説明を挿入

楕円を描く

OpenCV は、楕円を描画する関数 cv2.ellipse() を提供します。この関数の構文形式は次のとおりです:
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[,
height[, lineType]])
ここで、:

  • パラメータimg、color、thickness、lineTypeの意味は前述の通りです。
  • center は、楕円の中心の座標です。
  • axes は軸の長さです。
  • 角度は偏向角です。
  • startAngle は、円弧の開始角度の角度です。
  • endAngle は、円弧の終了角度の角度です。

関数 cv2.ellipse() を使用して、白い背景画像内に中空の楕円のセットをランダムに描画します。

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
# 生成白色背景
center=(round(d/2),round(d/2))
# 注意数值类型,不可以使用语句 center=(d/2,d/2)
size=(100,200)
# 轴的长度
for i in range(0,10):
 angle = np.random.randint(0,361)
 # 偏移角度
 color = np.random.randint(0,high = 256,size = (3,)).tolist()
 # 生成随机颜色,3[0,256)的随机数
 thickness = np.random.randint(1,9)
 cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("demo-tuoyuan",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果:
ここに画像の説明を挿入

多角形を描く

OpenCV は、ポリゴンを描画するための関数 cv2.polylines() を提供します。この関数の構文は次のとおりです。

img = cv2.polylines( img, pts, isClosed, color[, 太さ[,
lineType[, shift]]])

式では次のようになります。

  • パラメータimg、color、thickness、lineType、shiftの意味は前述の通りである。
  • pts はポリゴンの頂点です。
  • isClosed は閉じたフラグで、ポリゴンが閉じているかどうかを示すために使用されます。値が True の場合、最後の点を最初の点に接続して多角形を閉じます。それ以外の場合は、点を順番に接続して曲線を形成します。

関数 cv2.polylines() を使用して多角形を描画する場合、各頂点の座標を指定する必要があります。これらの点の座標は、サイズが「頂点の数1 2」に等しい配列を構成します。この配列のデータ型は numpy.int32 でなければなりません。

関数 cv2.polylines() を使用して、白い背景画像の中に多角形を描画します。

import numpy as np
import cv2
d = 400  # 图像尺寸

# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255

# 生成多边形的各个顶点坐标
pts = np.array([[200, 50], [300, 200], [200, 350], [100, 200]], np.int32)

# 重新整形顶点数组,将其变为顶点数 x 1 x 2 的形状
pts = pts.reshape((-1, 1, 2))

# 使用 cv2.polylines() 函数绘制多边形
# 第一个参数为图像,第二个参数为顶点数组,第三个参数为True表示封闭多边形,颜色为绿色,线宽为8
cv2.polylines(img, [pts], True, (0, 255, 0), 8)
cv2.imshow("duobianxing",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ここに画像の説明を挿入

関数 cv2.polylines() の 3 番目のパラメーター isClosed は閉じたフラグであり、この値が False に設定されている場合、各
頂点は線分で接続されるだけであり、多角形は閉じられません。この時点のコードは次のとおりです。

cv2.polylines(img,[pts],False,(0,255,0),8)

効果は次のとおりです。

ここに画像の説明を挿入

グラフィック上にテキストを描画する

OpenCV は、グラフィック上にテキストを描画する関数 cv2.putText() を提供します。この関数の構文は次のとおりです。

img=cv2.putText(img, text, org, fontFace, fontScale, color[,
height[, lineType[,bottomLeftOrigin]]])

式では次のようになります。

  • パラメータimg、color、thickness、lineType、shiftの意味は前述の通りである。
  • text は描画するフォントです。
  • org は、テキストの左下隅から始まるフォントを描画する場所です。
  • fontFaceはフォントの種類を示し、そのパラメータの種類と意味を表19-2に示します。
  • fontScaleはフォントサイズを表します。
  • BottomLeftOrigin は、テキストの方向を制御するために使用されます。デフォルト値は False ですが、True に設定すると、テキストが垂直方向にミラーリングされます。

ここに画像の説明を挿入

関数 cv2.putText() を使用して、白い背景画像内にテキストを描画します。

コードは以下のように表示されます。

import numpy as np
import cv2

d = 400  # 图像尺寸

# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255

# 定义字体
font = cv2.FONT_HERSHEY_SIMPLEX


# 在图像上绘制红色的 "OpenCV" 文本,位置同样为(0, 200),字体大小为3,线宽为5
cv2.putText(img, 'OpenCV', (0, 200), font, 3, (0, 0, 255), 5)

# 创建一个窗口并显示图像
cv2.imshow("weizi", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

このプログラムは、関数 cv2.putText() を使用して、イメージ img 内にテキスト
「OpenCV」を描画します。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/hai411741962/article/details/132293031