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

时间:2022-09-12 15:34:32

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[]="./SourceImages";
vector<Mat> images;
vector<float> times;
loadExposureSeq(argv[], 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 * );
imwrite("ldr.png", ldr * );
imwrite("hdr.hdr", hdr); return ;
} 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(/val);
}
list_file.close();
}

我们需要做的有两点

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

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

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

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

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

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

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

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

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

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

fusion.png:

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

LDR.png

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

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

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

OpenCV3.0 HDR(高动态范围)示例代码以及用法的更多相关文章

  1. C&num; 4&period;0四大新特性代码示例与解读

    摘要:今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性. 之前的文章中,我们曾介绍过C#的历史及C# 4.0新增特性,包括:dynamic. 命名和可选参数.动态导入以及协变和逆变等. ...

  2. SkylineGlobe TerraExplorer Pro 7&period;0 Web 控件版 第一行示例代码

    SkylineGlobe TerraExplorer Pro 7.0 是原生的64位应用程序,在Web端用插件方式开发的第一行示例代码如下: 常规代码,需要IE64位: <!DOCTYPE ht ...

  3. iPhone调用ffmpeg2&period;0&period;2解码h264视频的示例代码

    iPhone调用ffmpeg2.0.2解码h264视频的示例代码 h264demo.zip 关于怎么在MAC下编译iOS下的ffmpeg请看 编译最新ffmpeg2.0.1(ffmpeg2.0.2)到 ...

  4. Ubuntu 安装OpenCV3&period;0&period;0

    Ubuntu安装OpenCV3.0.0 为了看看opencv3.0的HDR效果,尝试安装opencv3.0到ubuntu12.04上面,安装了好几次终于成功了. 参考博客: http://www.sa ...

  5. 基于opencv3&period;0下的人脸检测和检测部分的高斯模糊处理

    如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...

  6. Atitit opencv3&period;0 &&num;160&semi;3&period;1 3&period;2 新特性attilax总结

    Atitit opencv3.0  3.1 3.2 新特性attilax总结 1. 3.0OpenCV 3 的改动在哪?1 1.1. 模块构成该看哪些模块?2 2. 3.1新特性 2015-12-21 ...

  7. 50&period;AngularJs directive详解及示例代码

    转自:https://www.cnblogs.com/best/tag/Angular/ 本教程使用AngularJs版本:1.5.3 AngularJs GitHub: https://github ...

  8. Arduino - 串口操作函数与示例代码大全

    来源:https://blog.csdn.net/iracer/article/details/50334041 Arduino - 串口操作函数与示例代码大全 本文总结了Arduino常用串口操作函 ...

  9. BPF CO-RE 示例代码解析

    BPF CO-RE 示例代码解析 在BPF的可移植性和CO-RE一文的末尾提到了一个名为runqslower的工具,该工具用于展示在CPU run队列中停留的时间大于某一值的任务.现在以该工具来展示如 ...

随机推荐

  1. discuz不能发表投票、附件上传等

    如何开启和发表投票主题 本教程主要讲述如何开启和发表投票的帖子.具体的操作如下: 1.论坛后台 => 用户 => 用户组 => 详情 => 特殊主题 => 允许发起投票设 ...

  2. Mysql-简单安装

    centos上安装msqyl 通过如下命令来查看我们的操作系统上是否已经安装了mysql数据库 [root@CentOS6.5 ~]# rpm -qa | grep mysql #这个命令就会查看该操 ...

  3. Go语言&lowbar;时间篇

    Go的time包是标准库中的包之一 不用说,几乎是开发必须用到的包之一.time包的说明文档在: http://golang.org/pkg/time/ 先注意下Overview中的一句话: The ...

  4. The AndroidManifest&period;xml File

    manifest (船运的)载货清单 http://www.android-doc.com/guide/topics/manifest/manifest-intro.html Every applic ...

  5. A Tour of Go Function closures

    Go functions may be closures. A closure is a function value that references variables from outside i ...

  6. 【HDOJ】2386 Dart Challenge

    纯粹母函数+滚动数组,水之. /* 2386 */ #include <iostream> #include <string> #include <map> #in ...

  7. ubuntu12&period;04 安装CAJViewer-ubuntu&lpar;待解决&rpar;

    ubuntu12.04测试通过 1.sudo apt-get install wine 2.unzip CAJViewer-ubuntu12.04版.zip 3.wine CAJVieweru.exe

  8. JS动态改变select选择变更option的index值

    document.getElementById("louyuming").options[0].selected=true; function jsSelectIsExitItem ...

  9. Java 序列化工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.misc.BASE64Decoder; import sun.m ...

  10. CentOS 7&period;4搭建Kubernetes 1&period;8&period;5集群

    环境介绍 角色 操作系统 IP 主机名 Docker版本 master,node CentOS 7.4 192.168.0.210 node210 17.11.0-ce node CentOS 7.4 ...