OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
生物启发式模块视网膜介绍

视网膜类概览

注意
请注意,视网膜模型包含在以下命名空间中:C++ 中的 cv::bioinspired 和 Python 中的 cv.bioinspired

介绍

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

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

该模型源于 Jeanny Herault 的工作 [138]。它参与了 Alexandre Benoit 的博士研究及当前研究 [25][257]。他目前在 OpenCV 中维护此模块。它包含了 Jeanny 其他博士生(例如 [69])的工作,以及 Jeanny 书中描述的 Barthelemy Durette 的对数极坐标变换。

此处更详细地概述了视网膜所实现的一些特性:

  • 关于亮度与细节增强
    • 局部对数亮度压缩(由光感受器在入口点和神经节细胞在输出端进行)。
    • 外网状层(Outer Plexiform Layer)水平上的光谱白化(光感受器和水平细胞的时空滤波)。

前者行为压缩了亮度范围,使得极亮和极暗的区域都能在同一张图片上清晰可见,并保留大量细节。后者则降低了低频亮度能量(平均亮度),并增强了中频(细节)。综合应用这些特性,视网膜能很好地为高级分析预处理视觉信号。这些特性在视频中尤为重要,它们能显著减少光线变化,并保持良好的时间一致性。

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

使用

该模型可用作预处理阶段,以实现以下目的:

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

用例说明

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

作为初步介绍,我们从一个视觉示例开始。我们建议将滤镜应用于一张存在背光问题的低质量彩色 JPEG 图像。这是考虑的输入……“嗯,我用眼睛能看到的比相机拍到的更多……”

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

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

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

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

  • 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%,以消除类似椒盐噪声的像素损坏。
  • 使用默认参数以及以下更改(本节所示示例使用的通用参数)应用视网膜
    • 视网膜 Hcells 增益 =0.4(与默认配置相比的主要变化:它显著减少光晕效应)
    • localAdaptation_photoreceptors=0.99(略高于默认值,以加强局部适应)
    • localAdaptintegration_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() 方法)。其能量随运动速度线性增加。仿生模块中还提供了 TransientAreasSegmentationModule 类,用于事件斑点检测器。基本思想是检测相对于邻域的局部能量下降,然后应用阈值。这种过程已在 TRECVid 挑战赛的视频词袋描述中得到应用 [257],并且仅允许在瞬态区域进行视频帧描述。

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

注意
在这里,我们使用默认的视网膜设置,它会在强边缘周围生成光晕。请注意,时间常数允许在运动物体上看到时间效应(这对于视频的静止图像说明很有用)。通过增加视网膜 Hcells 增益可以消除光晕,而通过减小时间常数值可以减少时间效应。另外请注意,两个视网膜输出都被重新缩放到 [0:255] 范围,因此在绘制时,当没有物体移动时,magno 输出可能会显示大量“噪声”。但是,如果您使用 getMagnoRAW 获取器检索它,其能量仍然很低。
RGB 图像序列上的视网膜处理:来自 http://changedetection.net/ 的示例(baseline/PETS2006)。Parvo 增强静态信号,但平滑移动的人,因为从其角度看他们并不保持静止。Magno 通道突出显示移动的人,观察顶部部分被深色玻璃遮挡的人的能量映射。
灰度图像序列上的视网膜处理:来自 http://changedetection.net/ 的示例(thermal/park)。在此类灰度图像上,parvo 通道增强对比度,而 magno 对移动的行人产生强烈反应。

参考文献

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

  • 模型描述:[25]
  • 模型在词袋方法中的应用:[257]
  • 请查阅 Jeanny Herault 的参考著作,您可以在他的书中阅读:[138]

此视网膜滤镜代码包含了博士/研究同事的研究贡献,作者从他们的代码中进行了借鉴和重绘

  • 请查看 retinacolor.hpp 模块,以了解 Brice Chaix de Lavarene 博士的彩色马赛克/去马赛克技术及其参考论文:[69]
  • 请查看 imagelogpolprojection.hpp,以了解源自 Barthelemy Durette 博士与 Jeanny Herault 合作研究的视网膜空间对数采样。还提出了一种视网膜/V1 皮层投射,源于 Jeanny 的讨论。更多信息请参见上面引用的 Jeanny Herault 的著作。
  • Meylan 等人在 HDR 色调映射方面的工作,该工作作为模型中的一个特定方法实现:[194]

视网膜编程接口

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

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

