前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV3.0 HDR(高动态范围)示例代码以及用法

OpenCV3.0 HDR(高动态范围)示例代码以及用法

作者头像
一棹烟波
发布2018-01-12 16:46:07
2.2K1
发布2018-01-12 16:46:07
举报
文章被收录于专栏:一棹烟波

OpenCV 3.0以及以后版本集成了HDR算法,样例代码的路径为: .\sources\samples\cpp\tutorial_code\photo\hdr_imaging.cpp。

实现算法的参考文献为《Recovering high-dynamic range radiance maps from photographs》,作者主页:http://www.pauldebevec.com/Research/HDR/

作者主页上有实验的测试图片序列,可以下载下来,配合样例代码使用。OpenCV官方文档也有详细的介绍,链接在此:http://docs.opencv.org/3.0-beta/doc/tutorials/photo/hdr_imaging/hdr_imaging.html

下面简要说一下代码的使用,并展示一下效果:

代码并不长,如下:

代码语言:javascript
复制
#include <opencv2/photo.hpp>
#include "opencv2/imgcodecs.hpp"
#include <opencv2/highgui.hpp>
#include <vector>
#include <iostream>
#include <fstream>

using namespace cv;
using namespace std;

void loadExposureSeq(String, vector<Mat>&, vector<float>&);

int main(int, char**argv)
{
    argv[1]="./SourceImages";
    vector<Mat> images;
    vector<float> times;
    loadExposureSeq(argv[1], images, times);

    Mat response;
    Ptr<CalibrateDebevec> calibrate = createCalibrateDebevec();
    calibrate->process(images, response, times);

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

    Mat ldr;
    Ptr<TonemapDurand> tonemap = createTonemapDurand(2.2f);
    tonemap->process(hdr, ldr);

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

    imwrite("fusion.png", fusion * 255);
    imwrite("ldr.png", ldr * 255);
    imwrite("hdr.hdr", hdr);

    return 0;
}

void loadExposureSeq(String path, vector<Mat>& images, vector<float>& times)
{
    path = path + std::string("/");
    ifstream list_file((path + "list.txt").c_str());
    string name;
    float val;
    while(list_file >> name >> val) {
        Mat img = imread(path + name);
        images.push_back(img);
        times.push_back(1/val);
    }
    list_file.close();
}

我们需要做的有两点

1.设置好测试图片序列的路径。

2.简单修改一下list文件中的内容。

下载下来的文件夹里的内容如下图

  既然有README.txt,当然先看README了;另外可以看到一共有16幅同一个场景,不同曝光程度下的测试图片;还有个memorial.hdr_image_list.txt 文本文件,这个文件其实就是代码中的list文件,自己把名字改为list就可以,里面列出了图片序列的图片名称、快门时间等(就是代码中的times);还有一副memorial.hdr文件,这个是assembled radiance maps,需要用作者主页上提供的专门软件工具打开,暂且不管。

  memorial.hdr_image_list.txt 这个文件里面的内容需要稍微修改一下,原内容如下:

根据代码中读数据的顺序,修改为如下,只保留图像名称和快门时间,图像格式改为.png:

只要路径设置好,不习惯用命令行的,在代码里可以设置为argv[1]=“./Memorial_SourceImages”。直接运行,得到结果fusion.png,LDR.png如下,可以明显看到过曝区域和过暗区域都被很好的补偿,细节更加丰富:

fusion.png:

LDR.png

另外还有一个hdr.hdr文件,和前面说的一样,需要作者的工具软件打开。

基本就这样,具体的HDR原理还没有细看,下次写上。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档