OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
仿生视网膜模块介绍

Retina 类概述

注意
不要忘记视网膜模型包含在以下命名空间中:C++ 为 cv::bioinspired,Python 为 cv.bioinspired

简介

此类提供了 Gipsa/Listic 实验室人类视网膜模型的主要控制。这是一个非可分时空滤波器,模拟了两个主要的视网膜信息通道:

  • 用于精细彩色视觉的中央凹视觉:小细胞通路 (parvocellular pathway)。
  • 用于敏感瞬态信号检测(运动和事件)的外周视觉:大细胞通路 (magnocellular pathway)。

该模型起源于 Jeanny Herault 的工作 [141]。它参与了 Alexandre Benoit 的博士论文及其当前研究 [26], [260]。他目前在 OpenCV 中维护此模块。该模块还包括 Jeanny 的其他博士生(如 [70])的工作,以及 Jeanny 书中描述的 Barthelemy Durette 的对数极坐标变换。

更具体地说,以下是此处实现的视网膜特性的概述:

  • 关于亮度和细节增强:
    • 局部对数亮度压缩(在光感受器入口处和神经节细胞输出处)。
    • 外丛状层 (OPL) 水平的光谱白化(光感受器和水平细胞的时空滤波)。

前一种行为压缩了亮度范围,并允许在同一张图片上以丰富的细节同时显示极亮和极暗的区域。后一种行为降低了低频亮度能量(平均亮度)并增强了中频(细节)。结合使用时,视网膜可以在高级分析之前很好地预处理视觉信号。这些属性在视频中非常有趣,光线变化被大幅减少,并具有良好的时间一致性。

  • 关于噪声过滤:
    • 高频空间和时间噪声被过滤掉。Parvo 和 Magno 通路的输出都从中受益。噪声降低受益于非可分时空滤波。
    • 在 Parvo 输出端,静态纹理得到增强,噪声被过滤(在视频中,时间噪声被很好地移除)。然而,与人类行为类似,移动的纹理会被平滑。因此,只有当视网膜跟踪移动物体并从其视角保持静态时,物体细节才能得到增强。
    • 在 Magno 输出端,它可以更清晰地检测事件(运动、变化),即使在困难的光照条件下也能减少噪声误差。作为折中,Magno 输出是低空间频率信号,允许可靠地提取事件斑点(为此请查看 TransientAreasSegmentationModule 模块)。

使用

该模型可用作预处理阶段,目的是:

  • 执行具有增强信噪比和增强细节的纹理分析,这些细节对输入图像亮度范围具有鲁棒性(通过使用提供的 getParvo 方法查看小细胞视网膜通道输出)。
  • 执行运动分析,同样利用上述特性(通过使用提供的 getMagno 方法查看大细胞视网膜通道输出)。
  • 使用单通道或双通道进行通用的图像/视频序列描述。在词袋 (Bag of Words) 方法中使用视网膜的示例见 [260]
注意
  • 为了方便在计算机视觉应用中使用,两个视网膜通道被应用于所有输入图像。这并不遵循真实的视网膜拓扑,但从图像处理的角度来看是实用的。如果需要视网膜映射(中央凹和旁中央凹视觉),请使用类中提供的对数采样功能。
  • 请随时通过扩展视网膜描述、代码、使用案例来提供补充说明和演示。

使用案例插图

使用小细胞通路(Parvo 视网膜输出)进行图像预处理

作为初步展示,让我们从一个视觉示例开始。我们建议在具有背光问题的低质量彩色 JPEG 图像上应用该滤波器。这是考虑的输入... “嗯,我的眼睛能看到的比相机捕捉到的多得多...”

一张具有背光问题的低质量彩色 JPEG 图像。

下方是使用默认参数应用于整个图像的视网膜中央凹模型。无论局部亮度如何,细节都会得到加强。此处轮廓被强烈加强,但噪声水平保持较低。在这种配置下,光晕效果是故意可见的。请参阅下文的参数讨论,并将 horizontalCellsGain 增加到接近 1 以消除它们。

使用默认参数应用于整个图像的视网膜中央凹模型。在此轮廓被加强,亮度得到校正,且在此配置下光晕效果故意可见,增加 horizontalCellsGain 至接近 1 可消除它们。

