Я делаю приложение, которое использует OpenCV для анализа вывода с камеры iPhone и отображения результата на экране.Я знаю, что камера iPhone читает в альбомной ориентации, поэтому необходимо конвертировать перед отображением результатов на экране.Я подумал, что мне просто нужно масштабировать, поворачивать -90 градусов, а затем переводить (tx = ширина изображения), но это не работает.В сети я нашел пример кода, который приведен ниже, но он не работает ни для какой ориентации, кроме оставленного ландшафта.
Как правильно преобразовать вид из камеры в вид пользователя?
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
//lock the pixel buffer
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );
//declare variables
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
//a bunch of OpenCV stuff that finds features in an image and
// returns a cameraRect
//translate to view coordinates
float scaleX = 320 / (float)bufferHeight;
float scaleY = 460 / (float)bufferWidth;
deviceRect.origin.x = 320 - ((cameraRect.y + cameraRect.height) * scaleX);
deviceRect.origin.y = (cameraRect.x * scaleY);
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}
//elsewhere
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
Редактировать: Я не имею в виду, что прямоугольник, отображаемый на экране, не соответствует сопоставленномуобъект, который виден в слое предварительного просмотра.Я распознаю лица, и в зависимости от ориентации телефона устройствоRect, нарисованное на экране, немного или слишком сильно отличается от лица, находящегося в слое предварительного просмотра.В левом ландшафте deviceRect идеально соответствует видимому лицу.