Android+OpenCv4实现边缘检测及轮廓绘制出图像最大边缘
作者:Best-dadong 发布时间:2022-04-08 18:05:44
标签:Android,OpenCv4,边缘检测,最大边缘
实现步骤:
图像灰度化
边缘检测
根据Canny检测得出来的Mat寻找轮廓
算出最大轮廓周长or面积
根据获取到的最大轮廓下标进行轮廓绘制
画出最大矩形,并返回Rect
Canny边缘检测
基于Canny算法的边缘检测主要有5个步骤,依次是
高斯滤波、像素梯度计算、非极大值像素梯度抑制、滞后阈值处理和孤立弱边缘抑制
。Canny在有噪声的情况下表现好不好,取决于前面的降噪过程,可以手动做高斯处理提高识别率。
/**
image 输入图像,必须是CV_8U的单通道或者三通道图像。
edges 输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U。
threshold1 第一个滞后阈值。
threshold2 第二个滞后阈值。
apertureSize Sobel算子的直径。
L2gradient 计算图像梯度幅值方法的标志。默认为false
**/
public static void Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSize, boolean L2gradient)
使用
/**
* canny算法,边缘检测
*/
public static Mat canny(Bitmap bitmap) {
Mat mSource = new Mat();
Utils.bitmapToMat(bitmap, mSource);
Mat grayMat = new Mat();
Imgproc.cvtColor(mSource,grayMat,Imgproc.COLOR_BGR2GRAY);//转换成灰度图
Mat mat = mSource.clone();
Imgproc.Canny(mSource, mat, 75, 200);
return mat;
}
获取图像最大矩形
/**
* 返回边缘检测之后的最大矩形,并返回
*
* @param cannyMat
* Canny之后的mat矩阵
* @return
*/
public Rect findMaxRect(Mat cannyMat) {
Mat tmp = mSource.clone();
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
// 寻找轮廓
Imgproc.findContours(cannyMat, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
int index = 0;
double perimeter = 0;
// 找出匹配到的最大轮廓
for (int i = 0; i < contours.size(); i++) {
// 最大面积
// double area = Imgproc.contourArea(contours.get(i));
//最大周长
MatOfPoint2f source = new MatOfPoint2f();
source.fromList(contours.get(i).toList());
double length = Imgproc.arcLength(source,true);
if(length>perimeter){
perimeter = length;
index = i;
}
}
/**
* 参数一:image,待绘制轮廓的图像。
*
* 参数二:contours,待绘制的轮廓集合。
*
* 参数三:contourIdx,要绘制的轮廓在contours中的索引,若为负数,表示绘制全部轮廓。
*
* 参数四:color,绘制轮廓的颜色。
*
* 参数五:thickness,绘制轮廓的线条粗细。若为负数,那么绘制轮廓的内部。
*
* 参数六:lineType,线条类型。FILLED LINE_4 4连通 LINE_8 8连通 LINE_AA 抗锯齿
*/
Imgproc.drawContours(
tmp,
contours,
index,
new Scalar(0.0, 0.0, 255.0),
9,
Imgproc.LINE_AA
);
Rect rect = Imgproc.boundingRect(contours.get(index));
// Imgproc.rectangle(tmp, rect, new Scalar(0.0, 0.0, 255.0), 4, Imgproc.LINE_8);
showImg(tmp);
return rect;
}
/**
* 显示图像
* @param mat
*/
private void showImg(Mat mat){
Bitmap bitmap = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mat, bitmap);
mIvSrc.setImageBitmap(bitmap);
mat.release();
}
最终效果图
获得矩形坐标点以后,后期可以做裁剪,旋转之类操作,可以自行研究。
来源:https://blog.csdn.net/TLuffy/article/details/116602265


猜你喜欢
- ScrapyScrapy是纯python实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。Scrapy使用了Twisted异步网络
- 今天老肥让我试试百度知道的新功能:插入地图。该功能需要登录才能操作,因此我意外的发现百度用户登录的弹出层变了。我很喜欢这个改进,利用TAB来
- 我参与了IE7的开发过程,看到了在IE浏览器中形形色色使用MSXML的方法。显然有一些东西困扰着开发者:MSXML“混乱”的版本以及如何创建
- 本文实例讲述了python实现TCP服务器端与客户端的方法。分享给大家供大家参考。具体如下:TCP服务器程序(tsTserv.py):fro
- 前言最近工作中遇到一个需求,在使用matplotlib生成图片,想要背景透明,而且图例部分也显示透明效果,通过查找相关资料找到了大概的设置方
- 当存在多个项目的时候,需要同时部署时,且只有一台服务器时,哪么就需要部署Mysql多个实例,原理很简单,多个mysql服务运行使用不同的配置
- 简单构建一个项目,如下是mian.go文件package main// 条件编译-构建标签-如何使用IDE编译和识别func main()
- parseInt()是内置的 JS 函数,用于解析数字字符串中的整数。 例如,解析数字字符串'100':const numb
- 挺久没写博客了,因为博主开始了今年另一段美好的实习经历,学习加做项目,时间已排满;很感谢今年这两段经历,让我接触了golang和python
- 有多少次你在考虑怎样设置数据库时感到为难?其实,如果你在Linux上使用MySQL,就不会有这种情况了。在Linux上使用Webmin图形界
- 前言在测试过程中,注意力往往都在功能上,如果功能正常,是基本不会查看日志的,反之会查看日志定位问题。但是表面上的功能正常不能确保日志没有报错
- 实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu)函数介绍:所用函数为six
- Python2.6 之前:字符串转换为整形和浮点型>>>import string>>>string.a
- 本文实例讲述了Python实现队列的方法。分享给大家供大家参考,具体如下:Python实现队列队列(FIFO),添加元素在队列尾,删除元素在
- 前言经典面试题: 判断一个字符串里面的括号是否闭合,如:{{()}} 就是一个闭合的字符串。{{()}]} 这个里面 ([)] 括号不对称,
- 在程序实际应用中,少不了要进行字符串拼接的操作。下面介绍一下Python语言中四种字符串拼接的方式。1. 算术运算符拼接在Python中算术
- 因此,在数据库的日常维护工作中,如果只是一次两次碰到ORA-01555错误,一般都先忽略,但是如果经常碰到该错误,则要进行一些调整以避免该错
- 一、配置抓包工具1.安装软件本文选择的抓包工具:Fiddler 具体的下载安装这里不详细赘述!(网上搜Fiddler安
- 前段时间公司数据库服务器崩溃启动不起来,经过我初步排查是/home目录挂载不上导致启动不起来,虽然通过注释/etc/fstab中的挂载信息,
- 方法一:onPullDownRefresh和onReachBottom方法实现小程序下拉加载和上拉刷新首先要在json文件里设置window