Обработка OpenCV HDR выдает плохой вывод на iOS

Я пытаюсь создать HDR-изображение из 7 изображений, снятых с разными значениями экспозиции на iOS. Я использовал Cocoapod OpenCV и следовал этот GitHub репозиторий для реализации обработки HDR. У меня работает фьюжн-изображение, и у него приличный вывод изображения, однако HDR-версия выдает плохой вывод. Это выглядит как отрицательная версия того, что должно быть. Увидеть ниже:

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

Я пытался возиться с моим кодом, чтобы создать 8-битную и 32-битную версии этого образа, так как это то, что я читал по некоторым другим вопросам.

Я также включил свой файл HDR.cpp, который выполняет слияние с HDR:

cv::Mat mergeToHDR (vector<Mat>& images, vector<float>& times)
{
imgs = images;
Mat response;
Ptr<CalibrateDebevec> calibrate = createCalibrateDebevec();
calibrate->process(images, response, times);// Ptr<CalibrateRobertson> calibrate = createCalibrateRobertson();
// calibrate->process(images, response, times);

// create HDR
Mat hdr;
Ptr<MergeDebevec> merge_debevec = createMergeDebevec();
merge_debevec->process(images, hdr, times, response);

// create fusion
// Mat fusion;
// Ptr<MergeMertens> merge_mertens = createMergeMertens();
// merge_mertens->process(images, fusion);

// fusion
// Mat fusion8bit;
// fusion = fusion * 255;
// fusion.convertTo(fusion8bit, CV_8U);
// return fusion8bit;

// hdr
Mat hdr8bit;
hdr = hdr * 255;
hdr.convertTo(hdr8bit, CV_8U);
return hdr8bit;
}

Дайте мне знать, если вам нужно больше моего кода.

Вот мой код для создания изображений Mat:

-(cv::Mat)CVMat
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;

cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,
cols,
rows,
8,
cvMat.step[0],                                                                      colorSpace,
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault);

CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);

return cvMat;
}

- (cv::Mat)CVMat3
{
cv::Mat result = [self CVMat];
cv::cvtColor(result , result , CV_RGBA2RGB);
return result;
}

-(cv::Mat)CVGrayscaleMat
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;

cv::Mat cvMat(rows, cols, CV_8UC1); // 8 bits per component, 1 channels

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to data
cols,                       // Width of bitmap
rows,                       // Height of bitmap
8,                          // Bits per component
cvMat.step[0],              // Bytes per row
colorSpace,                 // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags

CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);

return cvMat;
}

+ (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat
{
return [[UIImage alloc] initWithCVMat:cvMat];
}

- (id)initWithCVMat:(const cv::Mat&)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];
CGColorSpaceRef colorSpace;

size_t elemSize = cvMat.elemSize();
size_t elemSize1 = cvMat.elemSize1();

size_t channelCount = elemSize/elemSize1;
size_t bitsPerChannel = 8 * elemSize1;
size_t bitsPerPixel = bitsPerChannel * channelCount;

if (channelCount == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}

// Tell CGIImageRef different bitmap info if handed 32-bit
uint32_t bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;

if (bitsPerChannel == 32 ){
bitmapInfo = kCGImageAlphaNoneSkipLast | kCGBitmapFloatComponents | kCGBitmapByteOrder32Little;
}

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols,                                 //width
cvMat.rows,                                 //height
bitsPerChannel,                             //bits per component
bitsPerPixel,                               //bits per pixel
cvMat.step[0],                              //bytesPerRow
colorSpace,                                 //colorspace
bitmapInfo,                                 // bitmap info
provider,                                   //CGDataProviderRef
NULL,                                       //decode
false,                                      //should interpolate
kCGRenderingIntentDefault                   //intent
);

// Getting UIImage from CGImage
self = [self initWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);

return self;
}

0

Решение

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

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

Других решений пока нет …

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