|
@@ -4,6 +4,8 @@ import org.opencv.core.*;
|
|
|
import org.opencv.features2d.DescriptorExtractor;
|
|
|
import org.opencv.features2d.FeatureDetector;
|
|
|
import org.opencv.features2d.Features2d;
|
|
|
+import org.opencv.features2d.ORB;
|
|
|
+import org.opencv.imgcodecs.Imgcodecs;
|
|
|
import org.opencv.imgproc.Imgproc;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
@@ -12,6 +14,9 @@ import java.awt.image.BufferedImage;
|
|
|
import java.awt.image.DataBufferByte;
|
|
|
import java.io.File;
|
|
|
import java.io.FileInputStream;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
|
|
|
@Service
|
|
|
public class ImageFeatureService {
|
|
@@ -22,10 +27,12 @@ public class ImageFeatureService {
|
|
|
Mat matImage = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
|
|
|
byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
|
|
|
matImage.put(0, 0, data);
|
|
|
-System.out.println(matImage.type());
|
|
|
+ System.out.println(matImage.type());
|
|
|
// 转换为灰度图像(如果需要)
|
|
|
Mat grayImage = new Mat();
|
|
|
Imgproc.cvtColor(matImage, grayImage, Imgproc.COLOR_BGR2GRAY);
|
|
|
+
|
|
|
+
|
|
|
// 初始化特征检测器和描述子提取器
|
|
|
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
|
|
|
DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
|
|
@@ -38,6 +45,9 @@ System.out.println(matImage.type());
|
|
|
Mat descriptors = new Mat();
|
|
|
extractor.compute(grayImage, keyPoints, descriptors);
|
|
|
matImage.convertTo(descriptors, CvType.CV_32F);
|
|
|
+ String dump = descriptors.dump();
|
|
|
+ System.out.println("AAAAA:" + dump);
|
|
|
+
|
|
|
System.out.println(descriptors.type());
|
|
|
// 将描述子转换为float数组
|
|
|
float[] featureVector = new float[descriptors.cols() * descriptors.rows()];
|
|
@@ -45,17 +55,45 @@ System.out.println(matImage.type());
|
|
|
return featureVector;
|
|
|
}
|
|
|
|
|
|
- public void getImage() {
|
|
|
- File file = new File("D:\\xiaoshi-test\\target\\zxy.jpg");
|
|
|
+ public String getDump(BufferedImage image) {
|
|
|
+ // 读取图像
|
|
|
+ Mat img = Imgcodecs.imread("F:\\file\\test\\xx.jpg");
|
|
|
+
|
|
|
+ // 初始化ORB检测器
|
|
|
+ FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
|
|
|
+ MatOfKeyPoint keypoints = new MatOfKeyPoint();
|
|
|
+
|
|
|
+ // 检测关键点
|
|
|
+ detector.detect(img, keypoints);
|
|
|
+
|
|
|
+ // 初始化ORB描述子提取器
|
|
|
+ ORB orb = ORB.create();
|
|
|
+ Mat descriptors = new Mat();
|
|
|
+
|
|
|
+ // 计算描述子
|
|
|
+ orb.compute(img, keypoints, descriptors);
|
|
|
+
|
|
|
+ // 输出描述子,这就是你的特征向量
|
|
|
+ System.out.println(descriptors.dump());
|
|
|
+ return descriptors.dump();
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<Float> getImage() {
|
|
|
+ List<Float> floats = new ArrayList<>();
|
|
|
+ File file = new File("F:\\file\\test\\xx.jpg");
|
|
|
try {
|
|
|
FileInputStream fileInputStream = new FileInputStream(file);
|
|
|
BufferedImage image = ImageIO.read(fileInputStream);
|
|
|
float[] featureVector = this.extractFeatures(image);
|
|
|
System.out.println(featureVector);
|
|
|
+ for (float v : featureVector) {
|
|
|
+ floats.add(v);
|
|
|
+ }
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
+ return floats;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- }
|
|
|
}
|