基于OpenCV的多图像采集HDR融合

    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处理的图像,过曝的区域已经不存在,黑暗的区域也可以得到亮度补偿。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值