OpenCV 2.4.3 和 Python

13

几天前,我开始寻找一种简单的计算机视觉系统的好方法。OpenCV库是我需要的东西,但是在Python中学习它却很困难,特别是在OpenCV 2.4.3更新后,其与Python相关的文档非常少。所以我现在明白,在OpenCV中有很多变化,例如

import cv

现在是

import cv2

还有很多模块是缺失的。我的意思是,是的,有新的Python-OpenCV语法的例子,但它们非常狭窄且难以理解。 例如: Python代码的官方文档示例

cv2.cvtColor(src, code[, dst[, dstCn]])

我知道这段代码的含义和如何使用它,至少我认为我知道。但是写出源代码和彩色代码并没有什么作用,只是让我感到:

    Traceback (most recent call last):
  File "C:\FILEFOLDER\tut.py", line 11, in <module>
    cv.cvtColor('proba.jpg', 'CV_RGB2GRAY')
TypeError: an integer is required

或者,如果我试图编写像变量这样的代码:

Traceback (most recent call last):
  File "C:\FILEFOLDER\tut.py", line 11, in <module>
    cv.cvtColor('proba.jpg', CV_RGB2GRAY)
NameError: name 'CV_RGB2GRAY' is not defined

那么有没有适用于最新OpenCV的Python参考文档/教程/书籍/指南,从头开始解释,而不会用C++或Java的不必要代码示例让像我这样的新手感到困惑呢?


嗨,Python-OpenCV文档非常陈旧。两年前我使用它时,遇到了同样的问题。据我记得,Python中有一个参数是隐式的,在C文档中则是显式的。我花了很长时间才弄清楚。我相信在C中使用OpenCV比Python-OpenCV更容易,并且在C中运行速度更快。 - Netro
所以,如果我想要开发计算机视觉,我就必须学习C语言 :) - Domagoj
1
我建议你尝试使用C++中的OpenCV,它有很好的文档和庞大的社区支持。不过Python也应该有相当不错的OpenCV文档。如果你只是做一些简单的事情,也许可以尝试PIL。 - PepperoniPizza
我在这个博客http://opencvpython.blogspot.com/上找到了一些教程,那是一个好的开始。 - Domagoj
2个回答

9

我认为你的理解方向是相反的。

实际上,随着新的cv2模块的出现,OpenCV相比旧的cv接口变得更加简单。不仅如此,由于Numpy的支持,它还非常快速和高效。唯一需要注意的是,我们应该知道如何适当地使用它。

在这里,你应该按照以下方式使用函数:

img = cv2.imread('pic.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

我希望您访问两个Stack Overflow页面,其中一个显示了两个模块之间的比较:What is different between all these OpenCV Python interfaces?
另一个SOF是一个简单的演示,展示如何通过Numpy支持加速代码:Performance comparison of OpenCV-Python interfaces, cv and cv2
你不需要学习C ++或C来使用OpenCV,虽然C ++是官方语言。仍然,Python-OpenCV有很好的支持。一旦你掌握了如何使用OpenCV,你就能够自己将C++代码转换为Python。然后,你也可以从C++教程中学习OpenCV。例如,我开始从Gary Bradsky的《Learning OpenCV》学习OpenCV,这完全是用C++编写的。当时,只有cv接口。
正如你在评论中提到的,opencvpython.blogspot.com有一些入门教程。我开始专注于OpenCV新手。
此外,请检查这个SOF获取更多教程:Books for OpenCV and Python?

4
为了让你更好地运行旧代码,并在新的OpenCV安装版本中使用,我们可以从另一个角度来看待问题...首先,从cv到cv2的转变是因为该库在很多函数中使用不同的数据结构。判断一个函数是否在cv2和cv之间发生了改变的最简单的方法是查看函数名的大小写。重组后的cv2函数似乎总是以小写字母开头。所以如果你正在使用旧书籍或旧例子,你仍然可以使用传统的cv。现在,cv只是嵌入在cv2中。只需在你的脚本顶部使用以下代码即可。
    import cv2
    import cv2.cv as cv #required for old code not to be changed

这使您可以在不更改旧代码的情况下轻松运行它。我将在此处演示您的函数调用。您有...

    cv.cvtColor('proba.jpg', 'CV_RGB2GRAY')

我注意到的第一件事是你的函数可能被错误调用了。(给定函数的首字母小写,应该以cv2而不是cv开头)。其次是你传递给函数的“代码”。'Codes'是cv2和cv的成员(编码新手在此,请原谅我如果我的词汇不准确),但并不总是相同的。你有'CV_RGB2GRAY'。首先,没有引号。这是一个cv的“代码”,而不是cv2的。另外,你漏掉了前面的'cv.'。为了演示,以下是我认为旧版cv应该如何调用你的函数:
    cv.CvtColor('proba.jpg', cv.CV_RGB2GRAY) #Assuming you used listed imports
    cv2.cv.CvtColor('proba.jpg', cv2.cv.CV_RGB2GRAY) #Assuming you skipped second import

现在是cv2时刻...
    cv2.cvtColor('proba.jpg', cv2.COLOR_RGB2GRAY)

希望这能对你有所帮助。请记住,由于Python是基于脚本运行的,因此您可以直接在命令行中输入任何您不确定的内容。这对我建立理解非常有帮助(我5天前才开始使用Python)。例如,如果您想知道为什么函数需要一个整数参数,当您键入时:

    cv.CV_RGB2GRAY

直接在Python命令行中输入,它会返回'7'(很方便,因为它是一个整数)。而使用cv2版本则会返回'7L'。请记得在某些情况下现在和再次使用WaitKey()函数,否则highgui可能没有足够的时间来处理某些命令。好了,就这样了。如果我重复了一些已经涉及到或引用的事情,请管理员随意删除它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接