Ios HDR成像opencv 3.1和swift 4.2图像旋转90度
我使用swift 4.2和OpenCV 3.1,我使用Pod安装OpenCV 因此,在我的swift文件中有我的函数调用:Ios HDR成像opencv 3.1和swift 4.2图像旋转90度,ios,swift,opencv,camera,Ios,Swift,Opencv,Camera,我使用swift 4.2和OpenCV 3.1,我使用Pod安装OpenCV 因此,在我的swift文件中有我的函数调用: image = OpenCVWrapper.hdrImaging(Arrayimages, Arraytimes) Arrayimages是UIImage的数组 Arraytimes是浮点64的数组 在我的OpencvWrapper.h中,我这样调用我的函数: +(UIImage *) hdrImaging:(NSArray *)images :(NSArray *)
image = OpenCVWrapper.hdrImaging(Arrayimages, Arraytimes)
- Arrayimages是UIImage的数组
- Arraytimes是浮点64的数组
+(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);
}
别忘了将您的响应Mat设置为8位,比如:response.convertTo(response,CV_8U)代码>
为什么我的照片会旋转?我认为是MatToUIImage函数旋转我的图片,但如何设置我的图片具有良好的旋转
谢谢 第一个错误是内存不足,可能是因为图像太大。至于第二个错误,UIImageToMat
将UIImage
转换为4通道RGBA
图像。因此,您需要将其转换为HDR的BGR
或RGB
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);
}
for(int i=0;i
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);
}