OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
仿生模块视网膜介绍

视网膜类概述

注意
不要忘记,视网膜模型包括在以下名称空间中:cv::bioinspired(C++),cv.bioinspired(Python)

简介

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

  • 详细彩色视觉的中央凹视觉:视锥细胞通路。
  • 敏感瞬变信号检测(运动和事件)的外围视觉:视杆细胞通路。

此模型源自 Jeanny Herault 的研究 [136]。Alexandre Benoit 博士和他目前的研究 [24][253] 使用了此模型。他目前在 OpenCV 中维护此模块。该模块包含许多其他 Jeanny 的博士生(例如 [67])的研究成果,以及 Jeanny 的书中描述的 Barthelemy Durette 对数极性变换成果。

以下是此处实现的视网膜属性的详细信息概述

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

前者的行为会压缩亮度范围,让很亮的区域和很暗的区域都在同一张图片上以丰富的细节可见。后者会减少低频亮度能量(平均亮度)并增强中频(细节)。综合使用时,视网膜会在高级分析之前做好视觉信号的准备。这些属性在视频中非常有用,视频中的光线变化会显著减少,但时间一致性很有趣。

  • 关于噪声滤波
    • 高频空间和时间噪声被滤除。视锥细胞和视杆细胞通路均受益于此。噪声减少受益于可分离的时空滤波。
    • 在视锥细胞输出中,静态纹理得到增强,噪声得到滤除(在视频中,时间噪声被很好地删除)。然而,就像人类行为一样,运动纹理被平滑。然后,只有当视网膜跟踪运动物体并从其角度将其保持为静态时,才能增强运动物体的细节。
    • 在 Magno 输出中,它允许更干净地检测事件(运动,变化),即使在恶劣的照明条件下也能减少噪声误差。折中一下,Magno 输出是一个低空间频率信号,并且允许可靠地提取事件的斑点(为此,请查看 TransientAreasSegmentationModule 模块)。

用法

该模型可以用作预处理阶段,以

  • 执行纹理分析,提高信噪比和增强的细节,这些细节对于输入图像的亮度范围是稳健的(使用提供的 getParvo 方法查看小细胞视网膜通道输出)
  • 执行运动分析,该分析还利用先前引用的特性(使用提供的 getMagno 方法查看大细胞视网膜通道输出)
  • 使用一个或两个通道对常规图像/视频进行描述。在 [253] 中给出了在词袋方法中使用视网膜的一个示例。
注意
  • 为了便于计算机视觉应用程序的使用,两个视网膜通道应用于所有输入图像。这不符合真实的视网膜拓扑,但从图像处理的角度来看,它是实用的。如果需要视网膜映射(中央和周边视觉),请使用类中提出的对数采样功能。
  • 通过扩展视网膜描述、代码、用例以提供补充的解释和演示,您可以随时通过贡献来帮助我们。

使用案例说明

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

作为初步介绍,我们从一个视觉示例开始。我们建议将滤波器应用于带有背光问题的低质量彩色 jpeg 图像。以下是考虑的输入...*"嗯,我的眼睛可以看到比我的相机捕捉到的更多..."*

背光问题导致的低质量彩色 jpeg 图像。

下面是 retina foveal 模型,它以默认参数应用于整个图像。不管局部亮度如何,细节都得到加强。此处轮廓强烈加强,但噪声水平保持较低。使用此配置会导致晕影效果自愿可见。请参阅下面的参数讨论,并将 horizontalCellsGain 增加到接近 1 以消除它们。

retina foveal 模型以默认参数应用于整个图像。此处轮廓得到加强,亮度得到校正,并且自愿可以看到晕影效果,将 horizontalCellsGain 增加到接近 1 以消除它们。

