From 06848bb2d24986f6c31b24859fe45d1709fab16a Mon Sep 17 00:00:00 2001 From: Mateusz Kowalczyk Date: Fri, 24 Jan 2020 11:45:44 +0100 Subject: [PATCH] add reading all faces from database --- .../ffm/app/DirectoryScanner.java | 2 +- .../ffm/app/cache/FacesCacheService.java | 19 ++++++++-- .../ffm/data/database/Dao.java | 5 ++- .../ffm/data/database/face/Face.java | 26 ++++++++++++++ .../ffm/data/database/face/FaceDAO.java | 35 ++++++++++++++++++- .../ffm/data/database/photo/PhotoDAO.java | 13 ++++++- .../ffm/image/FaceDetector.java | 5 +-- 7 files changed, 97 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/app/DirectoryScanner.java b/src/main/java/dev/mateuszkowalczyk/ffm/app/DirectoryScanner.java index 2ab77d4..3ecd5e5 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/app/DirectoryScanner.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/app/DirectoryScanner.java @@ -51,7 +51,7 @@ public class DirectoryScanner implements Runnable { photo.setFileName(filename); BufferedImage image = this.thumbnailService.createThumbnail(photo); - this.photoDAO.save(photo); + this.photoDAO.add(photo); WritableImage wr = null; if (image != null) { diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java b/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java index c4d7cdb..336292f 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java @@ -1,6 +1,9 @@ package dev.mateuszkowalczyk.ffm.app.cache; import dev.mateuszkowalczyk.ffm.data.database.face.Face; +import org.opencv.core.Mat; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -9,13 +12,25 @@ import java.io.IOException; public class FacesCacheService implements Runnable { protected static final String DIRECTORY_NAME = "/faces"; - private final BufferedImage faceImage; + private CacheService cacheService = CacheService.getInstance(); + private BufferedImage faceImage; private String path; - public FacesCacheService (BufferedImage face) { + public FacesCacheService(BufferedImage face) { this.faceImage = face; } + public FacesCacheService() { + + } + + public Mat readFaceToProcess(String name) { + Mat image = Imgcodecs.imread(this.cacheService.getPath() + DIRECTORY_NAME + "/" + name + ".JPG"); + Imgproc.cvtColor(image, image, Imgproc.COLOR_RGB2GRAY); + + return image; + } + @Override public void run() { diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/Dao.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/Dao.java index 33af8cf..e3617ba 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/Dao.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/Dao.java @@ -1,11 +1,14 @@ package dev.mateuszkowalczyk.ffm.data.database; +import java.util.List; import java.util.Optional; public interface Dao { Optional get(long id); - void save(T t); + List getAll(); + List getAll(boolean refresh); + void add(T t); void update(T t); void delete (T t); diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java index 327925c..fc459c5 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java @@ -1,9 +1,13 @@ package dev.mateuszkowalczyk.ffm.data.database.face; +import dev.mateuszkowalczyk.ffm.app.cache.FacesCacheService; import dev.mateuszkowalczyk.ffm.data.database.annotation.Column; import dev.mateuszkowalczyk.ffm.data.database.annotation.PrimaryKey; import dev.mateuszkowalczyk.ffm.data.database.annotation.Table; +import org.opencv.core.Mat; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.UUID; @Table @@ -21,10 +25,19 @@ public class Face { @Column(type = Column.Type.INT) private long photoId; + private Mat faceToProcess; + public Face() { this.name = UUID.randomUUID().toString(); } + public Face(ResultSet resultSet) throws SQLException { + this.id = resultSet.getInt("id"); + this.name = resultSet.getString("name"); + this.path = resultSet.getString("path"); + this.photoId = resultSet.getInt("photoId"); + } + public long getPhotoId() { return photoId; } @@ -56,4 +69,17 @@ public class Face { public void setPath(String path) { this.path = path; } + + public Mat getFaceToProcess() { + if (this.faceToProcess == null) { + FacesCacheService facesCacheService = new FacesCacheService(); + this.faceToProcess = facesCacheService.readFaceToProcess(this.name); + } + + return faceToProcess; + } + + public void setFaceToProcess(Mat faceToProcess) { + this.faceToProcess = faceToProcess; + } } diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java index 25f4bf3..68f9d67 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java @@ -6,11 +6,14 @@ import dev.mateuszkowalczyk.ffm.data.database.Dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; public class FaceDAO implements Dao { private static FaceDAO instance; private DatabaseService databaseService = DatabaseService.getInstance(); + private List faceList = new ArrayList<>(); private FaceDAO() { } @@ -29,7 +32,35 @@ public class FaceDAO implements Dao { } @Override - public void save(Face face) { + public List getAll() { + return this.getAll(false); + } + + @Override + public List getAll(boolean refresh) { + if (this.faceList.size() == 0 || refresh) { + this.faceList.clear(); + + String sql = "SELECT * FROM face"; + + try { + ResultSet resultSet = this.databaseService.getConnection().prepareStatement(sql).executeQuery(); + + while (resultSet.next()) { + Face face = new Face(resultSet); + this.faceList.add(face); + } + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return this.faceList; + } + + @Override + public void add(Face face) { String sql = "INSERT INTO face (name, path, photoId) values (?, ?, ?)"; try { @@ -47,6 +78,8 @@ public class FaceDAO implements Dao { face.setId(resultSet.getInt("id")); } + this.faceList.add(face); + } catch (SQLException e) { e.printStackTrace(); } diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/photo/PhotoDAO.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/photo/PhotoDAO.java index bd68cef..fe72346 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/photo/PhotoDAO.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/photo/PhotoDAO.java @@ -6,6 +6,7 @@ import dev.mateuszkowalczyk.ffm.data.database.Dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.List; import java.util.Optional; public class PhotoDAO implements Dao { @@ -29,7 +30,17 @@ public class PhotoDAO implements Dao { } @Override - public void save(Photo photo) { + public List getAll() { + return null; + } + + @Override + public List getAll(boolean refresh) { + return null; + } + + @Override + public void add(Photo photo) { String sql = "INSERT INTO photos(path, fileName, cachedPath) values (?, ?, ?)"; diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java b/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java index d8704dc..251a578 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java @@ -9,6 +9,7 @@ import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; +import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; @@ -39,7 +40,7 @@ public class FaceDetector implements Runnable { private void detectFaces() { CascadeClassifier cascadeClassifier = new CascadeClassifier(ResourceLoader.getInstance().getPath("haarcascade_frontalface_alt2.xml")); - Mat imageMat = imread(this.photo.getPath()); + Mat imageMat = Imgcodecs.imread(this.photo.getPath()); Mat imageGrey = new Mat(); Imgproc.cvtColor(imageMat, imageGrey, Imgproc.COLOR_RGB2GRAY); @@ -57,7 +58,7 @@ public class FaceDetector implements Runnable { FacesCacheService facesCacheService = new FacesCacheService(croppedImage); facesCacheService.getPath(face); facesCacheService.createCachedFace(); - this.faceDAO.save(face); + this.faceDAO.add(face); }); } catch (IOException e) {