下方是应用于整个图像的第二个视网膜中央凹模型输出,其参数设置专注于自然感。“嘿,我现在认出我的猫了,它在日暮时分望着远山!”。在此配置下,轮廓被加强,亮度得到校正,但避免了光晕。背光效果得到修正,高亮细节仍被保留。因此,即使在低质量的 JPEG 图像上,如果还保留了一些亮度信息,视网膜也能够重建合适的视觉信号。这种配置对于将高动态范围 (HDR) 图像压缩为 8 位图像也非常有用,如 [26] 和下文讨论的演示代码所述。如页面末尾所示,相对于默认值的参数更改为:

  • horizontalCellsGain=0.3
  • photoreceptorsLocalAdaptationSensitivity=ganglioncellsSensitivity=0.89。
使用“自然感”参数应用于整个图像的视网膜中央凹模型。在此轮廓被加强但避免了光晕效果,horizontalCellsGain 为 0.3 且 photoreceptorsLocalAdaptationSensitivity=ganglioncellsSensitivity=0.89。

正如在初步演示中观察到的,视网膜可以设置各种参数。默认情况下(如上图所示),视网膜强烈降低平均亮度能量并加强视觉场景的所有细节。亮度能量和光晕效果可以调节(从夸张到抵消,如两个示例所示)。为了使用您自己的参数,您可以至少执行一次 write(String fs) 方法,它将生成一个带有所有默认参数的 XML 文件。然后,根据您的需要进行调整,并随时使用 setup(String fs) 方法重新加载。这些方法会更新下文描述的 Retina::RetinaParameters 成员结构。XML 参数文件样本显示在页面末尾。

使用小细胞通路(Parvo 视网膜输出)的色调映射处理能力

该视网膜模型自然地处理亮度范围压缩。局部适应阶段和光谱白化有助于亮度范围压缩。此外,经常破坏色调映射图像的高频噪声在处理的早期阶段就被移除,从而产生自然的感知和无噪声的色调映射。

与上面显示的演示相比,设置差异如下:(更多详情请参见 bioinspired/samples/OpenEXRimages_HDR_Retina_toneMapping.cpp)

  • 加载 HDR 图像(OpenCV 支持 OpenEXR 格式)并剪切约 5% 和 95% 的直方图边界,以消除类似椒盐噪声的像素损坏。
  • 应用视网膜默认参数并进行以下更改(本节插图使用的通用参数):
    • retina Hcells gain = 0.4(与默认配置相比的主要变化:它强烈减少了光晕效果)
    • localAdaptation_photoreceptors=0.99(略高于默认值,以增强局部适应)
    • localAdaptation_Gcells=0.95(也略高于默认值,用于增强局部适应)
  • 使用 getParvo() 方法获取 Parvo 输出。

查看本页末尾,了解如何在配置文件中指定这些参数。

以下两幅插图显示了此类配置对 2 个图像样本的效果。

使用通用参数的 HDR 图像色调映射示例。原始图像来自 http://openexr.com/ 样本 (openexr-images-1.7.0/ScanLines/CandleGlass.exr)
使用相同通用参数的 HDR 图像色调映射示例。原始图像来自 http://www.pauldebevec.com/Research/HDR/memorial.exr)

使用大细胞通路(Magno 视网膜输出)进行运动和事件检测

使用视网膜的 magno 输出(使用 getMagno() 方法)可以轻松检测时空事件。其能量随运动速度线性增加。bioinspired 模块中还提供了 TransientAreasSegmentationModule 类,提出了一种事件斑点检测器。基本思想是检测相对于邻域的局部能量下降,然后应用阈值。这一过程已在 TRECVid 挑战赛 [260] 的视频词袋描述中使用,并且仅允许描述瞬态区域的视频帧。

我们在此展示了一些取自 http://changedetection.net/ 的 RGB 和热成像视频示例的视网膜输出插图。

