opencv两张图片找不同

简介: 牙叔教程 简单易学

牙叔教程 简单易学


使用场景


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


效果展示



autojs版本


8.8.7-0


get知识点


  1. 灰度
  2. 图片做减法
  3. 高斯滤波
  4. 闭运算( 先膨胀, 再腐蚀 )
  5. 查找轮廓
  6. 查找最小外接矩形
  7. 计算矩形中心
  8. 计算轮廓面积
  9. 遍历轮廓点位
  10. 画轮廓
  11. 构造Size
  12. 构造Scalar
  13. MatOfPoint转MatOfPoint2f


流程图



代码讲解


1. 读取图片
var path = "测试图片.png";
var img = images.read(path);
path = "测试图片有绿圈.png";
var img2 = images.read(path);


2. 获取mat
let src1Mat = img.getMat();
let src2Mat = img2.getMat();


3. 颜色空间转换 灰度图

let src1MatGray = new Mat();
let src2MatGray = new Mat();
Imgproc.cvtColor(src1Mat, src1MatGray, Imgproc.COLOR_BGR2GRAY);
Imgproc.cvtColor(src2Mat, src2MatGray, Imgproc.COLOR_BGR2GRAY);


4. 图片做减法
var dst = new Mat();
Core.subtract(src2MatGray, src1MatGray, dst);


5. 保存做了减法的图片
var subtractImg = images.matToImage(dst);
let subtractImgPath = files.join(files.getSdcardPath(), "图片减法.png");
images.save(subtractImg, subtractImgPath);


6. 高斯滤波
let 高斯滤波后的图像 = new Mat();
Imgproc.GaussianBlur(dst, 高斯滤波后的图像, newSize(5), 3, 3);


7. 闭运算 (先膨胀后腐蚀)
let 闭运算后的图像 = new Mat();
Imgproc.morphologyEx(
  高斯滤波后的图像,
  闭运算后的图像,
  Imgproc.MORPH_CLOSE,
  Imgproc.getStructuringElement(Imgproc.MORPH_RECT, newSize(5))
);


8. 查找轮廓
let contours = new java.util.ArrayList();
let hierarchy = new Mat();
Imgproc.findContours(闭运算后的图像, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);


9. 遍历轮廓, 提取数据
let bigArr = [];
let cxyArr = [];
let areaArr = [];
for (let i = 0; i < contours.size(); ++i) {
  let item = contours.get(i);
  // 最小外接矩形
  let rotateRect = Imgproc.minAreaRect(new MatOfPoint2f(item.toArray()));
  // 矩形中心
  cxyArr.push([rotateRect.center.x, rotateRect.center.y]);
  // 轮廓面积
  let area = Math.abs(Imgproc.contourArea(item));
  areaArr.push(area);
  var len = item.size();
  let arr = [];
  // 提取轮廓坐标
  for (var w = 0; w < len.width; w++) {
    for (var h = 0; h < len.height; h++) {
      arr.push(item.get(h, w));
    }
  }
  bigArr.push(arr);
}


10. 画面积较大的轮廓
var len = bigArr.length;
for (var i = 0; i < len; i++) {
  if (areaArr[i] < 10000) {
    continue;
  }
  let arr = bigArr[i];
  var arrLen = arr.length;
  path.moveTo(arr[0][0], arr[0][1]);
  for (var j = 1; j < arrLen; j++) {
    path.lineTo(arr[j][0], arr[j][1]);
  }
  path.close();
  // 画轮廓
  canvas.drawPath(path, paint);
  // 画轮廓中心
  let xy = cxyArr[i];
  canvas.drawPoint(xy[0], xy[1], paint);
}


11. 保存图片
var image = 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( InputOutputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset=Point());
取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略
取值一:CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内
取值二:CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息


3. Scalar
color = new Scalar(0,255,0)
color = new Scalar(199);


4. drawContours
Imgproc.drawContours(闭运算后的图像, contours, idx, color, Core.FILLED, 8, hierarchy);


参考文章



声明

部分内容来自网络

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







相关文章
|
3月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
208 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
3月前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
42 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
3月前
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
245 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
8月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
81 0
|
8月前
|
存储 编解码 监控
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
151 0
|
8月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
114 0
|
3月前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
205 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
5月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
477 1
|
3月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
75 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
5月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
358 1
下一篇
开通oss服务