OpenCvSharp学習メモ9 -- 基本ペイント(線、楕円、長方形、円、FillPoly)

目次

線は直線を描きます

Ellipse は、楕円の輪郭と楕円を描画または塗りつぶします。

Rectangle は、長方形を描画または塗りつぶします。

円円を描くか塗りつぶす

FillPoly 塗りつぶしポリゴン


線は直線を描きます

機能の説明: 指定された 2 点間に直線を描きます。画像の外側にあるものはすべて切り取られます。非アンチエイリアシングの場合は、8 チャネルまたは 4 チャネル アルゴリズムを使用します。両端に太い線が描かれ、角が丸くなっています。アンチエイリアス処理された線は、ガウス フィルタリングを使用して描画されます。

//函数原型1
void Line(InputOutputArray img,
    int pt1X,
    int pt1Y,
    int pt2X,
    int pt2Y,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)

//函数原型2
void Line(InputOutputArray img,
    Point pt1,
    Point pt2,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)
パラメータ 説明する
入力出力配列画像 引く直線のイメージ

ポイントpt1

int pt1X、int pt1Y

始点座標

ポイントpt2

int pt2X、int pt2Y 

終点座標
スカラーカラー 直線の色
整数の厚さ 直線の線幅 (>0 && <=32767) を -1 にすることはできません
線種 線種
整数シフト 右への座標変位 (縮小の倍数)

LineType が異なる値の場合の描画結果

AntiAlias: アンチエイリアシング (ガウスぼかしあり)

Link4とLink8の描画効果

 実際の描画効果、赤(AntiAlias)、青(Link4)、緑(Link8)

/// <summary>
/// 测试Line的LinkType参数
/// </summary>
private void Test_Line_LinkType()
{
    //Line LinkType参数测试
    using (Mat canvas = Mat.Zeros(w / 4, w / 4, MatType.CV_8UC3))
    {
        var winName = "Test LineTypes";
        Cv2.NamedWindow(winName, WindowFlags.Normal);
        Cv2.ResizeWindow(winName, new Size(w * 4, w * 4));

        //不同LineType画线
        In_Test_Line_LinkType(canvas, winName, LineTypes.AntiAlias, Scalar.Red);
        In_Test_Line_LinkType(canvas, winName, LineTypes.Link4, Scalar.Blue);
        In_Test_Line_LinkType(canvas, winName, LineTypes.Link8, Scalar.Green);

        Cv2.DestroyAllWindows();
    }
}

//偏移坐标用
private int index = 0;
/// <summary>
/// 绘制直线和LinkType
/// </summary>
/// <param name="canvas"></param>
/// <param name="winName"></param>
/// <param name="lineType"></param>
/// <param name="color"></param>
private void In_Test_Line_LinkType(Mat canvas, string winName, LineTypes lineType, Scalar color)
{
    int x1 = 11, y1 = 13, x2 = 78, y2 = 96;
    Cv2.Line(canvas, x1, y1, x2, y2, color, 1, lineType);
    Cv2.PutText(canvas, lineType.ToString(), new Point(15 + index * 10, 15 + index * 10), HersheyFonts.HersheySimplex, 0.4, color);
    Cv2.ImShow(winName, canvas);
    Cv2.WaitKey();
    index++;
}

座標は同じで、シフトパラメータがそれぞれ2、1、0の場合の描画結果です。

/// <summary>
/// 测试Line的shift参数
/// </summary>
private void Test_Line_Shift()
{
    //Line Shift参数测试
    using (Mat canvas = Mat.Zeros(w, w, MatType.CV_8UC3))
    {
        int x1 = 100, y1 = 150, x2 = 300, y2 = 350;

        LineTypes lineTypes = LineTypes.AntiAlias;
        Cv2.Line(canvas, x1, y1, x2, y2, Scalar.Red, 1, lineTypes, 0);

        //shift参数测试
        int shift = 1;
        Cv2.Line(canvas, x1, y1, x2, y2, Scalar.Red, 1, lineTypes, shift);
        //基本等价于下面
        Cv2.Line(canvas, x1 >> shift, y1 >> shift, x2 >> shift, y2 >> shift, Scalar.Green, 1, lineTypes, 0);

        shift = 2;
        Cv2.Line(canvas, x1, y1, x2, y2, Scalar.Red, 1, lineTypes, shift);
        //基本等价于下面
        Cv2.Line(canvas, x1 >> shift, y1 >> shift, x2 >> shift, y2 >> shift, Scalar.Green, 1, lineTypes, 0);
        var winName = "Test shift";
        Cv2.NamedWindow(winName, WindowFlags.Normal);                
        Cv2.ResizeWindow(winName, new Size(w * 2, w * 2));
        Utils.ShowWaitDestroy(canvas, winName, WindowFlags.AutoSize);
    }
}

