牙叔教程简单易学
使用场景
两张图片找不同,大家来找茬之类的
效果展示
自动射流研究…版本
8.8.7-0
得到知识点
灰度图片做减法高斯滤波闭运算(先膨胀,再腐蚀)查找轮廓查找最小外接矩形计算矩形中心计算轮廓面积遍历轮廓点位画轮廓构造大小构造ScalarMatOfPoint转MatOfPoint2f
流程图
代码讲解
1.读取图片
var path='测试图片. png ';var img=图像。读取(路径);路径='测试图片有绿圈. png ';var img 2=图像。读取(路径);
2.获取垫子
设src 1 mat=img。get mat();设src 2 mat=img 2。getmat();
3.颜色空间转换灰度图
设src 1 Mat gray=new Mat();设src 2 Mat gray=new Mat();Imgproc.cvtColor(src1Mat,src1MatGray,Imgproc .COLOR _ bgr 2灰色);Imgproc.cvtColor(src2Mat,src2MatGray,Imgproc .COLOR _ bgr 2灰色);
4.图片做减法
var dst=new Mat();Core.subtract(src2MatGray,src1MatGray,dst);
5.保存做了减法的图片
var减去img=图像。mattoimage(dst);让我们减去imgpath=files。加入(文件。getsdcardpath(),'图片减法. png’);images.save(subtractImg,subtract img path);
6.高斯滤波
让高斯滤波后的图像=new Mat();Imgproc .高斯布鲁(夏令时,高斯滤波后的图像,newSize(5),3,3);
7.闭运算(先膨胀后腐蚀)
让闭运算后的图像=new Mat();Imgproc.morphologyEx(高斯滤波后的图像,闭运算后的图像,Imgproc .MORPH_CLOSE,Imgproc。getstructuringelement(Imgproc .MORPH_RECT,新尺寸(5)));
8.查找轮廓
让轮廓=新Java。util。ArrayList();let hierarchy=new Mat();Imgproc.findContours(闭运算后的图像,轮廓,层次,Imgproc .RETR _外部,Imgproc .CHAIN _ APPROX _ SIMPLE);
9.遍历轮廓,提取数据
设大arr=;设cxy arr=;设面积arr=;对于(设I=0;I轮廓。size();I){ let item=contours。get(I);//最小外接矩形设rotater Starr=imgproc。minar直立(新的matofpoint 2f(项目。toarray()));//矩形中心cxy阵列。push();//轮廓面积让面积=数学。ABS(imgproc。等高线面积(项));区域排列。推(面积);var len=item。size();设arr=;//提取轮廓坐标for(var w=0;w长度宽度;w){ for(var h=0;h长度。高度;h ) { arr.push(item.get(h,w));} } bigarr。push(arr);}
10.画面积较大的轮廓
var len=big arr . length for(var I=0;我leni ) { if (areaArr 10000) {继续;}设arr=bigArrvar arrLen=arr . length path . move to(arr 00,arr 01);for(var j=1;j阿伦;j ) { path.lineTo(arr0,arr 1);}路径。close();//画轮廓canvas.drawPath(path,paint);//画轮廓中心设xy=cxyArrcanvas.drawPoint(xy0,xy1,paint);}
11.保存图片
var image=画布。to image();images.save(image,'/SD卡/tmp。png’);
12.释放资源
img。recycle();img 2。recycle();减法。recycle();形象。recycle();src 1材料。发布();src 2 mat。发布();src 1浅灰色。发布();src 2浅灰色。发布();夏令时。发布();高斯滤波后的图像。发布();闭运算后的图像。发布();等级制度。发布();
13.打开图片
app。查看文件('/SD卡/tmp。png’);
相关知识点
1.另一种图片减法
Core.absdiff(src2MatGray,src1MatGray,dst);
2.查找轮廓参数轮廓的检索模式,定义轮廓的近似方法
find contours(inputoutarrayimage,OutputArrayOfArrays contours,OutputArray hierarchy,int mode,int method,Point offset=Point());取值一:简历_ RETR _外部只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略取值一:CV_CHAIN_APPROX_NONE保存物体边界上所有连续的轮廓点到轮廓向量内取值二:CV_CHAIN_APPROX_SIMPLE仅保存轮廓的拐点信息
3.数量
颜色=新标量(0,255,0)颜色=新标量(199);
4.绘制等高线
Imgproc.drawContours(闭运算后的图像,轮廓,idx,颜色,核心。填充,8,层次);
参考文章
中文版求轮廓的中心点坐标开放计算机视觉中的查找轮廓函数参数详解高斯滤波开运算、闭运算操作使用开放源代码计算机视觉库查找两张图片不同的部分
.太多了,至少参考了几十个帖子。
部分说法来自网络。
本教程仅供学习,禁止用于其他目的。