You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
2.5 KiB

  1. package com.sothr.imagetools
  2. import com.sothr.imagetools.image.{SimilarImages, ImageFilter, Image}
  3. import scala.collection.mutable
  4. import java.io.File
  5. import grizzled.slf4j.Logging
  6. /**
  7. * Created by drew on 1/26/14.
  8. */
  9. class SequentialEngine extends Engine with Logging {
  10. def getImagesForDirectory(directoryPath:String, recursive:Boolean=false, recursiveDepth:Int=500):List[Image] = {
  11. debug(s"Looking for images in directory: $directoryPath")
  12. val images:mutable.MutableList[Image] = new mutable.MutableList[Image]()
  13. val imageFiles = getAllImageFiles(directoryPath, recursive, recursiveDepth)
  14. val directory:File = new File(directoryPath)
  15. var count = 0
  16. for (file <- imageFiles) {
  17. count += 1
  18. if (count % 25 == 0) info(s"Processed ${count}/${imageFiles.size}")
  19. val image = ImageService.getImage(file)
  20. if (image != null) {
  21. images += image
  22. }
  23. }
  24. images.toList
  25. }
  26. def getSimilarImagesForDirectory(directoryPath:String, recursive:Boolean=false, recursiveDepth:Int=500):List[SimilarImages] = {
  27. debug(s"Looking for similar images in directory: $directoryPath")
  28. val images = getImagesForDirectory(directoryPath, recursive, recursiveDepth)
  29. info(s"Searching ${images.length} images for similarities")
  30. val ignoreSet = new mutable.HashSet[Image]()
  31. val allSimilarImages = new mutable.MutableList[SimilarImages]()
  32. var processedCount = 0
  33. var similarCount = 0
  34. for (rootImage <- images) {
  35. if (!ignoreSet.contains(rootImage)) {
  36. if (processedCount % 25 == 0) {
  37. info(s"Processed ${processedCount}/${images.length - ignoreSet.size} About ${images.length - processedCount} images to go")
  38. }
  39. debug(s"Looking for images similar to: ${rootImage.imagePath}")
  40. ignoreSet += rootImage
  41. val similarImages = new mutable.MutableList[Image]()
  42. for (image <- images) {
  43. if (!ignoreSet.contains(image)) {
  44. if (rootImage.isSimilarTo(image)) {
  45. debug(s"Image: ${image.imagePath} is similar")
  46. similarImages += image
  47. ignoreSet += image
  48. similarCount += 1
  49. }
  50. }
  51. }
  52. if (similarImages.length > 1) {
  53. val similar = new SimilarImages(rootImage, similarImages.toList)
  54. debug(s"Found similar images: ${similar.toString}")
  55. allSimilarImages += similar
  56. }
  57. processedCount += 1
  58. }
  59. }
  60. info(s"Finished processing ${images.size} images. Found $similarCount similar images")
  61. allSimilarImages.toList
  62. }
  63. }