Kurento自定义OpenCV模块开发方法总结(三)

Kurento自定义OpenCV模块开发方法总结(三)

(2016-02-23 10:09:07)
      在前面的两篇博文中,我们介绍了Kurento中Opencv类型模块的开发方法并实现了一个简单的边缘检测模块。回顾之前的代码,我们在OpencvPluginSampleOpenCVImpl这个类中定义了两个私有成员变量:filterType和edgeValue,其中filterType为0时执行边缘检测,而edgeValue则是Canny算法中用于控制边缘连接的小阈值。在之前的代码中,我们直接在OpencvPluginSampleOpenCVImpl的构造函数中设置这两个成员的默认值,是写死在代码中的。那么问题来了,有的人可能希望在配置文件中设置这两个参数的默认值以便更灵活地控制模块,这该如何实现呢?在本篇博文中我们更进一步,来看看如果通过配置文件的方式对自定义模块进行参数配置。

      在介绍实现方式之前,我们不妨先看一看Kurento内置的模块是如何实现参数配置的。Kurento模块的配置文件默认存储在/etc/kurento/modules这个目录下,在Kurento安装完成后就会有一个名为kurento的子目录,该子目录下存储了已有内置模块的配置文件,文件格式为ini。当Kurento服务器启动的时候会自动扫描并加载这些配置文件的内容,在Kurento的日志文件中可以看到相关信息,所以如果要对自定义模块进行配置也同样需要在该目录下放置一个对应的配置文件。

# ls -l /etc/kurento/modules/kurento/
-rw-r--r-- 1 root root  29 Nov 25 19:19 BaseRtpEndpoint.conf.ini
-rw-r--r-- 1 root root 350 Nov 25 19:41 HttpEndpoint.conf.ini
-rw-r--r-- 1 root root  24 Nov 25 19:19 MediaElement.conf.ini
-rw-r--r-- 1 root root 618 Nov 25 19:19 SdpEndpoint.conf.json
-rw-r--r-- 1 root root  36 Nov 25 19:19 UriEndpoint.conf.ini
-rw-r--r-- 1 root root 511 Nov 25 19:41 WebRtcEndpoint.conf.ini

2016-02-23 10:50:56,227714 20082 [0x00007f9d4d7dd8c0] info KurentoLoadConfig loadConfig.cpp:164 loadModulesConfigFromDir() Looking for config files in /etc/kurento/modules
2016-02-23 10:50:56,227774 20082 [0x00007f9d4d7dd8c0] info KurentoLoadConfig loadConfig.cpp:164 loadModulesConfigFromDir() Looking for config files in /etc/kurento/modules/kurento
2016-02-23 10:50:56,227910 20082 [0x00007f9d4d7dd8c0] info KurentoLoadConfig loadConfig.cpp:189 loadModulesConfigFromDir() Loaded module config from: /etc/kurento/modules/kurento/MediaElement.conf.ini
2016-02-23 10:50:56,228021 20082 [0x00007f9d4d7dd8c0] info KurentoLoadConfig loadConfig.cpp:189 loadModulesConfigFromDir() Loaded module config from: /etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini

      首先,创建配置文件添加参数内容。我们在 /etc/kurento/modules这个目录下为自定义模块添加一个子目录 opencvpluginsample ,然后在该子目录中创建一个文件 OpencvPluginSample.conf.ini。这里的子目录名称和配置文件名称必须同模块名称保持一致,否则自定义模块是无法获取其中配置的。完成配置文件创建后向其中添加我们想要的配置参数和参数值,内容如下所示:

# sudo mkdir /etc/kurento/modules/opencvpluginsample
# sudo touch /etc/kurento/modules/opencvpluginsample/OpencvPluginSample.conf.ini

# cat /etc/kurento/modules/opencvpluginsample/OpencvPluginSample.conf.ini 
defaultFilterType=0
defaultEdgeValue=25

      设置完配置参数之后,重启一下Kurento服务器,在启动日志中可以看到新添加的配置文件已经被正常加载了。

