给opencv函数写一个python装饰器

今天这个话题很有意思,能够帮助理解python装饰器的含义。使用过VS做图像处理的同学可能接触过Image Watch这个调试工具,其界面如下图所示。可参见如下链接:https://blog.csdn.net/iracer/article/details/83413877

在这里插入图片描述
今天,在python下找到了一个类似的工具,叫pyimagewatch. 虽然没有完全理解其使用,但其思路可以参考一下:实现相关功能的方式就是给相应的opencv函数写一个装饰器。比如想查看一个opencv函数的执行结果(Watcher功能),实现所用的代码如下:

class Checker:
    """Checker for OpenCV functions."""
    
    def __init__(self, cv_function_name: str):
        """Checker for OpenCV functions."""
        cv.namedWindow(cv_function_name)
        self.cv_function_name = cv_function_name
        self.cv_function = getattr(cv, cv_function_name)

    def start(self, decorator):
        """Starts checking the OpenCV function."""
        setattr(cv, self.cv_function_name, decorator())

    def stop(self):
        """Stops checking the OpenCV function."""
        setattr(cv, self.cv_function_name, self.cv_function)
        
class Watcher(Checker):
    """Watcher for OpenCV functions."""

    def watch(self):
        """Decorator to watch an OpenCV function."""

        @wraps(self.cv_function)
        def wrapper(*args, **kwargs):
            result = self.cv_function(*args, **kwargs)
            cv.imshow(self.cv_function_name, result)
            cv.waitKey()
            return result

        return wrapper

    def start(self):
        """Starts watching the OpenCV function."""
        super().start(self.watch)

其中Checker是基类,Watcher是派生类。Checker构造函数需要传入一个opencv函数名,Checker.start函数将opencv函数与相应的装饰器函数绑定;装饰器函数是由Watcher.watch函数生成的。可以看到Watcher.watch是一个典型的装饰器函数,其功能是除了执行原有的opencv函数之外,还对函数结果进行了显示cv.imshow(self.cv_function_name, result)这体现了装饰器函数的核心:得到一个增强函数,替换原有函数,并保持一样的名字。

python装饰器的知识可以参考:

  1. https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584
  2. https://www.bilibili.com/video/BV1SZ4y1s7cv?p=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值