以下是一个将第二种视网膜中心凹模型输出应用于整幅图像的示例,该模型的参数设置专注于自然感知。“嘿,我现在认出我的猫了,它在一天结束时看着远处的群山!”*。通过这种配置,可以强制显示轮廓线,校正亮度,但又可以避免出现光晕。逆光效果得到校正,同时突出了细节。然后,即使在低质量的 jpeg 图像中,如果一些亮度信息保留下来,视网膜也能够重建一个适当的视觉信号。这种配置对于将高动态范围 (HDR) 图像压缩为 8 位图像也很有用,如 [24] 中讨论的那样,以及以下讨论的演示代码中所述的配置。如下图所示,相对于默认值的参数更改为

  • horizontalCellsGain=0.3
  • photoreceptorsLocalAdaptationSensitivity=ganglioncellsSensitivity=0.89.
视网膜中心凹模型应用于具有“自然度”参数的整幅图像。通过这种配置,可以强制显示轮廓线,但避免出现光晕效果,horizontalCellsGain 为 0.3,photoreceptorsLocalAdaptationSensitivity=ganglioncellsSensitivity=0.89。

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

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

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

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

  • 加载 HDR 图像(OpenEXR 格式受 OpenCV 支持),并在约 5% 和 95% 的位置剪切直方图边框,以消除类似椒盐的像素破坏。
  • 应用视网膜(使用默认参数以及以下更改,用于本部分显示的插图中使用的通用参数)
    • 视网膜 H 细胞增益 =0.4(与默认配置相比的主要变化:它大幅降低了光晕效应)
    • localAdaptation_photoreceptors=0.99(比默认值略高,用于增强局部适应)
    • localAdaptation_Gcells=0.95(也略高于默认值,用于增强局部适应)
  • 使用getParvo()方法获取 parvo 输出。

请参阅本页底部,了解如何在配置文件中指定这些参数。

以下两个图例显示了此类配置对 2 个图像样本的影响。

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

使用大气神经通路检测运动和事件(视网膜输出)

可以使用视网膜的视网膜输出轻松检测时空事件(使用getMagno()方法)。它的能量随运动速度线性增加。建议使用 bioinspired 模块中同样提供的 TransientAreasSegmentationModule 类来检测事件斑点。基本思想是检测邻域局部能量下降,然后应用一个阈值。此类过程已用于 TRECVid 挑战 [253] 中视频的词袋描述,并且仅允许对瞬态区域的视频帧进行描述。

我们在此提供从 http://changedetection.net/ 采集的一些示例(带有 RGB 和热力视频)中视网膜输出的一些图例。

注意
此处,我们使用生成强边缘周围晕圈的默认视网膜设置。请注意,时间常数允许在运动物体上看到时间效应(对视频的静止图像图例很有用)。可以通过增大视网膜 H 细胞增益来去除晕圈,同时可以通过减小时间常数值来减少时间效应。还需要考虑重新缩放两个视网膜输出 [0:255] 范围,这样在绘制视网膜输出时,当没有移动时,视网膜输出可能会显示大量“噪声”。但是,如果您改用getMagnoRAW getter 检索它,它的能量将保持较低。
RGB 图像序列上的视网膜处理:来自 http://changedetection.net/ (baseline/PETS2006) 的示例。视网膜会强化静态信号,但会使移动的人平滑,因为从视网膜的观点来说,移动的人不是静态的。视网膜通道突出显示移动的人,请观察顶部通道的能量映射,部分在深色玻璃后面。
灰度图像序列上的视网膜处理:来自 http://changedetection.net/ (thermal/park) 的示例。在此类灰度图像上,视网膜通道强化对比度,同时视网膜对移动的行人强烈反应

文献

了解更多信息,请参考以下论文

  • 模型描述:[24]
  • 词袋方法中的模型使用:[253]
  • 请查阅 Jeanny Herault 的参考书目,您可以在他的书中读到:[136]

视网膜滤镜代码包括博士/研究人员的研研究成果,作者根据这些成果重新绘制了该代码

  • 查看retinacolor.hpp 模块,以了解 Brice Chaix de Lavarene 博士的彩色镶嵌/反镶嵌算法及其参考论文:[67]
  • 查看imagelogpolprojection.hpp,以了解视网膜空间对数采样,该采样源自 Barthelemy Durette 和 Jeanny Herault 的博士论文。还提出了视网膜/V1 皮层投影,该投影源自 Jeanny 的讨论。更多信息请参见 Jeanny Heraults 上面引用的书。
  • Meylan 等人研究了 HDR 色调映射,该映射作为模型中的一种具体方法来实现:[191]

