在尝试使用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 :
此link是完整的代码。
答案 0 :(得分:0)
在仔细阅读代码后会立即想到一些事情。首先,您在循环时声明一个新的Mat()和两个新的namedWindow对象。虽然这可能会在几千次循环后导致内存错误(取决于您的计算机和操作系统),但这可能不是您的主要问题。然而,这是一种糟糕的做事方式和不良习惯。
我的第二个问题是您从摄像机扫描图像,将其保存到文件,然后将文件重新加载到内存中,以便您可以使用图像!我理解想要从相机中保存内存中的图像副本,但是你已经将它存储在内存中,那么为什么要重新加载呢?如果你在Windows上,这可能是你的坏矩阵的来源,因为已知VC ++ 10库有一些imwrite和imread的问题。 [编辑]我知道你正在使用python,但你的程序报告来自.cpp文件的错误,这意味着python导入实际上链接到某处的c ++库[/ EDIT]
尝试在循环中删除imwrite和imread调用,并直接使用相机中的图像。如果您的代码在此之后有效,那么您就会知道问题出在哪里。让我们知道它是怎么回事。