2016-02-23 10:50:56,228927 20082 [0x00007f9d4d7dd8c0] info KurentoLoadConfig loadConfig.cpp:189 loadModulesConfigFromDir() Loaded module config from: /etc/kurento/modules/opencvpluginsample/OpencvPluginSample.conf.ini"
...
{
  {
    opencvpluginsample":
    {
       "OpencvPluginSample":
       {
         "defaultFilterType": "0", 
         "defaultEdgeValue": "25", 
         "configPath": "\/etc\/kurento\/modules\/opencvpluginsample"
        }
    }
 }
}

      其次,修改自定义模块代码读取参数配置。配置参数已经由Kurento加载完成了,那么我们的自定义模块如何才能读取到这些参数值呢?在之前的博文中我们自动生成的代码涉及两个类:OpencvPluginSampleImpl和OpencvPluginSampleOpenCVImpl,图像处理的功能主要放在 OpencvPluginSampleOpenCVImpl这个类中,而 OpencvPluginSampleImpl这个类基本上没怎么修改,现在就是 OpencvPluginSampleImpl这个类发挥作用的时候了。在 OpencvPluginSampleImpl.hpp这个文件中,我们看到这个类的构造函数声明如下,第一个参数的类型是boost::property_tree::ptree,而property_tree就是boost库中专门为配置文件而写的,支持xml,ini和json格式文件。任何配置文件中的参数值均是config这个参数传进来的,通过它即可获取所有参数值。

OpencvPluginSampleImpl (const boost::property_tree::ptree& config, std::shared_ptr mediaPipeline);

      以下是为了读取配置参数做的所有代码改动,我们先把 OpencvPluginSampleOpenCVImpl类中的两个私有成员变量重新声明为protected,这样在 OpencvPluginSampleImpl类的构造函数中就可以直接修改这两个成员变量的值了。

class OpencvPluginSampleOpenCVImpl : public virtual OpenCVProcess
{
public:
  OpencvPluginSampleOpenCVImpl ();
  virtual ~OpencvPluginSampleOpenCVImpl () {};
  virtual void process (cv::Mat& mat);
  void setFilterType (int filterType);
  void setEdgeThreshold (int edgeValue);
protected:
  int filterType;
  int edgeValue;
};

      接下来修改OpencvPluginSampleImpl.cpp文件中的内容,主要就是在构造函数中增加对两个参数值的获取,使用到的函数为getConfigValue,该函数接收两个参数:配置参数名称和参数默认值,即如果要读取的参数没有在文件中配置的话就使用该默认值。完成这些代码修改后,重新编译自定义模块并重启Kurento服务器,此时我们的自定义模块就可以正常使用配置文件中的配置参数了。

static const std::string DEFAULT_FILTER_TYPE = "defaultFilterType";
static const std::string DEFAULT_EDGE_VALUE = "defaultEdgeValue";

OpencvPluginSampleImpl::OpencvPluginSampleImpl (const boost::property_tree::ptree &config, std::shared_ptr mediaPipeline) : OpenCVFilterImpl (config, std::dynamic_pointer_cast (mediaPipeline) )
{
    filterType = getConfigValue (DEFAULT_FILTER_TYPE, 0);
    edgeValue = getConfigValue (DEFAULT_EDGE_VALUE, 125);
}

      最后,修改配置文件中的参数值验证效果。既然自定义模块已经可以通过配置文件来控制Canny算法中 小阈值的默认值,我们不妨修改下配置文件中的值来验证下自定义模块是否真的使用了来自文件中配置参数。下图分别是将 defaultEdgeValue的值设置为25和125的修过对比,不难看出差别还是挺大的,这说明自定义模块确实使用了来自文件中的配置参数。

Kurento自定义OpenCV模块开发方法总结(三)
defaultEdgeValue值设置为25时的边缘检测效果

Kurento自定义OpenCV模块开发方法总结(三)
defaultEdgeValue值设置为125时的边缘检测效果

猜你喜欢

转载自blog.csdn.net/liuweihui521/article/details/79988109