注意
在这里,我们使用默认的视网膜设置,它在强边缘周围产生光晕。请注意,时间常数使得在运动物体上可以看到时间效应(对于视频的静态图像说明很有用)。可以通过增加视网膜 Hcells 增益来消除光晕,而通过减小时间常数值可以减少时间效应。还要考虑到,两个视网膜输出的范围被缩放为 [0:255],因此当没有物体运动时,magno 输出在绘制时可能会显示很多“噪声”。但是,如果您使用 getMagnoRAW 获取原始数据,其能量仍保持在较低水平。
RGB 图像序列上的视网膜处理:来自 http://changedetection.net/ (baseline/PETS2006) 的示例。Parvo 强化静态信号,但平滑了移动的行人,因为从它的视角看他们不是静态的。Magno 通路突出显示移动的行人,观察顶部那个人(部分在暗玻璃后面)的能量映射。
灰度级图像序列上的视网膜处理:来自 http://changedetection.net/ (thermal/park) 的示例。在这样的灰度图像上,Parvo 通路加强对比度,而 Magno 对移动的行人反应强烈。

文献

更多信息请参考以下论文:

  • 模型描述:[26]
  • 词袋方法中的模型应用:[260]
  • 请参阅 Jeanny Herault 的参考著作,您可以阅读他的书:[141]

此视网膜滤波器代码包含了博士/研究同事的研究贡献,作者重新编写了相关代码:

  • 查看 retinacolor.hpp 模块以了解 Brice Chaix de Lavarene 的博士彩色镶嵌/去镶嵌及其参考论文:[70]
  • 查看 imagelogpolprojection.hpp 以了解视网膜空间对数采样,它起源于 Barthelemy Durette 与 Jeanny Herault 的博士研究。还提出了 Retina / V1 皮层投影,它源于 Jeanny 的讨论。更多信息见上述 Jeanny Herault 的书。
  • Meylan 等人在 HDR 色调映射方面的工作,作为模型中的一个特定方法实现:[197]

视网膜编程接口

所提出的类允许使用 Gipsa(初步工作)/ Listic 实验室视网膜模型。它可以应用于静止图像、图像序列和视频序列。

这是 Retina 接口的概述,使用 Retina::create() 函数分配一个实例(C++、Java、Python):

