java如何用阿里云oss图片路径进行图片相似度对比并得出结果
时间: 2023-05-26 13:05:36 浏览: 191
JAVA比较两张图片相似度的方法
要使用阿里云oss进行图片相似度对比,可以使用以下步骤:
1. 在阿里云oss中存储图片,获取其访问路径。
2. 通过Java代码将图片路径读取为输入流(可以使用Java的IO流库)。
3. 使用开源的Java相似度比较库,如ImageMagick或OpenCV,将输入流中的图片转换成内存中的图像对象,然后对其进行相似度比较。
4. 如果需要得到结果,可以将相似度比较的结果输出到控制台或写入到文件中。
下面是使用Java的ImageMagick库进行图片相似度比较的示例代码:
```java
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.javacpp.FloatPointer;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.ShortPointer;
import org.bytedeco.opencv.global.opencv_calib3d;
import org.bytedeco.opencv.global.opencv_core;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.global.opencv_imgproc;
import org.bytedeco.opencv.opencv_core.DMatchVector;
import org.bytedeco.opencv.opencv_core.DMatch;
import org.bytedeco.opencv.opencv_core.DescriptorMatcher;
import org.bytedeco.opencv.opencv_core.KeyPointVector;
import org.bytedeco.opencv.opencv_core.KeyPoint;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_features2d.AKAZE;
import org.bytedeco.opencv.opencv_features2d.Feature2D;
import org.bytedeco.opencv.opencv_features2d.FlannBasedMatcher;
import org.bytedeco.opencv.opencv_features2d.ORB;
import org.bytedeco.opencv.opencv_flann.IndexParams;
import org.bytedeco.opencv.opencv_flann.KSearchParams;
import org.bytedeco.opencv.opencv_flann.LshIndexParams;
import org.bytedeco.opencv.opencv_flann.SearchParams;
import static org.bytedeco.opencv.global.opencv_core.CV_32FC1;
import static org.bytedeco.opencv.global.opencv_core.NORM_HAMMING;
import static org.bytedeco.opencv.global.opencv_core.NORM_L2;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
public class CompareImage {
private static final Logger LOG = Logger.getLogger(CompareImage.class.getName());
private static final int N_FEATURES = 500;
public static void main(String[] args) {
String img1Path = "https://your-bucket.oss-cn-hangzhou.aliyuncs.com/image1.jpg";
String img2Path = "https://your-bucket.oss-cn-hangzhou.aliyuncs.com/image2.jpg";
float simThreshold = 0.7f;
try {
// OpenCV灰度图像比较
float sim = compareImages(img1Path, img2Path, NORM_L2);
if (sim > simThreshold) {
System.out.println("两幅图像基本一致!");
} else {
System.out.println("两幅图像不太一致,相似度为:" + sim);
}
} catch (Exception e) {
LOG.log(Level.SEVERE, "图片比较出错!", e);
}
}
/**
* 比较两幅图像的相似度
* @param img1Path 第一幅图像的路径
* @param img2Path 第二幅图像的路径
* @param normType OpenCV中的归一化方法类型
* @return 返回两幅图像的相似度
*/
public static float compareImages(String img1Path, String img2Path, int normType) {
Mat img1 = imread(img1Path, imread.IMREAD_GRAYSCALE);
Mat img2 = imread(img2Path, imread.IMREAD_GRAYSCALE);
if (img1.empty() || img2.empty()) {
return 0f;
}
// 提取特征点,描述子
KeyPointVector kpv1 = new KeyPointVector();
KeyPointVector kpv2 = new KeyPointVector();
Mat des1 = new Mat();
Mat des2 = new Mat();
Feature2D orb = ORB.create(N_FEATURES);
orb.detect(img1, kpv1);
orb.compute(img1, kpv1, des1);
orb.detect(img2, kpv2);
orb.compute(img2, kpv2, des2);
// 特征点匹配
DMatchVector match = new DMatchVector();
DescriptorMatcher matcher = FlannBasedMatcher.create();
matcher.match(des1, des2, match);
// 计算match中所有匹配点之间的距离,以确定两个图像之间的差异
double maxDist = 0f;
double minDist = Double.MAX_VALUE;
for (int i = 0; i < match.size(); i++) {
DMatch dmatch = match.get(i);
double dist = dmatch.distance();
if (dist < minDist) {
minDist = dist;
}
if (dist > maxDist) {
maxDist = dist;
}
}
// 计算匹配点之间的距离,这里选择L2范数
LinkedList<KeyPoint> kp1 = new LinkedList<KeyPoint>();
LinkedList<KeyPoint> kp2 = new LinkedList<KeyPoint>();
List<DMatch> goodMatch = new ArrayList<>();
double partition = 1f;
for (int i = 0; i < match.size(); i++) {
DMatch dmatch = match.get(i);
if ((dmatch.distance() / maxDist) < (partition)) {
goodMatch.add(dmatch);
kp1.addLast(kpv1.get(dmatch.queryIdx()));
kp2.addLast(kpv2.get(dmatch.trainIdx()));
}
}
// 显示匹配点
// Mat outImgMat = new Mat();
// MatOfDMatch matches = new MatOfDMatch(match.toArray());
// Features2d.drawMatches(img1, kpv1, img2, kpv2, matches, outImgMat);
// showImg(outImgMat);
// 计算最终的图像相似度
float sim = (float) goodMatch.size();
sim = sim / (Math.max(kpv1.size(), kpv2.size()));
return sim;
}
}
```
在这个代码中,我们使用了OpenCV的ORB算法来提取图像的关键点和描述符,然后对这些特征点进行匹配,计算匹配点之间的距离,并基于这些距离来确定两个图像之间的相似度。在比较过程中,可以通过调整`N_FEATURES`参数来控制特征点的数量,通过调整`simThreshold`参数来控制相似度的阈值。
值得注意的是,这只是一个简单的示例,实际的图片相似度比较可能需要更为复杂的算法和更加精细的调整。
阅读全文