08_OpenCv绘制形状和文字

08_绘制形状和文字

一.Point对象与Scalar对象

  • Point对象:表示2D平面上的一个点(x, y)

    Point p = new Point();
    p.x = 11;
    p.y = 14;
    

    或者

    Point p = new Point(11, 14);
    
  • Scalar对象

    Scalar scalar = new Scalar(a, b, c, d);//a = red, b = green, c = blue, d = alpha 
    
  • 在OpenCv Android SDK中, Scalar对象的四个参数依次代表red、green、blue、alpha;而在OpenCv C++中, Scalar对象的四个参数依次代表blue、green、red、alpha

二.绘制线、矩形、圆、椭圆、多边形

  • 绘制线:Core.line

    • 第一个参数:表示绘制的目标图像的Mat对象
    • 第二个参数:表示绘制的起点坐标的Point对象
    • 第三个参数:表示绘制的终点坐标的Point对象
    • 第四个参数:表示绘制线的颜色的Scalar对象
    • 第五个参数:表示线的宽度
    • 第六个参数:表示线的类型(LINE_4\LINE_8\LINE_AA)
    //1.产生绘制背景
    Bitmap bitmap = Bitmap.createBitmap(mScreenWidth, mScreenWidth, Bitmap.Config.ARGB_8888);
    bg = new Mat(new Size(mScreenWidth, mScreenWidth), CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
    //2.绘制线
    Core.line(
        bg,
        new Point(100, 100),
        new Point(bg.cols() - 100, bg.rows() - 100),
        new Scalar(0, 0, 255, 255),
        1,
        Core.LINE_4,
        0
    );
    //3.将Mat转为Bitmap
    Bitmap bitmap = Bitmap.createBitmap(bg.cols(), bg.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(bg, bitmap);
    

    08_OpenCv绘制形状和文字

  • 绘制椭圆:Core.ellipse

    • 第一个参数:表示背景图像的Mat对象
    • 第二个参数:表示椭圆中心点的Point对象
    • 第三个参数:表示椭圆半径的Size对象,如Size(src.cols/4, src.rows/8)
    • 第四个参数:表示椭圆沿椭圆中心点的顺时针方向旋转的角度
    • 第五个参数:表示椭圆弧长绘制的开始角度
    • 第六个参数:表示椭圆弧长绘制的结束角度
    • 第七个参数:表示绘制线的颜色的Scalar对象
    • 第八个参数:表示线的宽度
    • 第九个参数:表示线的类型(LINE_4\LINE_8\LINE_AA)
    //1.产生绘制背景
    Bitmap bitmap = Bitmap.createBitmap(mScreenWidth, mScreenWidth, Bitmap.Config.ARGB_8888);
    bg = new Mat(new Size(mScreenWidth, mScreenWidth), CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
    //2.绘制椭圆
    Core.ellipse(
        bg,
        new Point(bg.cols()/2, bg.rows()/2),
        new Size(bg.cols()/4, bg.rows()/8),
        90,
        0,
        360,
        new Scalar(0, 0, 255, 255),
        1,
        Core.LINE_4,
        0
    );
    
    Core.ellipse(
        bg,
        new Point(bg.cols()/2, bg.rows()/2),
        new Size(bg.cols()/4, bg.rows()/8),
        0,
        0,
        360,
        new Scalar(0, 0, 255, 255),
        1,
        Core.LINE_4,
        0
    );
    
    Core.ellipse(
        bg,
        new Point(bg.cols()/2, bg.rows()/2),
        new Size(bg.cols()/4, bg.rows()/8),
        90,
        0,
        180,
        new Scalar(0, 0, 255, 255),
        1,
        Core.LINE_4,
        0
    );
    
    
    //3.将Mat转为Bitmap
    Bitmap bitmap = Bitmap.createBitmap(bg.cols(), bg.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(bg, bitmap);
    

    08_OpenCv绘制形状和文字

  • 绘制矩形:Core.rectange

    • 第一个参数:表示背景图像(画布)的Mat对象
    • 第二个参数:矩形左上角顶点坐标的Point对象
    • 第三个参数:矩形右下角顶点坐标的Point对象
    • 第四个参数:表示绘制线的颜色的Scalar对象
    • 第五个参数:表示线的宽度
    • 第六个参数:表示线的类型(LINE_4\LINE_8\LINE_AA)
    //1.产生绘制背景
    Bitmap bitmap = Bitmap.createBitmap(mScreenWidth, mScreenWidth, Bitmap.Config.ARGB_8888);
    bg = new Mat(new Size(mScreenWidth, mScreenWidth), CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
    //2.绘制矩形
    Core.rectangle(
        bg,
        new Point(100, 100),
        new Point(bg.cols() - 100, bg.rows() - 100),
        new Scalar(0, 0, 255, 255),
        1,
        Core.LINE_4,
        0
    );
    //3.将Mat转为Bitmap
    Bitmap bitmap = Bitmap.createBitmap(bg.cols(), bg.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(bg, bitmap);
    

    08_OpenCv绘制形状和文字

  • 绘制圆:Core.circle

    • 第一个参数:表示背景图像(画布)的Mat对象
    • 第二个参数:表示圆心坐标的Point对象
    • 第三个参数:表示圆的半径
    • 第四个参数:表示绘制线的颜色的Scalar对象
    • 第五个参数:表示线的宽度
    • 第六个参数:表示线的类型(LINE_4\LINE_8\LINE_AA)
    //1.产生绘制背景
    Bitmap bitmap = Bitmap.createBitmap(mScreenWidth, mScreenWidth, Bitmap.Config.ARGB_8888);
    bg = new Mat(new Size(mScreenWidth, mScreenWidth), CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
    //2.绘制圆
    Core.circle(
        bg,
        new Point(bg.cols()/2, bg.rows()/2),
        (bg.cols()/2 - 100),
        new Scalar(0, 0, 255, 255),
        1,
        Core.LINE_4,
        0
    );
    //3.将Mat转为Bitmap
    Bitmap bitmap = Bitmap.createBitmap(bg.cols(), bg.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(bg, bitmap);
    

    08_OpenCv绘制形状和文字

  • 绘制填充多边形:Core.fillPoly

    • 第一个参数:表示背景图像的Mat对象
    • 第二个参数:多边形轮廓对应的MatOfPoint对象的List,通过Mat创建MatOfPoint时,必须要求Mat对象的type为CvType.CV_32SC2
    • 第三个参数:表示绘制线的颜色的Scalar对象
    • 第四个参数:表示线的类型(LINE_4\LINE_8\LINE_AA)
   //1.产生绘制背景
   Bitmap bitmap = Bitmap.createBitmap(mScreenWidth, mScreenWidth, Bitmap.Config.ARGB_8888);
   bg = new Mat(new Size(mScreenWidth, mScreenWidth), CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
   
   //2.绘制填充多边形
   Mat mat1 = new Mat(new Size(1,4), CvType.CV_32SC2);
   mat1.put(0, 0, new int[] {
           100, 100,
           bg.cols() - 100, 100,
           bg.cols() - 100, bg.rows() - 100,
           100, bg.rows() - 100
   });

   Mat mat2 = new Mat(new Size(1,4), CvType.CV_32SC2);
   mat2.put(0, 0, new int[] {
           200, 200,
           bg.cols() - 200, 200,
           bg.cols() - 200, bg.rows() - 200,
           200, bg.rows() - 200
   });
   MatOfPoint matOfPoint1 = new MatOfPoint(mat1);
   MatOfPoint matOfPoint2 = new MatOfPoint(mat2);

   List<MatOfPoint> pts = new ArrayList<>();
   pts.add(matOfPoint1);
   pts.add(matOfPoint2);
   Core.fillPoly(bg, pts, color, lineType, 0, new Point());
   
   //3.将Mat转为Bitmap
   Bitmap bitmap = Bitmap.createBitmap(bg.cols(), bg.rows(), Bitmap.Config.ARGB_8888);
   Utils.matToBitmap(bg, bitmap);

08_OpenCv绘制形状和文字

三.绘制文字:Core.putText

  • 第一个参数:表示背景图像(画布)的Mat对象
  • 第二个参数:表示要绘制的文字内容
  • 第三个参数:绘制文字的位置坐标的Point对象
  • 第四个参数:待绘制文字的字体
  • 第五个参数:待绘制文字的缩放比例
  • 第六个参数:表示绘制线的颜色的Scalar对象
  • 第七个参数:表示线的宽度
  • 第八个参数:表示线的类型(LINE_4\LINE_8\LINE_AA)
//1.产生绘制背景
Bitmap bitmap = Bitmap.createBitmap(mScreenWidth, mScreenWidth, Bitmap.Config.ARGB_8888);
bg = new Mat(new Size(mScreenWidth, mScreenWidth), CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
//2.绘制文字
Core.putText(
    bg,
    "OpenCv",
    new Point(bg.cols()/2 - DimenUtil.dp2px(mContext, 15), bg.rows()/2),
    Core.FONT_HERSHEY_COMPLEX,
    1.0,
    new Scalar(255, 0, 0, 255),
    2,
    Core.LINE_8, 
    false
);
//3.将Mat转为Bitmap
Bitmap bitmap = Bitmap.createBitmap(bg.cols(), bg.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(bg, bitmap);

08_OpenCv绘制形状和文字