namespace cv{namespace bioinspired{
class Retina : public Algorithm
{
public:
// 参数设置实例
struct RetinaParameters; // 此类稍后详述
// 输入帧处理的主要方法(全能方法,也可执行高动态范围色调映射)
void run (InputArray inputImage);
// 仅旨在校正亮度的特定方法(更快速的高动态范围色调映射)
void applyFastToneMapping(InputArray inputImage, OutputArray outputToneMappedImage)
// 输出缓冲区检索方法
// -> 具有亮度和噪声校正的中央凹彩色视觉细节通道
void getParvo (OutputArray retinaOutput_parvo);
void getParvoRAW (OutputArray retinaOutput_parvo);// 检索原始输出缓冲区而不进行任何归一化
const Mat getParvoRAW () const;// 检索原始输出缓冲区而不进行任何归一化
// -> 外周单色运动和事件(瞬态信息)通道
void getMagno (OutputArray retinaOutput_magno);
void getMagnoRAW (OutputArray retinaOutput_magno); // 检索原始输出缓冲区而不进行任何归一化
const Mat getMagnoRAW () const;// 检索原始输出缓冲区而不进行任何归一化
// 重置视网膜缓冲区... 相当于闭眼几秒钟
void clearBuffers ();
// 检索输入和输出缓冲区大小
// 设置方法,具有特定参数规格或全局 xml 配置文件加载/写入
void setup (String retinaParameterFile="", const bool applyDefaultSetupOnFailure=true);
void setup (FileStorage &fs, const bool applyDefaultSetupOnFailure=true);
void setup (RetinaParameters newParameters);
struct Retina::RetinaParameters getParameters ();
const String printSetup ();
virtual void write (String fs) const;
virtual void write (FileStorage &fs) const;
void setupOPLandIPLParvoChannel (const bool colorMode=true, const bool normaliseOutput=true, const float photoreceptorsLocalAdaptationSensitivity=0.7, const float photoreceptorsTemporalConstant=0.5, const float photoreceptorsSpatialConstant=0.53, const float horizontalCellsGain=0, const float HcellsTemporalConstant=1, const float HcellsSpatialConstant=7, const float ganglionCellsSensitivity=0.7);
void setupIPLMagnoChannel (const bool normaliseOutput=true, const float parasolCells_beta=0, const float parasolCells_tau=0, const float parasolCells_k=7, const float amacrinCellsTemporalCutFrequency=1.2, const float V0CompressionParameter=0.95, const float localAdaptintegration_tau=0, const float localAdaptintegration_k=7);
void setColorSaturation (const bool saturateColors=true, const float colorSaturationValue=4.0);
void activateMovingContoursProcessing (const bool activate);
void activateContoursProcessing (const bool activate);
};
// 分配器
cv::Ptr<Retina> Retina::create (Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod=RETINA_COLOR_BAYER, const bool useRetinaLogSampling=false, const double reductionFactor=1.0, const double samplingStrength=10.0);
}} // cv 和 bioinspired 命名空间结束
virtual void clearBuffers()=0
清除所有视网膜缓冲区。
virtual Size getOutputSize()=0
检索视网膜输出缓冲区大小,如果使用了空间对数变换,则可能与输入不同...
virtual void applyFastToneMapping(InputArray inputImage, OutputArray outputToneMappedImage)=0
处理图像的方法,旨在校正其亮度、修正背光问题等...
virtual void activateContoursProcessing(const bool activate)=0
激活/停用小细胞通路处理(轮廓信息提取)...
virtual void setup(String retinaParameterFile="", const bool applyDefaultSetupOnFailure=true)=0
尝试打开 XML 视网膜参数文件以调整当前视网膜实例设置。
virtual Mat getMagnoRAW() const =0
virtual void getParvo(OutputArray retinaOutput_parvo)=0
视网膜细节通道的访问器(模拟中央凹视觉)。
virtual Size getInputSize()=0
检索视网膜输入缓冲区大小。
virtual void write(String fs) const =0
写入 xml/yml 格式的参数信息。
virtual String printSetup()=0
输出显示所用参数设置的字符串。
virtual void run(InputArray inputImage)=0
允许将视网膜应用于输入图像的方法。
virtual void setColorSaturation(const bool saturateColors=true, const float colorSaturationValue=4.0f)=0
激活颜色饱和度作为彩色去复用过程的最后一步 -> 这种饱和度是...
static Ptr< Retina > create(Size inputSize)
virtual void setupOPLandIPLParvoChannel(const bool colorMode=true, const bool normaliseOutput=true, const float photoreceptorsLocalAdaptationSensitivity=0.7f, const float photoreceptorsTemporalConstant=0.5f, const float photoreceptorsSpatialConstant=0.53f, const float horizontalCellsGain=0.f, const float HcellsTemporalConstant=1.f, const float HcellsSpatialConstant=7.f, const float ganglionCellsSensitivity=0.7f)=0
设置 OPL 和 IPL parvo 通路(见生物模型)
virtual void setupIPLMagnoChannel(const bool normaliseOutput=true, const float parasolCells_beta=0.f, const float parasolCells_tau=0.f, const float parasolCells_k=7.f, const float amacrinCellsTemporalCutFrequency=1.2f, const float V0CompressionParameter=0.95f, const float localAdaptintegration_tau=0.f, const float localAdaptintegration_k=7.f)=0
设置内丛状层 (IPL) 大细胞通路 (magnocellular channel) 的参数值。
virtual void getMagno(OutputArray retinaOutput_magno)=0
视网膜运动通道的访问器(模拟外周视觉)。
virtual RetinaParameters getParameters()=0
virtual Mat getParvoRAW() const =0
virtual void activateMovingContoursProcessing(const bool activate)=0
激活/停用大细胞通路处理(运动信息提取)...
@ RETINA_COLOR_BAYER
标准拜尔采样
定义 retina.hpp:86
std::string String
定义 cvstd.hpp:151
Size2i Size
定义 types.hpp:370
const _InputArray & InputArray
定义 mat.hpp:454
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
const _OutputArray & OutputArray
定义 mat.hpp:456
定义 core.hpp:107

设置 Retina

管理配置文件

使用 Retina::writeRetina::load 方法时,您可以创建或加载存储 Retina 配置的 XML 文件。

默认配置如下所示。

