牙叔教程简单易学
使用场景
两张图片找不同,大家来找茬之类的
效果展示
autojs版本
8.8.7-0
get知识点
灰度图片做减法高斯滤波闭运算(先膨胀,再腐蚀)查找轮廓查找最小外接矩形计算矩形中心计算轮廓面积遍历轮廓点位画轮廓构造Size构造ScalarMatOfPoint转MatOfPoint2f
预备知识
学习OpenCV3京东好评率%无理由退换¥.64购买流程图
代码讲解
1.读取图片
varpath=测试图片.png;
varimg=images.read(path);
path=测试图片有绿圈.png;
varimg2=images.read(path);
2.获取mat
letsrc1Mat=img.getMat();
letsrc2Mat=img2.getMat();
3.颜色空间转换灰度图
letsrc1MatGray=newMat();
letsrc2MatGray=newMat();
Imgproc.cvtColor(src1Mat,src1MatGray,Imgproc.COLOR_BGR2GRAY);
Imgproc.cvtColor(src2Mat,src2MatGray,Imgproc.COLOR_BGR2GRAY);
4.图片做减法
vardst=newMat();
Core.subtract(src2MatGray,src1MatGray,dst);
5.保存做了减法的图片
varsubtractImg=images.matToImage(dst);
letsubtractImgPath=files.join(files.getSdcardPath(),图片减法.png);
images.save(subtractImg,subtractImgPath);
6.高斯滤波
let高斯滤波后的图像=newMat();
Imgproc.GaussianBlur(dst,高斯滤波后的图像,newSize(5),3,3);
7.闭运算(先膨胀后腐蚀)
let闭运算后的图像=newMat();
Imgproc.morphologyEx(
高斯滤波后的图像,
闭运算后的图像,
Imgproc.MORPH_CLOSE,
Imgproc.getStructuringElement(Imgproc.MORPH_RECT,newSize(5))
);
8.查找轮廓
letcontours=newjava.util.ArrayList();
lethierarchy=newMat();
Imgproc.findContours(闭运算后的图像,contours,hierarchy,Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_SIMPLE);
9.遍历轮廓,提取数据
letbigArr=[];
letcxyArr=[];
letareaArr=[];
for(leti=0;icontours.size();++i){
letitem=contours.get(i);
//最小外接矩形
letrotateRect=Imgproc.minAreaRect(newMatOfPoint2f(item.toArray()));
//矩形中心
cxyArr.push([rotateRect.center.x,rotateRect.center.y]);
//轮廓面积
letarea=Math.abs(Imgproc.contourArea(item));
areaArr.push(area);
varlen=item.size();
letarr=[];
//提取轮廓坐标
for(varw=0;wlen.width;w++){
for(varh=0;hlen.height;h++){
arr.push(item.get(h,w));
}
}
bigArr.push(arr);
}
10.画面积较大的轮廓
varlen=bigArr.length;
for(vari=0;ilen;i++){
if(areaArr[i]00){
continue;
}
letarr=bigArr[i];
vararrLen=arr.length;
path.moveTo(arr[0][0],arr[0][1]);
for(varj=1;jarrLen;j++){
path.lineTo(arr[j][0],arr[j][1]);
}
path.close();
//画轮廓
canvas.drawPath(path,paint);
//画轮廓中心
letxy=cxyArr[i];
canvas.drawPoint(xy[0],xy[1],paint);
}
11.保存图片
varimage=canvas.toImage();
images.save(image,/sdcard/tmp.png);
12.释放资源
img.recycle();
img2.recycle();
subtractImg.recycle();
image.recycle();
src1Mat.release();
src2Mat.release();
src1MatGray.release();
src2MatGray.release();
dst.release();
高斯滤波后的图像.release();
闭运算后的图像.release();
hierarchy.release();
13.打开图片
app.viewFile(/sdcard/tmp.png);
相关知识点
1.另一种图片减法
Core.absdiff(src2MatGray,src1MatGray,dst);
2.findContours参数轮廓的检索模式,定义轮廓的近似方法
findContours(InputOutputArrayimage,OutputArrayOfArrayscontours,
OutputArrayhierarchy,intmode,
intmethod,Pointoffset=Point());
取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略
取值一:CV_CHAIN_APPROX_NONE保存物体边界上所有连续的轮廓点到contours向量内
取值二:CV_CHAIN_APPROX_SIMPLE仅保存轮廓的拐点信息
3.Scalar
color=newScalar(0,,0)
color=newScalar();
4.drawContours
Imgproc.drawContours(闭运算后的图像,contours,idx,color,Core.FILLED,8,hierarchy);
声明
部分内容来自网络
本教程仅用于学习,禁止用于其他用途