| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- //
- // PhotosImageClassifier+Process.swift
- // Demo
- //
- // Created by Groot on 2025/4/27.
- //
- import Foundation
- import Vision
- import Photos
- // MARK: - 图像处理
- extension PhotosImageClassifier {
- /// 处理单个图像,提取分类特征
- /// - Parameter item: 图像项目
- func processImage(with types: [PhotoImageClassifyType], item: inout ImageItem) {
- var imageInfo = ImageItem.ClassifyInfo()
- // 检测屏幕截图
- if types.contains(.screenshot) {
- imageInfo.isScreenshot = item.asset.mediaSubtypes.contains(.photoScreenshot)
- }
- // 检测模糊图像
- if types.contains(.blurry) {
- imageInfo.isBlurry = Self.detectBlurryImages(item: item)
- }
- guard types.contains(.similar) || types.contains(.people), let cgImage = item.thumbnailImage?.cgImage else {
- item.classfiyInfo = imageInfo
- return
- }
-
- // Vision 请求处理
- let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
- // 特征向量提取请求
- let featureDetectionRequest = VNGenerateImageFeaturePrintRequest()
- // 人脸检测请求
- let faceDetectionRequest = VNDetectFaceRectanglesRequest()
- faceDetectionRequest.revision = VNDetectFaceRectanglesRequestRevision3
-
- let requests = [
- types.contains(.similar) ? featureDetectionRequest : nil,
- types.contains(.people) ? faceDetectionRequest : nil
- ].compactMap { $0 }
-
- guard !requests.isEmpty else {
- item.classfiyInfo = imageInfo
- return
- }
- try? requestHandler.perform(requests)
- // 获取相似特征
- if types.contains(.similar), let featureDetectResult = featureDetectionRequest.results?.first as? VNFeaturePrintObservation {
- imageInfo.similarFeature = featureDetectResult
- }
- // 检测人脸
- if types.contains(.people), let faceDetectResult = faceDetectionRequest.results, !faceDetectResult.isEmpty {
- imageInfo.containsPeople = true
- }
- item.classfiyInfo = imageInfo
- }
- }
|