<?xml version="1.0"?>
<opencv_storage>
<OPLandIPLparvo>
<colorMode>1</colorMode>
<normaliseOutput>1</normaliseOutput>
<photoreceptorsLocalAdaptationSensitivity>7.5e-01</photoreceptorsLocalAdaptationSensitivity>
<photoreceptorsTemporalConstant>9.0e-01</photoreceptorsTemporalConstant>
<photoreceptorsSpatialConstant>5.7e-01</photoreceptorsSpatialConstant>
<horizontalCellsGain>0.01</horizontalCellsGain>
<hcellsTemporalConstant>0.5</hcellsTemporalConstant>
<hcellsSpatialConstant>7.</hcellsSpatialConstant>
<ganglionCellsSensitivity>7.5e-01</ganglionCellsSensitivity></OPLandIPLparvo>
<IPLmagno>
<normaliseOutput>1</normaliseOutput>
<parasolCells_beta>0.</parasolCells_beta>
<parasolCells_tau>0.</parasolCells_tau>
<parasolCells_k>7.</parasolCells_k>
<amacrinCellsTemporalCutFrequency>2.0e+00</amacrinCellsTemporalCutFrequency>
<V0CompressionParameter>9.5e-01</V0CompressionParameter>
<localAdaptintegration_tau>0.</localAdaptintegration_tau>
<localAdaptintegration_k>7.</localAdaptintegration_k></IPLmagno>
</opencv_storage>

以下是关于所有这些参数的一些说明,您可以根据需要调整它们以放大或减弱视网膜效果(轮廓强化、光晕效果、运动灵敏度、运动模糊等)。

基本参数

最简单的参数如下:

  • colorMode:让视网膜处理颜色信息(若为 1)或灰度图像(若为 0)。在后一种情况下,仅处理输入的第一个通道。
  • normaliseOutput:每个通道都有此参数:如果值设置为 1,则考虑的通道输出将重新缩放在 0 到 255 之间。在这种情况下,请注意大细胞通路输出级别(运动/瞬态通道检测)。残留噪声也将被重新缩放!

注意:使用彩色需要颜色通道复用/去复用,这同时也需要更多的处理。使用灰度级可以预期更快的处理速度:所有视网膜处理过程每像素仅需约 30 次乘法,且最近已针对多核架构进行了并行化。

光感受器参数

以下参数作用于视网膜的入口点——光感受器——并对后续所有过程产生影响。这些传感器是低通时空滤波器,可平滑时间和空间数据,并根据局部亮度调整其灵敏度,从而有助于改善细节提取和抵消高频噪声。

  • photoreceptorsLocalAdaptationSensitivity 介于 0 和 1 之间。接近 1 的值允许在光感受器级别产生高亮度对数压缩效果。接近 0 的值提供更线性的灵敏度。单独增加它可能会使 Parvo(细节通道) 输出图像过度曝光(发白)。如果配合 ganglionCellsSensitivity 进行调整,图像无论局部亮度如何都能具有非常高的对比度... 代价是自然度降低。
  • photoreceptorsTemporalConstant 设置视网膜入口处低通滤波效果的时间常数。高值导致强烈的时间平滑效果:移动物体会变模糊甚至消失,而静态物体受到优待。但开始视网膜处理时,达到稳定状态所需时间更长。
  • photoreceptorsSpatialConstant 指定与光感受器低通滤波效果相关的空间常数。这些参数指定了后续允许的空间信号周期的最小值。通常,此滤波器应滤除高频噪声。另一方面,值 0 不滤除任何噪声,而较高的值开始滤除高空间频率,并逐渐滤除较低频率... 如果您想看到输入图像的一些细节,请注意不要设置太高!对于彩色图像,0.53 是一个很好的折中值,因为这种选择不会对光谱产生太大影响。更高的值会导致灰色且模糊的输出图像。

水平细胞参数

