OpenCV クイック スタート 8: グラフィックスとテキストの描画

1: 関連する API

1. 線を引く

line(Mat& img, ポイント pt1, ポイント pt2, const スカラー& カラー, int 厚さ = 1, int lineType = 8, int シフト = 0)

パラメータ:
img: 線分を描画する画像
pt1: 線分の始点
pt2: 線分の終点
color: C++ の Scalar オブジェクトで定義される線分の色。BGR の場合、タプルを渡します。例: (255, 0, 0) は青色の
太さ: 線の幅
lineType:線分のタイプ値は 8、4、CV_AA などをとり、それぞれ 8 隣接接続線、4 隣接接続線、アンチエイリアス接続線を表します。デフォルトは 8 隣接です。より良い結果を得るために、CV_AA を選択できます (ガウス フィルターを使用)。
シフト: 座標点の小数点以下の桁数

LineTypes { cv::FILLED = -1、cv::LINE_4 = 4、cv::LINE_8 = 8、cv::LINE_AA = 16 }




例:

cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)#4-带锯齿 -1填充 8-平滑一些 16-非常平滑

2. 長方形を描く

Rectangle(Mat& img, Point pt1, Point pt2,const Scalar& color, int の厚さ = 1, int lineType=8, int シフト = 0);

パラメータ:
img: 四角形を描画する画像
pt1: 四角形の始点 (左上隅)
pt2: 四角形の終点 (右下隅)
color: Scalar オブジェクトによって定義される四角形の色C++
の厚み: 側面の幅 (負の場合) 次に、
lineType:エッジのタイプを入力します。
シフト: 座標点の小数点以下の桁数

例:

cv2.rectangle(img, (10,10), (100, 100), (0, 0, 255), -1)

3. 円を描く

cvCircle(Mat& img, CvPoint 中心, int 半径, const スカラー& カラー, int 厚さ=1, int lineType=8, int シフト=0);

img: 円を描画する画像
center: 円の中心の座標 radius
: 円の半径
color: 円の色、ルールはB(青) G(緑) R(赤)に基づきます
太さ: 正の数値の場合、円を構成する線の太さを示します。それ以外の場合は、円が塗りつぶされていることを示します
。 line_type: 線のタイプ。デフォルトは 8
シフトです: 中心座標点と半径値の小数点以下の桁数

例:

cv2.circle(img, (320, 240), 5, (0, 0, 255), -1)

4. 楕円を描く

ellipse(Mat& img, centerCooperatives, axesLength, angle, startAngle, endAngle, const Scalar& color, int height=1, int lineType=8, intShift=0);

img: 楕円を描画する画像
centerCoodys: 楕円の中心座標です。座標は、(X 座標値、Y 座標値) という 2 つの値のタプルとして表現されます。
axesLength: 楕円の長軸と短軸 (長軸の長さ、短軸の長さ) をそれぞれ含む 2 つの変数のタプルが含まれます。
angle : 楕円の回転角度 (度単位)。計算された時計回りの
startAngle: 楕円の円弧の開始角度 (度単位)。0 度は左からであることに注意してください
。 endAngle: 楕円の円弧の終了角度 (度単位)。0 度は左からの色であることに注意してください
。楕円の色を設定するには、BGR にタプルを渡します。例: (255, 0, 0) は青です。
太さ: 正の数値の場合、楕円を構成する線の太さを示します。それ以外の場合は、円が塗りつぶされていることを示します
。 lineType: 線のタイプ。デフォルトは 8
シフトです。これは中心座標の小数点以下の桁数と軸の小数点以下の桁数を表します。
楕円形

例:

cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 0, 255), -1)

5. 多角形を描く

ポリライン(Mat& img,pts,isClosed=Flase,color,thickness=None,lineType=None,shift=None)

img: 楕円を描画するための画像 pts
: これは点のペアの配列であり、次元は頂点の数 n*2 であり、座標点は int である必要があり、複数の独立した多角形を同時に描画できます。 1 つまたは複数のポリゴンの座標点が配置されます。1 つまたは複数の numpy 配列、およびこの配列は 1 次元リストに入れる必要があります。ただし、numpy 座標点配列が 1 つしかない場合でも、リスト ボックス isClosed が存在する必要があります。は
ブール値です。True は線分が閉じていることを意味し、False は
楕円の色を設定することを意味します。BGR の場合はタプルを渡します。例: (255, 0, 0) は青色の
太さです。これが正の数値の場合、多角形を構成する線の太さを示します。それ以外の場合は、円が塗りつぶされていることを示します
。 lineType: 線のタイプ。デフォルトは 8
シフトです。これは中心座標の小数点以下の桁数と軸の小数点以下の桁数を表します。

