openCV绘制与填充

基础形状的绘制与填充
  • 使用OpenCV进行图形检查测和识别,我们需要在输出的图像上对处理结果加上醒目的轮廓或者以边框矩形绘制或者颜色填充,所以API可以提供相关的操作

####在MAT上绘制集合形状与文本

  • 绘制直线:
//img:表示绘制对象是在MAT上
//p1表示直线其实带你的屏幕坐标
//p2表示直线终点的屏幕坐标
//color表示直线的颜色,假设三通道的顺序为BGR,则new Scalar(0,0,255)
//最后三个参数可以不填,默认为1,8,0表示绘制宽度是1个像素,绘制方法是8领域,位置偏移是0
line (Mat img, Point p1, Point p2, Scalar color, int thickness, int lineType, int shift)
  • 绘制矩形:
//p1表示矩形的左上角屏幕坐标
//p2表示矩形的右下角屏幕坐标
rectangle(Mat img, Point p1, Point p2, Scalar color, int thickness, int lineType, int shift)
  • 绘制圆形:
//center:表示圆心点坐标
//radius:圆的半径
//color:表示圆的颜色
circle(Mat img, Point center, int radius, Scalar color, int thickness, int lineTYpe, int shift)
  • 绘制椭圆:
//center:表示椭圆的中心的点坐标
//axes:表示椭圆的长轴与短轴大小
//angle;表示旋转角度 angle = endAngle - startAngle
//endAngle:结束角度
//startAngle:开始角度
ellipse(Mat img, Point center, Size axes, double angle, double startAngle, double endAngle, Scalar color, int thinkness, int lineType, int shift);
  • 绘制文本:
//text:表示要绘制的文本
//org:表示开始的起点位置坐标
//fontFace:表示字体类型
//fontScale:表示字体大小
//color:表示文字颜色
//thickness:表示文字绘制宽度,默认大小为1
putText(Mat img, String text, Point org, int fontFace, double fontScale,Scalar color, int thickness
注意:
  • 设置绘制方式为填充只需要将thickness设置为-1
  • lineType类型有,LINE_4, LINE8,LINE_AA 分别为4邻域,8邻域,反锯齿填充方法
MAT和Bitmap进行相互转换
  • 在Android中使用OpenCV进行开发的时候,经常会用放到Mat对象和Bitmap对象之间的相互转换

1.Mat和Bitmap进行相互转换:

  • 第一种情况:通过图像对象通道OpenCV的imreda函数读取,或者通过Mat进行初始化,Mat->Bitmap:
Mat src = Imgcodecs.imread(fileUri.getPath());
int width = src.cols();
int height - src.rows();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Mat dst = new Mat();
//Bitmap类型是ARGB_8888,OpenCV默认加载的是BGR,通过cvtColor进行转换,否则会出现通道顺序不正确,导致图像颜色显示异常
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2RGBA);
Utils.matToBitmap(dst,  bitmap);
  • 第二种情况:通过本地Android的api创建或者初始化加载图像为Bitmap对象 ,,然后传递到OpenCV中的Mat对象,处理之后通过ImageView进行显示
Bitmap bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
Mat mat = new Mat();
Utils.bitmapToMat(bitmap, mat);
Imgproc.circle(mat, new Point(mat.cols()/2, m.rows()/2), 50, new Scalar(255, 0, 0, 255),2 , 8 , 0);
Utils.matToBitmap(mat, bitmap);
//避免在JNI层发生内存泄漏
mat.relesae();
  • 通道数、通道顺序、透明通道的问题:
(1)没默认通道数与顺序:
OpenCV Android SDK创建图像的时候最好将其指定为三通道默认的BGR顺序,这也是OpenCV加载MAT对象的默认通道数与顺序

(2)透明通道:
在OpenCV中,如果需要进行对透明通道的处理,需要将图像Bitmap加载为ARGB_8888方式,然后转换为Mat对象, 此时Mat对象为四通道

(3)灰度与二值图像:
当Amt灰度或者二值图像的时候,需要首先通过cvtColor指定转换类型为COLOR_GRAY2RGBA,之后才可以将Mat对象转换为Bitmap图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjxbless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值