这组参数调节连接到光感受器的神经网络——水平细胞。它调节光感受器的灵敏度,并完成最终光谱白化的处理(空间带通效果的一部分,从而有利于增强视觉细节)。

  • horizontalCellsGain 这是一个关键参数!如果您对平均亮度不感兴趣,只想专注于细节增强,请将此参数设置为 0。但是,如果您想保留一些环境亮度数据,让一些低空间频率进入系统,请设置一个较高的值(<1)。
  • hcellsTemporalConstant 与光感受器类似,此参数作用于平滑输入数据的低通时间滤波器的时间常数。在这里,高值会产生强烈的视网膜后效,而低值使视网膜更具反应性。此值应低于 photoreceptorsTemporalConstant 以限制强烈的视网膜后效。
  • hcellsSpatialConstant 是这些细胞低通滤波器的空间常数。它指定了后续允许的最低空间频率。视觉上,高值会导致极低空间频率的处理,并产生显著的光晕效果。较低的值会减弱这种效果,但限制是不低于 photoreceptorsSpatialConstant 的值。这两个参数实际上指定了视网膜的空间带通。

注意 一旦由上述参数管理的处理完成,输入数据中的噪声已被清除,亮度也已部分增强。接下来的参数作用于两个输出视网膜信号的最后处理阶段。

Parvo(细节通道)专用参数

  • ganglionCellsSensitivity 指定在该细节专用通道输出端发生的最终局部适应强度。参数值介于 0 和 1 之间。低值倾向于给出线性响应,而高值则加强剩余的低对比度区域。

注意:此参数可以通过优待视觉场景中低能量的细节(即使在明亮区域)来纠正可能过度曝光的图像。

IPL Magno(运动/瞬态通道)参数

一旦图像信息被清理,此通道充当高通时间滤波器,它:
仅选择与瞬态信号(事件、运动等)相关的信号。低通空间滤波器平滑提取的瞬态数据,而最后的对数压缩增强低强度瞬态事件,从而提高事件灵敏度。

  • parasolCells_beta 通常设置为 0,可视为该处理阶段入口点的放大增益。通常设置为 0。
  • parasolCells_tau 可添加的时间平滑效果。
  • parasolCells_k 空间滤波效果的空间常数,将其设置为高值以优待受残留噪声影响较小的低空间频率信号。
  • amacrinCellsTemporalCutFrequency 指定高通滤波器的时间常数。高值允许选择缓慢的瞬态事件。
  • V0CompressionParameter 指定对数压缩的强度。行为与之前的描述类似,但此处增强了瞬态事件的灵敏度。
  • localAdaptintegration_tau 通常设置为 0,目前在这里没有实际用途。
  • localAdaptintegration_k 指定执行局部适应的区域大小。低值导致短程局部适应(对噪声更敏感),高值确保对数压缩。

演示与实验!

初次实验

这里有一些代码片段,简要展示如何使用具有默认参数(带光晕效果)的 Retina。下一节将重定向到随主视网膜类提供的更完整的演示。

这里介绍了如何通过以下步骤处理摄像头流:

  • 加载第一张输入图像以获取其大小
  • 分配具有适当输入大小的视网膜实例
  • 循环处理抓取的帧
    • 抓取新帧
    • 在帧上运行
    • 调用两个输出获取器
    • 显示视网膜输出

C++ 版本(见 bioinspired/samples/basicRetina.cpp)

// 包含 bioinspired 模块和 OpenCV 核心工具
#include <iostream>
// 主函数
int main(int argc, char* argv[]) {
// 声明视网膜输入缓冲区
cv::Mat inputFrame;
// 设置摄像头读取器并抓取第一帧以获取其大小
cv::VideoCapture videoCapture(0);
videoCapture>>inputFrame;
// 分配视网膜实例,其输入大小等于所加载图像的大小
cv::Ptr<cv::bioinspired::Retina> myRetina = cv::bioinspired::createRetina(inputFrame.size());
/* 视网膜参数管理方法使用示例
-> 将当前(此处为默认)视网膜参数保存到 xml 文件(您可能只需使用一次以获取文件并进行修改)*/
*/
myRetina->write("RetinaDefaultParameters.xml");
// -> 如果文件存在则加载参数
myRetina->setup("RetinaSpecificParameters.xml");
// 重置所有视网膜缓冲区(睁开眼睛)
myRetina->clearBuffers();
// 声明视网膜输出缓冲区
cv::Mat retinaOutput_parvo;
cv::Mat retinaOutput_magno;
//主处理循环
while(true){
// 如果使用视频流,则抓取新帧,否则输入保持不变
if (videoCapture.isOpened())
videoCapture>>inputFrame;
else
break;
imshow('input frame', inputImage)
// 在输入图像上运行视网膜
myRetina->run(inputFrame);
// 获取视网膜输出
myRetina->getParvo(retinaOutput_parvo);
myRetina->getMagno(retinaOutput_magno);
// 绘制视网膜输出
cv::imshow("retina input", inputFrame);
cv::imshow("Retina Parvo", retinaOutput_parvo);
cv::imshow("Retina Magno", retinaOutput_magno);
}
}
n 维密集数组类
定义于 mat.hpp:840
MatSize size
定义 mat.hpp:2226
从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:786
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键操作。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3