例:

pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)
#将Ture去掉即为填充多边形
cv2.polylines(img, [pts], True, (0, 0, 255))

6. 文字描画

putText(Mat& img, text, org, font, fontScale,const Scalar& color, int width=1, int lineType=8,bottomLeftOrigin);

image: テキストを描画する画像
text: 描画するテキスト文字列
org: 画像内のテキストの左下隅の座標。
座標は、(X 座標、Y 座標)フォント: フォントの種類の 2 つの値のタプルとして表現されます。一部のフォント タイプには、FONT_HERSHEY_SIMPLEX、FONT_HERSHEY_PLAIN などがあります。
fontScale: フォント固有の基本サイズを乗算したフォント スケール係数
color: 描画されたテキスト文字列の色
height: フォントの太さ
lineType: 使用する線の種類
bottomLeftOrigin: true の場合、イメージ データ 原点は次のとおりです。左下隅。それ以外の場合は、左上隅にあります
。 例:

cv2.putText(img, "Hello World!", (10, 400), cv2.FONT_HERSHEY_TRIPLEX, 3, (255,0,0))

完全なコード

import cv2
import numpy as np
#(y,x)
img = np.zeros((480, 640, 3), np.uint8)

#画线,坐标点为(x, y)
cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)#4-带锯齿 -1填充 8-平滑一些 16-非常平滑
cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)

#画矩形
cv2.rectangle(img, (10,10), (100, 100), (0, 0, 255), -1)

#画圆
#cv2.circle(img, (320, 240), 100, (0, 0, 255))
cv2.circle(img, (320, 240), 5, (0, 0, 255), -1)

#画椭圆
#度是按顺时针计算的
#0度是从左侧开始的
cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 0, 255), -1)

#画多边形
pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)
cv2.polylines(img, [pts], True, (0, 0, 255))

#填充多边形
#cv2.fillPoly(img, [pts], (255, 255, 0))

#绘制广本
cv2.putText(img, "Hello World!", (10, 400), cv2.FONT_HERSHEY_TRIPLEX, 3, (255,0,0))

cv2.imshow('draw', img)
cv2.waitKey(0)

2: フュージョン

Quick Start 8 を学習したので、多くの API の使用方法も学習しました。これらを統合して簡単な描画コードを記述してみます。機能は次のとおりです。

# 可以通过鼠标进行基本图形的绘制
# 1. 可以画线: 当用户按下l键,即选择了画线。此时,滑动鼠标即可画线。
# 2. 可以画矩形:当用户按下r键,即可选择画矩形。此时,滑动鼠标即可画矩形。
# 3. 可以画圆:当用户按下c键,即可选择画圆。此时,滑动鼠标即可画圆。
# ....

最初に自分で書いてみて、後で私が示したコードを読んでも構いません。

import cv2
import numpy as np

#全局变量用于确定要画什么图形    0-drawline, 1-drawrectangle, 2-drawcircle
curshape = 0
#初始坐标
startpos = (0, 0)

# 显示窗口和全黑画布
img = np.zeros((480, 640, 3), np.uint8)


# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
    # print(event, x, y, flags, userdata)
    global curshape, startpos#变量声明

    if (event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN):#左键摁下
        startpos = (x, y)#获取起始坐标
    elif (event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP):#左键松开
        if curshape == 0:  # 线
            cv2.line(img, startpos, (x, y), (0, 0, 255))
        elif curshape == 1:  # 矩形
            cv2.rectangle(img, startpos, (x, y), (0, 0, 255))
        elif curshape == 2:  # 圆
            a = (x - startpos[0])
            b = (y - startpos[1])
            r = int((a ** 2 + b ** 2) ** 0.5)#勾股定理
            cv2.circle(img, startpos, r, (0, 0, 255))
        else:
            print('error:no shape define')


# 创建窗口
cv2.namedWindow('drawshape', cv2.WINDOW_NORMAL)

# 设置鼠标回调
cv2.setMouseCallback('drawshape', mouse_callback)

while True:
    cv2.imshow('drawshape', img)
    key = cv2.waitKey(10) & 0xFF
    if key == ord('q'):
        break
    elif key == ord('l'):  # line
        curshape = 0
    elif key == ord('r'):  # rectangle
        curshape = 1
    elif key == ord('c'):  # circle
        curshape = 2

cv2.destroyAllWindows()

私の「傑作」を見せてください
傑作

毎日の「大きなパイ」:
誰もが沈黙の献身期間を持ちますが、見返りはありません。私たちはそれを根付きと呼んでいます

おすすめ

転載: blog.csdn.net/weixin_52051554/article/details/126160566