PhotosImageClassifier+Process.swift 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // PhotosImageClassifier+Process.swift
  3. // Demo
  4. //
  5. // Created by Groot on 2025/4/27.
  6. //
  7. import Foundation
  8. import Vision
  9. import Photos
  10. // MARK: - 图像处理
  11. extension PhotosImageClassifier {
  12. /// 处理单个图像,提取分类特征
  13. /// - Parameter item: 图像项目
  14. func processImage(with types: [PhotoImageClassifyType], item: inout ImageItem) {
  15. var imageInfo = ImageItem.ClassifyInfo()
  16. // 检测屏幕截图
  17. if types.contains(.screenshot) {
  18. imageInfo.isScreenshot = item.asset.mediaSubtypes.contains(.photoScreenshot)
  19. }
  20. // 检测模糊图像
  21. if types.contains(.blurry) {
  22. imageInfo.isBlurry = Self.detectBlurryImages(item: item)
  23. }
  24. guard types.contains(.similar) || types.contains(.people), let cgImage = item.thumbnailImage?.cgImage else {
  25. item.classfiyInfo = imageInfo
  26. return
  27. }
  28. // Vision 请求处理
  29. let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
  30. // 特征向量提取请求
  31. let featureDetectionRequest = VNGenerateImageFeaturePrintRequest()
  32. // 人脸检测请求
  33. let faceDetectionRequest = VNDetectFaceRectanglesRequest()
  34. faceDetectionRequest.revision = VNDetectFaceRectanglesRequestRevision3
  35. let requests = [
  36. types.contains(.similar) ? featureDetectionRequest : nil,
  37. types.contains(.people) ? faceDetectionRequest : nil
  38. ].compactMap { $0 }
  39. guard !requests.isEmpty else {
  40. item.classfiyInfo = imageInfo
  41. return
  42. }
  43. try? requestHandler.perform(requests)
  44. // 获取相似特征
  45. if types.contains(.similar), let featureDetectResult = featureDetectionRequest.results?.first as? VNFeaturePrintObservation {
  46. imageInfo.similarFeature = featureDetectResult
  47. }
  48. // 检测人脸
  49. if types.contains(.people), let faceDetectResult = faceDetectionRequest.results, !faceDetectResult.isEmpty {
  50. imageInfo.containsPeople = true
  51. }
  52. item.classfiyInfo = imageInfo
  53. }
  54. }