<p>至少我在你的代码中没有发现任何主要问题,即“应该工作”。问题似乎出在摄像机驱动程序上。摄像头不同,摄像头驱动程序也不同(也称为小车)。</p>
<p>不幸的是,调试相机驱动程序不是一个很容易的任务。奇怪的行为很可能与特定的相机、操作系统、OpenCV和相机驱动程序版本有关。司机不太可能修好。尽量把一切都更新。</p>
<p>然而,由于你的相机可以捕捉每一秒的图像,有一些事情要做。</p>
<p>首先,通过替换以下项来验证问题是否确实存在于相机驱动程序中:</p>
<pre><code>cam = create_capture(video_src, fallback='synth:bg=../cpp/lena.jpg:noise=0.05')
</code></pre>
<p>由</p>
<pre><code>cam = create_capture('synth:bg=../cpp/lena.jpg:noise=0.05')
</code></pre>
<p>从代码中可以很明显地看出,这迫使摄像机进行模拟。函数<code>create_capture</code>只是提供此功能的<code>VideoCapture</code>的包装。如果代码运行良好,则问题出在视频驱动程序中。</p>
<p>验证后,可以尝试运行以下代码:</p>
<pre><code>import cv2
cam = cv2.VideoCapture(0)
cam.open(0)
results = [ cam.read()[0] for i in range(100) ]
print results
</code></pre>
<p>这将创建一个100个Trues的列表,这个过程需要几秒钟,因为相机应该捕获100个连续的图像。</p>
<p>在代码中,您似乎没有使用返回元组<code>cam.read</code>(<code>ret</code>)中的第一个值。如果图像真的被捕获了,那就是<code>True</code>。另外,<code>cam.read</code>应该阻塞,直到有可用的图像,不需要添加任何延迟。</p>
<p>很可能你会得到一个列表<code>[True, False, True, False, ...]</code>,因为视频驱动程序做了一些奇怪的事情。没有漂亮的方法可以解决这个问题,但是有一个丑陋的方法。将捕获线替换为:</p>
<pre><code># max. 10 retries
for i in range (10):
ret, img = cam.read()
if ret:
break
else:
# capture failed even after 10 tries
raise MyExceptiom("Video driver does not like me.")
</code></pre>
<p>当然,司机可能已经坏了,你必须偶尔释放并重新打开它。更丑但也可行。</p>
<p>小结:“很可能它不能治愈,它不会杀死你,而且有药物可以缓解症状。”</p>