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/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)