namespace cv{namespace bioinspired{
class Retina : public Algorithm
{
public:
// parameters setup instance
struct RetinaParameters; // this class is detailed later
// main method for input frame processing (all use method, can also perform High Dynamic Range tone mapping)
void run (InputArray inputImage);
// specific method aiming at correcting luminance only (faster High Dynamic Range tone mapping)
void applyFastToneMapping(InputArray inputImage, OutputArray outputToneMappedImage)
// output buffers retrieval methods
// -> foveal color vision details channel with luminance and noise correction
void getParvo (OutputArray retinaOutput_parvo);
void getParvoRAW (OutputArray retinaOutput_parvo);// retrieve original output buffers without any normalisation
const Mat getParvoRAW () const;// retrieve original output buffers without any normalisation
// -> peripheral monochrome motion and events (transient information) channel
void getMagno (OutputArray retinaOutput_magno);
void getMagnoRAW (OutputArray retinaOutput_magno); // retrieve original output buffers without any normalisation
const Mat getMagnoRAW () const;// retrieve original output buffers without any normalisation
// reset retina buffers... equivalent to closing your eyes for some seconds
void clearBuffers ();
// retrieve input and output buffers sizes
// setup methods with specific parameters specification of global xml config file loading/write
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);
};
// Allocators
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 小细胞通道(参见生物学模型)
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
标准拜耳采样
定义 retina.hpp:86
std::string String
定义 cvstd.hpp:151
Size2i Size
定义 types.hpp:370
const _InputArray & InputArray
定义 mat.hpp:444
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
const _OutputArray & OutputArray
定义 mat.hpp:446
定义 core.hpp:107

设置视网膜

管理配置文件

当使用 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 协同调整,无论局部亮度如何,图像都可以非常对比鲜明……但会牺牲自然度。
  • photoreceptorsTemporalConstant 此参数设置视网膜入口处低通滤波效果的时间常数。高值会导致强烈的 temporal smoothing 效果:移动物体会模糊并可能消失,而静态物体则被优先处理。但在开始视网膜处理时,达到稳定状态会更晚。
  • photoreceptorsSpatialConstant 指定与光感受器低通滤波效果相关的空间常数。这些参数指定后续处理中允许的空间信号周期的最小值。通常,此滤波器应切除高频噪声。另一方面,值为 0 不会切除任何噪声,而更高的值开始切除高空间频率,并逐步切除更低频率……如果您想看到输入图像的一些细节,请注意不要设置过高!对于彩色图像,0.53 是一个很好的折衷值,因为这种选择不会对色彩光谱产生太大影响。更高的值会导致输出图像灰暗和模糊。

水平细胞参数

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

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

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

Parvo(细节通道)专用参数

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

注意:此参数可以通过优先处理视觉场景中的低能量细节来校正可能出现的“曝光过度”图像,即使在明亮区域也是如此。

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

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

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

演示与实验!

首次实验

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

此处展示了如何通过以下步骤处理网络摄像头流:

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

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

// include bioinspired module and OpenCV core utilities
#include <iostream>
// main function
int main(int argc, char* argv[]) {
// declare the retina input buffer.
cv::Mat inputFrame;
// setup webcam reader and grab a first frame to get its size
cv::VideoCapture videoCapture(0);
videoCapture>>inputFrame;
// allocate a retina instance with input size equal to the one of the loaded image
cv::Ptr<cv::bioinspired::Retina> myRetina = cv::bioinspired::createRetina(inputFrame.size());
/* retina parameters management methods use sample
-> save current (here default) retina parameters to a xml file (you may use it only one time to get the file and modify it)
*/
myRetina->write("RetinaDefaultParameters.xml");
// -> load parameters if file exists
myRetina->setup("RetinaSpecificParameters.xml");
// reset all retina buffers (open your eyes)
myRetina->clearBuffers();
// declare retina output buffers
cv::Mat retinaOutput_parvo;
cv::Mat retinaOutput_magno;
//main processing loop
while(true){
// if using video stream, then, grabbing a new frame, else, input remains the same
imshow('input frame', inputImage)
videoCapture>>inputFrame;
else
break;
// run retina on the input image
myRetina->run(inputFrame);
// grab retina outputs
myRetina->getParvo(retinaOutput_parvo);
myRetina->getMagno(retinaOutput_magno);
// draw retina outputs
cv::imshow("retina input", inputFrame);
cv::imshow("Retina Parvo", retinaOutput_parvo);
cv::imshow("Retina Magno", retinaOutput_magno);
Class for video capturing from video files, image sequences or cameras.
}
}
n 维密集数组类
定义 mat.hpp:830
MatSize size
定义 mat.hpp:2187
用于从视频文件、图像序列或摄像机捕获视频的类。
Definition videoio.hpp:772
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3

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

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

Python 版本

#import OpenCV module
import cv2 as cv
#setup webcam reader
videoHandler = cv.VideoCapture(0)
succeed, inputImage=videoHandler.read()
#allocate a retina instance with input size equal to the one of the loaded image
retina = cv.bioinspired_Retina.create((inputImage.shape[1], inputImage.shape[0]))
#retina parameters management methods use sample
#-> save current (here default) retina parameters to a xml file (you may use it only one time to get the file and modify it)
retina.write('retinaParams.xml')
#-> load retina parameters from a xml file : here we load the default parameters that we just wrote to file
retina.setup('retinaParams.xml')
#main processing loop
stillProcess=True
while stillProcess is True
#grab a new frame and display it
stillProcess, inputImage=videoHandler.read()
cv.imshow('input frame', inputImage)
#run retina on the input image
retina.run(inputImage)
#grab retina outputs
retinaOut_parvo=retina.getParvo()
retinaOut_magno=retina.getMagno()
#draw retina outputs
cv.imshow('retina parvo out', retinaOut_parvo)
cv.imshow('retina magno out', retinaOut_magno)
#wait a little to let the time for figures to be drawn

更完整的演示

注意
除了以下示例,请查阅教程/贡献(tutorial/contrib)部分的视网膜教程,以获取补充说明。

请查看 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 [optional: 'fast']

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

    如果未使用 'fast' 选项,则色调映射是使用完整的视网膜模型 [25] 进行的。它包括光谱白化,可降低亮度能量。当使用 'fast' 选项时,采用了一种更简单的方法,它是对 [194] 中提出的算法的改编。这种方法也能提供良好的结果,处理速度更快,但有时需要更多的参数调整。