zoukankan      html  css  js  c++  java
  • OpenCV3.0 HDR(高动态范围)示例代码以及用法

    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

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

    代码并不长,如下:

    #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();
    }
    View Code

    我们需要做的有两点

    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原理还没有细看,下次写上。

    --------------------------------- 业精于勤而荒于嬉 行成于思而毁于随 ---------------------------------
  • 相关阅读:
    缓慢画点功能实现的两个方法
    c++编译器对新建字符型数组内部数据的初始化
    在win7下用net命令无法实现对用户的创建(未完成)
    关于sleep函数的一些问题和资料
    C++ 临时笔记
    boost::progress_timer 与 boost::progress_display
    《C++ Primer》 Part IV(ObjectOriented and Generic Programming)
    Linux下常用软件
    《C++STL基础及应用》读书笔记
    boost::asio
  • 原文地址:https://www.cnblogs.com/riddick/p/6892150.html
Copyright © 2011-2022 走看看