Ellipse は、楕円の輪郭と楕円を描画または塗りつぶします。

機能説明: 楕円輪郭、黒丸、楕円弧、または黒楕円扇形を描くことができます。

//函数原型1
void Ellipse(InputOutputArray img,
    Point center,
    Size axes,
    double angle,
    double startAngle,
    double endAngle,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)

//函数原型2
void Ellipse(InputOutputArray img,
    RotatedRect box,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8)
パラメータ 説明する
入力出力配列画像 描くイメージ
点の中心 楕円の中心点
サイズ軸 楕円の長軸と短軸の半分
回転四角形ボックス 楕円の外接する長方形のサイズ
ダブルアングル 楕円偏向角、時計回り >0、反時計回り <0
ダブルスタート角度 楕円プロファイルの開始角度 (偏向角から計算)
両端角度 楕円輪郭の終了角度 (偏向角から計算) (楕円を描く場合、startAngle=0、endAngle=360)
スカラーカラー 楕円線の色
整数の厚さ 楕円の線幅。負の数値はパディングを示します
線種 楕円線のスタイル
整数シフト 中心値と軸値の右方向への変位(縮小率)

楕円弧を描くときの各パラメータの意味(画像は公式サイトより)

 

/// <summary>
/// 测试Ellipse
/// </summary>
private void Test_Ellipse()
{
    using (Mat canvas = Mat.Zeros(w, w, MatType.CV_8UC3))
    {
        var center = new Point(w / 2, w / 2);
        var axes = new Size(150, 100);
        var angle = 45;

        //画椭圆的辅助线
        DrawEllipseAuxiliaryLine(canvas, center, axes, angle);

        //画椭圆弧
        Cv2.Ellipse(canvas, center, axes, angle, 90, 360, Scalar.Red);

        //画椭圆,角度不同
        Cv2.Ellipse(canvas, new RotatedRect(new Point2f(center.X, center.Y), new Size2f(axes.Width * 2, axes.Height * 2), -angle), Scalar.Blue

        var winName = "Test Ellipse";
        Cv2.NamedWindow(winName, WindowFlags.Normal);                
        Cv2.ResizeWindow(winName, new Size(w * 2, w * 2));
        Utils.ShowWaitDestroy(canvas, winName, WindowFlags.AutoSize);
    }
}

/// <summary>
/// 绘制椭圆的外接矩形
/// </summary>
/// <param name="canvas"></param>
/// <param name="center">中心点</param>
/// <param name="axes">椭圆长短轴大小的一半</param>
/// <param name="angle">椭圆偏转角度</param>
private void DrawEllipseAuxiliaryLine(Mat canvas, Point center,Size axes,double angle)
{
    Scalar color = Scalar.Green;
    //X轴
    Cv2.Line(canvas, new Point(center.X - axes.Width, center.Y), new Point(center.X + axes.Width, center.Y), color);
    //Y轴
    Cv2.Line(canvas, new Point(center.X, center.Y - axes.Height), new Point(center.X, center.Y + axes.Height), color);

    //AXES BOX
    Cv2.Rectangle(canvas,
                  new Point(center.X - axes.Width, center.Y - axes.Height),
                  new Point(center.X + axes.Width, center.Y + axes.Height),
                  color);
    var rotat = Cv2.GetRotationMatrix2D(center, -angle, 1);//注意,这里的角度与椭圆角度相反

    //将画布旋转            
    Cv2.WarpAffine(canvas, canvas, rotat, canvas.Size());
}

Rectangle は、長方形を描画または塗りつぶします。

機能の説明: 指定された対角点の座標に基づいて、中空または中実の長方形を描画します。

//函数原型1
void Rectangle(InputOutputArray img,
    Point pt1,
    Point pt2,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)

//函数原型2
void Rectangle(InputOutputArray img,
    Rect rect,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)

//函数原型3
void Rectangle(Mat img,
    Point pt1,
    Point pt2,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)

//函数原型4
void Rectangle(Mat img,
    Rect rect,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)
パラメータ 説明する

入力出力配列画像

マット画像

描くイメージ
ポイントpt1 長方形の頂点
ポイントpt2 pt1の対角点
長方形長方形 矩形
スカラーカラー 長方形の色
整数の厚さ 長方形の線の幅。0 未満の場合は充填を意味します。
線種 線形
整数シフト 座標値の右方向への変位(縮小率)
private void Test_Rectangle()
{
    using (Mat canvas = Mat.Zeros(w, w, MatType.CV_8UC3))
    {

        int bias = 50;
        //左上,右下,两个点,shift=0
        Point p1 = new Point(bias, bias);
        Point p2 = new Point(w - bias, w - bias);

        DrawRectangle(canvas, p1, p2, 0);

        //左下,右上,两个点,shift=1
        p1 = new Point(bias, w - bias);
        p2 = new Point(w - bias, bias);
        DrawRectangle(canvas, p1, p2, 1);

        Utils.ShowWaitDestroy(canvas, "Test Rectangle", WindowFlags.AutoSize);
    }
}
/// <summary>
/// 绘制矩形及对角点
/// </summary>
/// <param name="canvas"></param>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <param name="shift"></param>
private void DrawRectangle(Mat canvas,Point p1,Point p2,int shift)
{
    Scalar colorRect = Scalar.Red;            
    Cv2.Rectangle(canvas, p1, p2, colorRect, shift: shift);
    Scalar colorPoint = Scalar.Green;
    Cv2.Circle(canvas, p1.X >> shift, p1.Y >> shift, 5, colorPoint, -1);
    Cv2.Circle(canvas, p2.X >> shift, p2.Y >> shift, 5, colorPoint, -1);
}

円円を描くか塗りつぶす

機能説明: 中心と半径に基づいて中空または中実の円を描画します。

//函数原型1
void Circle(InputOutputArray img,
    int centerX,
    int centerY,
    int radius,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)

//函数原型2
void Circle(InputOutputArray img,
    Point center,
    int radius,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0)
パラメータ 説明する
入力出力配列画像 描くイメージ

int centerX

内部中心Y

点の中心

円の中心座標
整数半径 円の半径
スカラーカラー 円の色
整数の厚さ 円の線の幅。負の数値はパディングを示します
線種 丸い線のスタイル
整数シフト 中心と半径の右への変位(減少率)
/// <summary>
/// 测试Circle
/// </summary>
private void Test_Circle()
{
    using (Mat canvas = Mat.Zeros(w, w, MatType.CV_8UC3))
    {
        var center = new Point(w / 2, w / 2);
        //画圆
        Cv2.Circle(canvas, center, w / 4, Scalar.Red);

        //填充,shift=1
        Cv2.Circle(canvas, center, w / 4, Scalar.Green, -1, shift: 1);

        Utils.ShowWaitDestroy(canvas, "Test Circle", WindowFlags.AutoSize);
    }
}

FillPoly 塗りつぶしポリゴン

機能の説明: 指定された境界に従って 1 つ以上の多角形を塗りつぶします。穴や自己交差などの複雑な領域を埋めることができます

の。

//函数原型1
void FillPoly(InputOutputArray img,
    InputArray pts,
    Scalar color,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0,
    Point? offset = null)

//函数原型2
void FillPoly(Mat img,
    IEnumerable<IEnumerable<Point>> pts,
    Scalar color,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0,
    Point? offset = null)
パラメータ 説明する

入力出力配列画像

マット画像

描くイメージ

入力配列ポイント

IEnumerable<IEnumerable<Point>> ポイント

塗りつぶされるポリゴンの輪郭座標のセット

スカラーカラー 塗りつぶす色
線種 塗りつぶし線の種類
整数シフト 点集合座標の右方向への変位(リダクションの倍数)
ポイント?オフセット グローバル座標セットのオフセット。これは、アウトラインが大きな画像の部分領域の座標に基づいている場合に便利です。
/// <summary>
/// 测试FillPoly
/// </summary>
private void Test_FillPoly()
{
    using (Mat canvas = Mat.Zeros(w, w, MatType.CV_8UC3))
    {
        LineTypes lineType = LineTypes.Link8;
        Point[][] points = new Point[1][];
        points[0] = new Point[4];
        points[0][0] = new Point(w / 8, w / 8);
        points[0][1] = new Point(w / 8 * 3, w / 8 * 3);
        points[0][2] = new Point(w / 8 * 3, w / 8);
        points[0][3] = new Point(w / 8, w / 8 * 3);

        Cv2.FillPoly(canvas, points, new Scalar(255, 0, 0), lineType);

        //shift =2 
        Cv2.FillPoly(canvas, points, new Scalar(0, 0, 255), lineType, shift: 2);

        points[0][2] = new Point(w / 8, w / 8 * 3);
        points[0][3] = new Point(w / 8 * 3, w / 8);
        //坐标偏移w/4
        Cv2.FillPoly(canvas, points, new Scalar(0, 255, 0), lineType, offset: new Point(w / 4, w / 4));

        Utils.ShowWaitDestroy(canvas, "Test FillPoly", WindowFlags.AutoSize);
    }
}

OpenCvSharp関数の例(カタログ

参考

OpenCV: 基本的な描画

おすすめ

転載: blog.csdn.net/TyroneKing/article/details/129813379