imutils基础(3)检查OpenCV版本

OpenCV 3的发布必然会打破与某些OpenCV 2.4.X的向后兼容性。我立刻想到了cv2.findContours 和cv2.normalize函数。

那么,如何确保无论生产环境使用的是哪个版本的OpenCV,代码都能正常工作呢?

简单的回答是,您需要在每个有变化的函数之前创建if语句(或将函数抽象到一个单独的方法,该方法根据您的OpenCV版本调用适当的函数)。

为了做到这一点,你需要能够从你使用的Python中检查你的OpenCV版本——这正是本博客的其余部分将告诉你如何做的!

1.使用Python检查OpenCV版本

OpenCV版本包含在cv2.__version__变量,你可以这样访问:

$ python
>>> import cv2
>>> cv2.__version__
'3.0.0'

cv2.__version__变量是一个简单的字符串,你可以分为主要和次要版本:

$ python
>>> (major, minor, _) = cv2.__version__.split(".")
>>> major
'3'
>>> minor
'0'

当然,每次需要检查OpenCV版本时都必须执行这个操作是有点痛苦的。为了解决这个问题,imutils包中添加了三个新函数,这是一系列方便的函数,使OpenCV和Python处理基本图像处理函数更容易。

你可以看到is_cv2, is_cv3,is_cv4和check_opencv_version函数如下:

def is_cv2():
    # 如果我们使用的是opencv2,那么我们的cv2.__version__将以'2.'开头。
    return check_opencv_version("2.")
def is_cv3():
    # 如果我们使用的是opencv3,那么我们的cv2.__version__将以'3.'开头。
    return check_opencv_version("3.")
def is_cv4():
    # 如果我们使用的是opencv4,那么我们的cv2.__version__将以'4.'开头。
    return check_opencv_version("4.")
def check_opencv_version(major, lib=None):
    # 如果提供的库为None,则导入OpenCV
    if lib is None:
        import cv2 as lib
        
    # 返回当前OpenCV版本是否与主版本号匹配
    return lib.__version__.startswith(major)

这里的代码相当简单——我只是简单地检查cv2.__version__字符串是否以2开头,表明我们正在使用OpenCV 2.X,一个3,表示我们正在使用OpenCV 3,或者一个4,表示我们正在使用OpenCV 4

2.检查你的OpenCV版本:一个真实的例子

现在我们知道了如何使用Python检查OpenCV版本,并定义了几个方便的函数以使版本检查更容易,让我们看看如何在实际示例中使用这些函数。

我们的目标是检测下图中的轮廓:
在这里插入图片描述
为了检测图像中的轮廓,我们需要使用cv2.findContours函数。然而,正如我们所知,cv2.findContours的返回值在OpenCV版本3和2.4 之间略有变化。因此,在调用cv2.findContours之前,我们需要对OpenCV版本执行一次检查,以确保我们的脚本不会出错。让我们看看如何进行检查:

# 导入必要的包
from __future__ import print_function
import imutils
import cv2
# 加载俄罗斯方块图像,将其转换为灰度,并设置图像阈值
print("OpenCV Version: {}".format(cv2.__version__))
image = cv2.imread("tetris_blocks.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)[1]
# 检查我们是否在使用opencv2.X或OpenCV 4
if imutils.is_cv2() or imutils.is_cv4():
	(cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 检查我们是否在使用OpenCV 3
elif imutils.is_cv3():
	(_, cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# 在图像上画出轮廓
cv2.drawContours(image, cnts, -1, (240, 0, 159), 3)
cv2.imshow("Image", image)
cv2.waitKey(0)

正如你所看到的,我们需要做的就是调用is_cv2, is_cv4和is_cv3,然后将特定版本的代码包装在if语句块中——就是这样!
在这里插入图片描述

结论

在这篇博文中,我们学习了如何使用Python检查我们的OpenCV版本。OpenCV版本包含在一个名为cv2.__version__的特殊字符串变量中。我们需要做的就是检查这个变量,然后我们就能确定我们的OpenCV版本了。
最后,imutils包中定义了一些方便的方法,以使检查OpenCV版本更容易,更python化。如果您发现自己需要不断地检查OpenCV版本,请考虑检查这个库。

参考目录

https://www.pyimagesearch.com/2015/08/10/checking-your-opencv-version-using-python/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值