视网膜编程接口

建议的类允许使用 Gipsa(预备工作)/Listic 实验室视网膜模型。该模型可以应用于静止图像、图像序列和视频序列。

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

命名空间 cv{命名空间 bioinspired{
Retina : public Algorithm
{
public:
// 参数设置实例
结构体 RetinaParameters; // 该类将在后面详细介绍
// 用于输入帧处理的主要方法(所有使用的方法,还可以执行高动态范围色调映射)
void run (InputArray inputImage);
// 专门用于仅校正亮度的特定方法(更快的 HDR 色调映射)
void applyFastToneMapping(InputArray inputImage, OutputArray outputToneMappedImage)
// 输出缓冲区检索方法
// -> 指定亮度和噪声校正的中央凹彩色视觉细节通道
void getParvo (OutputArray retinaOutput_parvo);
void 获取Parvo原始数据 (OutputArray retinaOutput_parvo);// 检索不含任何标准化的原始输出缓冲区
const Mat 获取Parvo原始数据 () const;// 检索不含任何标准化的原始输出缓冲区
// -> 外围单色运动和事件(瞬态信息)通道
void 获取Magno (OutputArray retinaOutput_magno);
void 获取Magno原始数据 (OutputArray retinaOutput_magno); // 检索不含任何标准化的原始输出缓冲区
const Mat 获取Magno原始数据 () const;// 检索不含任何标准化的原始输出缓冲区
// 重置视网膜缓冲区... 相当于闭上眼睛几秒
void 清除缓冲区 ();
// 检索输入和输出缓冲区大小
// 设置具有特定参数规范的全局 xml 配置文件加载/写入的方法
void 设置 (String retinaParameterFile="", const bool applyDefaultSetupOnFailure=true);
void 设置 (FileStorage &fs, const bool applyDefaultSetupOnFailure=true);
void 设置 (RetinaParameters newParameters);
struct Retina::RetinaParameters 获取参数 ();
const String 输出设置 ();
virtual void 写入 (String fs) const;
虚拟 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 and bioinspired namespaces end
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) 大细胞通道的参数值。
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
标准 bayer 采样
定义 retina.hpp:86
std::string String
定义 cvstd.hpp:151
Size2i Size
定义 types.hpp:370
const _InputArray & InputArray
定义 mat.hpp:442
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
const _OutputArray & OutputArray
定义 mat.hpp:444
磁盘上的文件关联的文件存储的“黑盒”表示形式。
定义 core.hpp:102

设置视网膜

管理配置文件

当使用 Retina::writeRetina::load 方法时,会创建或加载存储视网膜配置的 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 协同调整,那么无论局部亮度如何,图像的对比度都可以非常高...但代价是降低自然度。
  • 感光体时间常数此设置设置了视网膜进入点低通滤波器效果的时间常数。高值导致很强的时域平滑效果:运动物体变得模糊,有时甚至会消失,而静态物体得以保留。但在开始视网膜处理时,稳定状态达到得会比较晚。
  • 感光体空间常数指定相关于感光体低通滤波器效果的空间常数。这些参数指定以下段落里允许的空间信号周期最小值。通常,这种滤波器应该切断高频噪声。另一方面,0 值不切断任何噪声,而更高的值开始切断高空间频率,并逐步降低频率...请注意,如果你想看到输入图像的一些细节,请不要使用高等级!对于彩色图像,一个不错的权衡是 0.53,因为此选择不会过多影响色谱。更高的值会导致输出图像灰白模糊。

水平细胞参数

此参数集对连接到水平细胞感光体的神经网络进行微调。它调节了感光体灵敏度,并完成了最终光谱增白的处理(空间通带效应的一部分,由此增强了视觉细节)。

  • 水平细胞增益这里有一个关键参数!如果你对平均亮度不感兴趣,而只想关注细节增强,那么将此参数设置为零。但是,如果你想保留一些环境亮度数据,则让一些低空间频率通过系统并设置更高的值(<1)。
  • 水平细胞时间常数与感光体类似,此参数作用于时间常数,平滑输入数据。在这里,高值会产生较强的视网膜后效,而较低的值会使视网膜更具反应性。此值应低于感光体时间常数才能限制很强的视网膜后效。
  • 水平细胞空间常数是这些细胞滤波器低通的空间常数。它指定了以下部分允许的最低空间频率。从视觉上看,较高的值会导致非常低的处理空间频率,并导致显著的光晕效果。较低的值可以减少这种效果,但限制条件不能低于感光体空间常数的值。这两个参数实际上指定了视网膜的空间通带。

注意在前几个参数管理的处理完成后,输入数据将从噪声中清除,并且亮度已经得到部分增强。以下参数对两个视网膜输出信号的最后处理阶段起作用。

专用小神经节(细节频道)参数

  • 神经节细胞灵敏度指定了此专用的细节通道输出处发生的最终局部适应的强度。参数值保持在 0 到 1 之间。较低的值倾向于给出线性响应,而较高的值则增强了剩余的低对比度区域。

注释:该参数可以通过突出显示视觉场景中低能耗 детали в светлых областях,来纠正可能出现的过曝图像。

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

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

  • parasolCells_beta通常设置为零,可以看作是此处理阶段入口处的放大增益。通常设置为 0。
  • parasolCells_tau可添加的时间平滑效果
  • parasolCells_k空间滤波效果的空间常量,将该常量设置为高值以突出低空间频率信号,这是低剩余噪声的主题。
  • amacrinCellsTemporalCutFrequency指定高通滤波器的时间常量。较高的值允许选择缓慢的瞬态事件。
  • V0CompressionParameter指定对数压缩的强度。类似于之前的说明,但在这里执行瞬态事件的灵敏度。
  • localAdaptintegration_tau通常设置为 0,实际上在其中没有实际用途。
  • localAdaptintegration_k指定执行局部自适应的区域大小。较低的值导致短程局部自适应(对噪声较敏感),而较高值确保对数压缩。

演示和实验 !

实验初体验

以下是几个代码片段,简要展示如何使用 Retina 和默认参数(带晕影效果)。下一节将重定向到主 retina 类随附的更完整的演示。

下面介绍如何通过以下步骤处理网络摄像头流

  • 加载一个预输入图像以获取其大小
  • 使用适当的输入大小分配一个 retina 实例
  • 循环访问抓取的帧
    • 抓取一个新帧
    • 在一帧上运行
    • 调用两个输出 getter
    • 显示 Retina 输出

C++ 版本(请参阅 bioinspired/samples/basicRetina.cpp)

// 包括 bioinspired 模块和 OpenCV 核心实用程序
#include <iostream>
// main 函数
int main(int argc, char* argv[]) {
// 声明 Retina 输入缓冲区。
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:812
MatSize size
定义 mat.hpp:2160
用于从视频文件、图像序列或相机获取视频的类。
定义 videoio.hpp:731
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)
# 稍等片刻,让数字画出来

更完整的演示

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

查看 OpenCV 提供的 C++ 示例

  • samples/cpp/retinademo.cpp 展示了如何使用 retina 模块进行细节增强(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 展示了如何使用 retina 执行高动态范围 (HDR) 亮度压缩

    然后,使用相机和 bracketing 拍摄 HDR 图像,生成一个 OpenEXR 图像,然后使用演示对其进行处理。

    典型用法,假设你有一个 OpenEXR 图像,如memorial.exr(存在于 samples/cpp/ 文件夹中)

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

    请注意,某些滑块可用于允许您调整亮度压缩。

    如果不使用“快速”选项,则将使用完整的视网膜模型执行色调映射 [24] 。其中包括色谱增白,可减少亮度能量。使用“快速”选项时,将使用一种更简单的方法,即对 [191] 中提出的算法进行的改编。这种方法也能产生良好的结果,并且处理速度更快,但有时需要更多参数调整。