Я использую swift 4.2 и OpenCV 3.1, я устанавливаю Opencv с Pod.
Итак, в моем файле swift есть вызов функции:
image = OpenCVWrapper.hdrImaging(Arrayimages, Arraytimes)
В моем OpencvWrapper.h я вызываю свою функциюкак это:
+(UIImage *) hdrImaging:(NSArray *)images :(NSArray *)times;
, и я делаю эту функцию в моем OpenCVWrapper.mm
+(UIImage *) hdrImaging:(NSArray *)images :(NSArray *)times{
cv::Mat response;
std::vector<cv::Mat> imagesVector;
std::vector<float> timesVector;
for (int i = 0; i < images.count; i++) {
UIImage * imageToMat = images[i];
cv::Mat rgba, matToInsert;
UIImageToMat(imageToMat, rgba); // rgba is RGBA
cv::cvtColor(rgba, matToInsert, cv::COLOR_RGBA2BGR) // matToInsert is 3 channel BGR
imagesVector.push_back(matToInsert);
float time = [times[i] floatValue];
timesVector.push_back(time);
}
cv::Ptr<cv::CalibrateDebevec> calibrate = cv::createCalibrateDebevec();
calibrate->process(imagesVector, response, timesVector);
cv::Mat hdr;
cv::Ptr<cv::MergeDebevec> merge_debevec = cv::createMergeDebevec();
merge_debevec->process(imagesVector, hdr, timesVector, response);
cv::Mat ldr;
cv::Ptr<cv::TonemapDurand> tonemap = cv::createTonemapDurand(2.2f);
tonemap->process(hdr, ldr);
cv::Mat fusion;
cv::Ptr<cv::MergeMertens> merge_mertens = cv::createMergeMertens();
merge_mertens->process(imagesVector, fusion);
response = fusion * 255;
response.convertTo(response, CV_8U);
return MatToUIImage(response);
}
РЕДАКТИРОВАТЬ
Если у вас есть ошибка памяти, такая как:
EXC_RESOURCE RESOURCE_TYPE_MEMORY (предел = 650 МБ, не используется = 0x0) в строке merge_debevec->process(imagesVector, hdr, timesVector, response);
Вы можете понизить качество вашей фотографии с помощью следующего кода в вашей декларации о захвате: captureSession.sessionPreset = .hd1920x1080
или другое разрешение!
РЕДАКТИРОВАТЬ 2
если у вас есть ошибка о недопустимых битах / компонентах:
CustomCamera[5793:1463869] [Unknown process name] CGImageCreate: invalid image bits/component: 8 bits/pixel 96 alpha info = kCGImageAlphaNone
Не забудьте установить свой ответный мат на 8 бит, например: response.convertTo(response, CV_8U);
Почему мое изображение вращается?Я думаю, это функция MatToUIImage, которая вращает мою картинку, но как установить мою картинку с хорошим вращением?
спасибо!