Преобразование Mat в UIImage из CvVideoCamera

Я храню кадры в режиме реального времени от CvVideoCamera с использованием - (void)processImage:(Mat&)image метод делегата.

После сохранения изображений я усредняю ​​их все в одно изображение, чтобы воспроизвести снимок с большой выдержкой, используя этот код:

Mat merge(Vector<Mat> frames, double alpha)
{
Mat firstFrame = frames.front();
Mat exposed = firstFrame * alpha;

for (int i = 1; i < frames.size(); i++) {

Mat frame = frames[i];
exposed += frame * alpha;
}
return exposed;
}

После получения усредненного изображения я преобразовываю его обратно в UIImage, но изображение, которое я получаю, находится в странном цветовом пространстве, кто-нибудь знает, как я могу это исправить?

Код конверсии:

+ (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
if ( cvMat.elemSize() == 1 ) {
colorSpace = CGColorSpaceCreateDeviceGray();
}
else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData( (__bridge CFDataRef)data );
CGImageRef imageRef = CGImageCreate( cvMat.cols, cvMat.rows, 8, 8 * cvMat.elemSize(), cvMat.step[0], colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault );
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease( imageRef );
CGDataProviderRelease( provider );
CGColorSpaceRelease( colorSpace );
return finalImage;
}

Вот пример (примечание: самолет посередине, потому что я записываю с монитора компьютера)
введите описание изображения здесь

введите описание изображения здесь

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]