Java+OpenCV图片对比
近期老板让研究一下航拍、遥感影像对比功能,个人认为可行性并不高,没有知识储备,而且真要做好的话得当作产品去砸钱(老板:砸钱是不可能的,这辈子都不可能砸钱)。
经过查询相关资料,OpenCV对图像的处理还是挺不错的,底层是用c,c++写的,文件小,对python、Java等提供接口。
首先配置环境,在网页上下载开发包,按照配置教程配置。
步骤大致如下:
1.按照上方【下载】链接(这里不直接提供红框链接是因为左上角可看到“OpenCV教程”字样,你们懂我意思吧.jpg,是API文档哦)页面找到如下红框处地址,访问后可看到多个版本地址,逐级深入得到对应版本的快速下载器(并不是真实文件),运行exe才能得到目标文件夹,找到下载的opencv文件夹,在builder下找到Java文件夹,这是for Java开发包。
2.打开eclipse,windows——preferences——Java——Build Path——User Libraries,点击New,输入opencv2.4.13,点击Add Jars,选择opencv Java目录下的jar包,展开Libraries,选中Native library location,可以看到值为none,点击Edit,选择Java目录下的x64(32位系统选x86)。
3.创建Java项目,打开Java Build Path,点击右侧的Add Library——User Library,可以看到之前配置的opev2.4.13,勾选即可。
接下来就可以开发了。
图片找茬的思路是先对两图片做差,通过腐蚀、膨胀来强化不同点,弱化相同点,再通过边缘检测算法找出不同点位置画框标识。根据opencv教程,也能帮助了解各个功能。
这是从网上找的找茬图
图像做差:Core.absdiff(Mat src1, Mat src2, Mat dst)
代码如下:
public static void main(String[] args) {// TODO Auto-generated method stubSystem.loadLibrary(Core.NATIVE_LIBRARY_NAME ); Mat img1 = Highgui.imread("D:\\projects\\3.png");Mat img2 = Highgui.imread("D:\\projects\\4.png");Mat img = new Mat();//像素做差Core.absdiff(img1, img2, img);Highgui.imwrite("D:\\projects\\new_diff7.png", img);}
效果:
可以看到做差把相同部分除去,剩下的明显的就是不同处。
腐蚀:
Imgproc.erode(Mat src, Mat dst, Mat kernel, Point anchor, int iterations)
//接上步Mat erodeImg = new Mat();Mat kernel = Imgproc.getStructuringElement(1,new Size(4,6));//腐蚀Imgproc.erode(img, erodeImg, kernel,new Point(-1,-1),1);Highgui.imwrite("D:\\projects\\new_diff7.png", erodeImg);
效果:
可以看到腐蚀是把暗度增强,达到去除噪声的目的,但弊端是比较细小的点会被当作噪点忽略掉,腐蚀的强度与kernel(腐蚀范围)、iterations(腐蚀次数)有关。
膨胀:Imgproc.dilate(Mat src, Mat dst, Mat kernel, Point anchor, int iterations)
//接上步Mat dilateImg = new Mat();Mat kernel1 = Imgproc.getStructuringElement(1,new Size(2,3));//膨胀Imgproc.dilate(erodeImg, dilateImg, kernel1);Highgui.imwrite("D:\\projects\\new_diff7.png", dilateImg);
效果:
膨胀与腐蚀相反,先腐蚀后膨胀就可以达到将相同点去除,突出不同点的效果。
画框:
//接上步Mat threshImg = new Mat();List<MatOfPoint> contours = new ArrayList<MatOfPoint>();Mat hierarchy = new Mat();//检测边缘Imgproc.threshold(dilateImg, threshImg, 20, 255, Imgproc.THRESH_BINARY);//转化成灰度Imgproc.cvtColor(threshImg, threshImg, Imgproc.COLOR_RGB2GRAY);//找到轮廓(3:CV_RETR_TREE,2:CV_CHAIN_APPROX_SIMPLE)Imgproc.findContours(threshImg, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));List<Rect> boundRect = new ArrayList<Rect>(contours.size());for(int i=0;i<contours.size();i++){
// Mat conMat = (Mat)contours.get(i);
// Imgproc.approxPolyDP((MatOfPoint2f)conMat,contours_poly.get(i),3,true);//根据轮廓生成外包络矩形Rect rect = Imgproc.boundingRect(contours.get(i));boundRect.add(rect);}for(int i=0;i<contours.size();i++){Scalar color = new Scalar(0,0,255);//绘制轮廓
// Imgproc.drawContours(img1, contours, i, color, 1, Core.LINE_8, hierarchy, 0, new Point());//绘制矩形Core.rectangle(img1, boundRect.get(i).tl(), boundRect.get(i).br(), color, 2, Core.LINE_8, 0);}Highgui.imwrite("D:\\projects\\new_diff7.png", img1);
效果:
可以看到小孩帽子上的白点因为某种原因在腐蚀阶段被当作噪声忽略掉了,要提高精度还可对腐蚀的参数进行设置。
总代码:
package com.opencv;import java.util.ArrayList;
import java.util.List;import org.opencv.core.MatOfPoint;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.core.Point;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;public class Hello {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.loadLibrary(Core.NATIVE_LIBRARY_NAME ); Mat img1 = Highgui.imread("D:\\projects\\3.png");Mat img2 = Highgui.imread("D:\\projects\\4.png");Mat img = new Mat();Mat erodeImg = new Mat();Mat dilateImg = new Mat();Mat threshImg = new Mat();List<MatOfPoint> contours = new ArrayList<MatOfPoint>();Mat hierarchy = new Mat();//像素做差Core.absdiff(img1, img2, img);Mat kernel = Imgproc.getStructuringElement(1,new Size(4,6));Mat kernel1 = Imgproc.getStructuringElement(1,new Size(2,3));//腐蚀Imgproc.erode(img, erodeImg, kernel,new Point(-1,-1),1);//膨胀Imgproc.dilate(erodeImg, dilateImg, kernel1);//检测边缘Imgproc.threshold(dilateImg, threshImg, 20, 255, Imgproc.THRESH_BINARY);//转化成灰度Imgproc.cvtColor(threshImg, threshImg, Imgproc.COLOR_RGB2GRAY);//找到轮廓(3:CV_RETR_TREE,2:CV_CHAIN_APPROX_SIMPLE)Imgproc.findContours(threshImg, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));List<Rect> boundRect = new ArrayList<Rect>(contours.size());for(int i=0;i<contours.size();i++){
// Mat conMat = (Mat)contours.get(i);
// Imgproc.approxPolyDP((MatOfPoint2f)conMat,contours_poly.get(i),3,true);//根据轮廓生成外包络矩形Rect rect = Imgproc.boundingRect(contours.get(i));boundRect.add(rect);}for(int i=0;i<contours.size();i++){Scalar color = new Scalar(0,0,255);//绘制轮廓
// Imgproc.drawContours(img1, contours, i, color, 1, Core.LINE_8, hierarchy, 0, new Point());//绘制矩形Core.rectangle(img1, boundRect.get(i).tl(), boundRect.get(i).br(), color, 2, Core.LINE_8, 0);}Highgui.imwrite("D:\\projects\\new_diff7.png", img1);}}
应小伙伴建议,提供OpenCV的API地址
OpenCV 2.3.2 API文档
Java+OpenCV图片对比相关推荐
- java OpenCV 图片清晰度、色偏和亮度检测
基于OpenCV对图片清晰度.色偏和亮度的检测(java版) 本文链接:https://blog.csdn.net/qq_34997906/article/details/87970817 由来:近期 ...
- java Opencv 图片修复 Photo
OpenCV 如何进行图片修复 修复函数: Photo.inpaint(imageSrc, imageMask, imageDst, radius, Photo.INPAINT_TELEA); ima ...
- java opencv 图片放大缩小,角点检测和边缘检测(14)
什么是高斯金字塔 所谓的高斯金字塔是利用算法将图片放大,如下面的图形: openCv对应的函数: src输入图像 dst 目标图像 dstsize 放大尺寸 borderType 边框类型 实例: S ...
- java opencv 图片处理_Java图像处理:基于OpenCV与JVM
Java图像处理:基于OpenCV与JVM 作者:(法)尼古拉斯·莫德奇克(Nicolas Modrzyk) 著 出版日期:2019年04月 文件大小:7.64M 支持设备: ¥60.00仅供试读 适 ...
- java实现图片对比功能_Java 照片对比功能的实现
package com.function; import java.awt.image.BufferedImage; import java.io.BufferedWriter; import jav ...
- opencv 图片对比(相似度)
1.特征值对比 判断标准:特征值相似度小于一个给定值的特征值个数 2.直方图对比Android代码(参考文献:http://blog.acronym.co.kr/580 ) List<Mat&g ...
- JAVA Opencv在图片上添加中文
问题描述: 将图片进行均值.中值.高斯滤波,高斯边缘检测,并在图片上添加中文文字. 一.算法思想 首先经过opencv的一系列操作,例如高斯模糊.均值模糊等操作后.用Imgcodecs.imwrite ...
- python找图片不同_用openCV和Python 实现图片对比,并标识出不同点的方式
最近项目中需要实现两组图片对比,并能将两者的区别标识出来. 在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下: 想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Pyt ...
- JAVA 识别图片中二维码 opencv 识别精准
JAVA 识别图片中二维码 opencv 识别精准 文章目录 JAVA 识别图片中二维码 opencv 识别精准 一.添加依赖 二.依赖配置 三.测试类 四.结果 提示:以下是本篇文章正文内容,下面案 ...
最新文章
- ppt科研绘图 图形布尔运算
- python需要安装的库_使用python学习【机器学习】需要安装的库~
- 下载人脸认证助手_认证助手最新版
- 使用Cygwin实现vlc 1.0.5的wince移植
- C++ static静态成员函数
- linux usb驱动u盘启动不了,Linux环境下USB的原理、驱动和配置(4)
- 设计灵感|如何设计出简洁吸引人的字体海报?
- 定位会完全压住标准流盒子里面的内容(HTML、CSS)
- 通用权限底层研究:强大的分页功能
- cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer Micro
- FT232R国产替代GP232RLUSB2.0串口芯片
- echarts动态legend不变更
- 【Excel】Excel无序数据模糊查询
- 周易六十四卦—水泽节卦
- 边缘风行视频采集软件V1.0
- 在线html编辑器 富文本转为html代码
- 软件测试作业进度-2
- xxl-job(二)调度中心挂了怎么办
- 百度员工一年挣多少钱?聊聊百度的薪资职级体系
- 语音平台三方会战,亚马逊谷歌苹果谁领风骚?