所在的位置: js >> js前景 >> opencv两张图片找不同

opencv两张图片找不同

北京治好白癜风要多少钱 http://pf.39.net/bdfyy/bdflx/160308/4782762.html

牙叔教程简单易学

使用场景

两张图片找不同,大家来找茬之类的

效果展示

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);

声明

部分内容来自网络

本教程仅用于学习,禁止用于其他用途




转载请注明:http://www.aierlanlan.com/cyrz/3380.html

  • 上一篇文章:
  •   
  • 下一篇文章: