First, convert CMSampleBuffer To UIImage.
extension CMSampleBuffer {
func asUIImage()-> UIImage? {
guard let imageBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(self) else {
return nil
}
let ciImage = CIImage(cvPixelBuffer: imageBuffer)
return convertToUiImage(ciImage: ciImage)
}
func convertToUiImage(ciImage: CIImage) -> UIImage? {
let context = CIContext(options: nil)
context.clearCaches()
guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else {
return nil
}
let image = UIImage(cgImage: cgImage)
return image
}
}
Then you can easily convert UIImage to Mat and return UIImage with/without doing something.
OpenCVWrapper.h file
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface OpenCVWrapper : NSObject
+ (UIImage *) someOperation : (UIImage *) uiImage;
@end
NS_ASSUME_NONNULL_END
OpenCVWrapper.mm file
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
#import <opencv2/core/types_c.h>
#import "OpenCVWrapper.h"
#import <opencv2/Mat.h>
#include <iostream>
#include <random>
#include <vector>
#include <chrono>
#include <stdint.h>
@implementation OpenCVWrapper
+ (UIImage *) someOperation : (UIImage *) uiImage {
cv::Mat sourceImage;
UIImageToMat(uiImage, sourceImage);
// Do whatever you need
return MatToUIImage(sourceImage);
}
@end