使用以下命令编译此 C++ 代码:

// 编译
g++ basicRetina.cpp -o basicRetina -lopencv_core -lopencv_highgui -lopencv_bioinspired -lopencv_videoio -lopencv_imgcodecs

Python 版本

#导入 OpenCV 模块
import cv2 as cv
#设置摄像头读取器
videoHandler = cv.VideoCapture(0)
succeed, inputImage=videoHandler.read()
#分配视网膜实例,其输入大小等于所加载图像的大小
retina = cv.bioinspired_Retina.create((inputImage.shape[1], inputImage.shape[0]))
#视网膜参数管理方法使用示例
#-> 将当前(此处为默认)视网膜参数保存到 xml 文件(您可能只需使用一次以获取文件并进行修改)
retina.write('retinaParams.xml')
#-> 从 xml 文件加载视网膜参数:这里我们加载刚才写入文件的默认参数
retina.setup('retinaParams.xml')
#主处理循环
stillProcess=True
while stillProcess is True
#抓取新帧并显示
stillProcess, inputImage=videoHandler.read()
cv.imshow('input frame', inputImage)
#在输入图像上运行视网膜
retina.run(inputImage)
#获取视网膜输出
retinaOut_parvo=retina.getParvo()
retinaOut_magno=retina.getMagno()
#绘制视网膜输出
cv.imshow('retina parvo out', retinaOut_parvo)
cv.imshow('retina magno out', retinaOut_magno)
#稍等片刻让图形绘制出来

更完整的演示

注意
作为以下示例的补充,请查看 tutorial/contrib 部分中的 Retina 教程以获取更多说明。**

查看 OpenCV 提供的 C++ 示例:

  • samples/cpp/retinademo.cpp 展示了如何使用视网膜模块进行细节增强(Parvo 通道输出)和瞬态图观察(Magno 通道输出)。您可以处理图像、视频序列和摄像头视频。典型用法是(假设您的 OpenCV 安装在 OpenCVReleaseFolder 文件夹中):

    • 图像处理:OpenCVReleaseFolder/bin/retinademo -image myPicture.jpg
    • 视频处理:OpenCVReleaseFolder/bin/retinademo -video myMovie.avi
    • 摄像头处理:OpenCVReleaseFolder/bin/retinademo -video
    注意
    该演示会生成 RetinaDefaultParameters.xml 文件,其中包含视网膜的默认参数。然后,将其重命名为 RetinaSpecificParameters.xml,按您希望的方式调整参数,并重新加载程序以检查效果。
  • samples/cpp/OpenEXRimages_HDR_Retina_toneMapping.cpp 展示了如何使用视网膜执行高动态范围 (HDR) 亮度压缩。

    然后,使用相机的包围曝光拍摄 HDR 图像并生成 OpenEXR 图像,然后使用演示程序进行处理。

    典型用法,假设您有 OpenEXR 图像,例如 memorial.exr(位于 samples/cpp/ 文件夹中):

  • OpenCVReleaseFolder/bin/OpenEXRimages_HDR_Retina_toneMapping memorial.exr [可选:'fast']

    请注意,提供了一些滑块允许您调节亮度压缩。

    如果不使用 'fast' 选项,则使用完整的视网膜模型 [26] 执行色调映射。它包括允许降低亮度能量的光谱白化。使用 'fast' 选项时,采用一种更简单的方法,它是对 [197] 中提出的算法的适配。这种方法也能给出良好的效果且处理速度更快,但有时需要更多的参数调整。