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);
-
绘制椭圆: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);
-
绘制矩形: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);
-
绘制圆: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);
-
绘制填充多边形: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);
三.绘制文字: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);