OpenCV中的while循环导致错误
在尝试使用opencv进行实时平面物体追踪时,我发现了一个关于pyopencv的“查找物体”演示。这个脚本基本上实现了我想要的功能,但它是将一张静态图片和另一张静态图片进行比较,而我想要的是将一张静态图片和从网络摄像头抓取的当前画面进行比较。为此,我把这一行
scene_filename = "box_in_scene.png"
替换成了这一行
capture = cv.VideoCapture(0)
frame = Mat()
capture >> frame
imwrite("box_in_scene.png",frame)
这样做之后,效果是正常的,但当我尝试添加一个简单的循环,让它持续运行时,它只循环一次就停止了。当我退出脚本时,出现了以下错误:
OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupport
ed array type) in cvGetMat, file M:\programming\packages\opencv\workspace\2.1\Op
enCV-2.1.0\src\cxcore\cxarray.cpp, line 2476
Traceback (most recent call last):
File "find_obj.py", line 114, in <module>
imageDescriptors = surf(image, mask, imageKeypoints)
RuntimeError: M:\programming\packages\opencv\workspace\2.1\OpenCV-2.1.0\src\cxco
re\cxarray.cpp:2476: error: (-206) Unrecognized or unsupported array type in fun
ction cvGetMat
有没有人知道这可能是什么原因呢?
我使用的循环是
myloop = 1
while myloop == 1 :
这个链接是完整的代码。
1 个回答
0
看你代码的时候,有几个问题立刻就浮现在我脑海里。首先,你在每次循环的时候都在创建一个新的 Mat() 对象,还有两个新的 namedWindow 对象。这样做可能会导致内存错误,尤其是在循环几千次之后(这取决于你的电脑和操作系统),不过这可能不是你主要的问题。但无论如何,这样做是个很糟糕的习惯。
其次,我发现你的代码是从摄像头扫描一张图片,保存到文件里,然后再把这个文件重新加载到内存中来使用!我理解你想保存一份摄像头里的图片,但其实你已经在内存中有了这张图片,为什么还要重新加载呢?如果你是在 Windows 系统上,这可能是导致你出现问题的原因,因为 VC++10 的库在使用 imwrite 和 imread 时是有一些已知问题的。[编辑] 我知道你在用 Python,但你的程序报错是来自一个 .cpp 文件,这意味着你的 Python 导入实际上是链接到某个 C++ 库的 [/编辑]
试着在你的循环中去掉 imwrite 和 imread 的调用,直接使用摄像头里的图片。如果这样修改后你的代码能正常工作,那你就知道问题出在哪里了。告诉我们结果如何。