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原理還沒有細看,下次寫上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM