Android平台实现HDR,输入图像为3张,可以根据需要添加输入图像数,相机可以按照不同曝光时间来获取不同亮度的图像传入hdr函数,经过函数融合后得到一张宽动态的图像。
HDR函数:
extern "C"
JNIEXPORT void JNICALL
Java_com_hdr_n_1hdrProcess(JNIEnv *env,
jobject thiz,
jlong img1_obj,
jlong img2_obj,
jlong img3_obj,
jfloat time1,
jfloat time2,
jfloat time3,
jlong hdrImg) {
Mat &mImg1 = *(Mat *) img1_obj;
Mat &mImg2 = *(Mat *) img2_obj;
Mat &mImg3 = *(Mat *) img3_obj;
vector<Mat> images;
vector<float> times;
images.push_back(mImg1);
images.push_back(mImg2);
images.push_back(mImg3);
//曝光时间列表
static const float timesArray[] = { time1,time2,time3};
times.assign(timesArray, timesArray + 3);
//利用中值阈值图(MTB)进行对齐
/*Ptr<AlignMTB> alignMTB = createAlignMTB();
alignMTB->process(images, images);
//恢复相机响应函数
Mat responce;
Ptr<CalibrateDebevec> calibratedebevec = createCalibrateDebevec();
calibratedebevec->process(images, responce, times);*/
//融合
Mat hdrMat;
Ptr<MergeDebevec> mergedebevec = createMergeDebevec();
mergedebevec->process(images, hdrMat, times);
Mat sdr;
float gamma = 1.0f;
Ptr<Tonemap> tonemap = createTonemap(gamma);
tonemap->process(hdrMat, hdrMat);
hdrMat = hdrMat * 255;
hdrMat.convertTo(*(Mat *)hdrImg, CV_8UC3);
//hdrImg = cv::normalize(images, None, 0, 255, cv::NORM_MINMAX, cv::CV_8UC3)
/*Mat fusion;
Ptr<MergeMertens> merge_mertens = createMergeMertens();
merge_mertens->process(images, *(Mat *)hdrImg);*/
}
效果展示:
未经过HDR处理的图像,图像中有过曝的区域和比较黑暗的区域,这种情况下固定的曝光时间比较难拍出理想的图像。

经过HDR处理的图像,过曝的区域已经不存在,黑暗的区域也可以得到亮度补偿。


843

被折叠的 条评论
为什么被折叠?



