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(); }
我們需要做的有兩點
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原理還沒有細看,下次寫上。