Я пытался применить фильтры к определенной части лица, обнаруженной на изображении.
Чтобы применить фильтры ко всему изображению, я использовал пример кода от apple: https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/avcamfilter_applying_filters_to_a_capture_stream
Если я просто добавлю одну строку обнаружения лиц через CIDetector, к методу, который отправляет CVPixelBuffers в класс FilterRenderer, а затем в MTKView для рендеринга отфильтрованного буфера, производительность сильно падает.
Цепочка выглядит следующим образом: CMSampleBuffer> CVImageBuffer> CIImage> Определить лица> Применить фильтр только к лицу > Получить CVPixelBuffer обратно из FilterRenderer> Отправить его в MTKView
"Детектирование лиц"часть слишком медленная, я не могу себе представить Если я сделаю еще какую-то обработку (определю положение глаз и рта), насколько медленной она будет.
Вы можете увидеть пример реализации здесь:https://github.com/nipun0505/FaceDetectionMetal
func processVideo(sampleBuffer: CMSampleBuffer) {
if !renderingEnabled {
return
}
guard let videoPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),
let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer) else {
return
}
var finalVideoPixelBuffer = videoPixelBuffer
if let filter = videoFilter {
if !filter.isPrepared {
filter.prepare(with: formatDescription, outputRetainedBufferCountHint: 3)
}
//Detect faces
if let faceDetector = faceDetector{
let features = faceDetector.features(in: CIImage(cvImageBuffer: videoPixelBuffer))
}
// Send the pixel buffer through the filter
guard let filteredBuffer = filter.render(pixelBuffer: finalVideoPixelBuffer) else {
print("Unable to filter video buffer")
return
}
finalVideoPixelBuffer = filteredBuffer
}
previewView.pixelBuffer = finalVideoPixelBuffer
}
Я что-то здесь не так делаю?Я попробовал то же самое без MTKView, где я просто определяю лица и накладываю некоторые изображения на AVCaptureVideoPreviewLayer
, что прошло очень гладко.Не уверен, что замедляет мою работу.