Python / OpenCV - 间歇性错误

时间:2016-01-13 14:29:24

标签: python opencv image-processing

我编写了一个程序,可以从usb摄像头捕获图像,并根据每帧中的颜色检测跟踪对象位置。间歇性的(这可能发生在1分钟,10分钟或半小时后)我收到错误消息:

OpenCV Error: Assertion failed (depth == CV_8U || depth == CV_16U || depth == CV_32F) in cv::cvtColor, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp, line 7343
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile
    execfile(filename, namespace)
  File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)
  File "D:/file.py", line 371, in <module>
    hsv_frame = cv2.cvtColor(blur_frame, cv2.COLOR_BGR2HSV)
cv2.error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp:7343: error: (-215) depth == CV_8U || depth == CV_16U || depth == CV_32F in function cv::cvtColor

我遵循的流程是:

  
      
  • 使用相机拍摄相框,cap = cv2.VideoCapture(1)/ cap.read()
  •   
  • 变换几何,cv2.warpPerspective
  •   
  • 高斯模糊滤镜,cv2.GaussianBlur
  •   
  • BGR转换为HSV,cv2.cvtColor(blur_frame,cv2.COLOR_BGR2HSV)
  •   
  • 轮廓查找和分析,cv2.threshold
  •   

它有时完美无瑕。然后我突然收到停止程序的错误消息。我觉得很奇怪它发生在这个过程的后期。如果是由于相机驱动程序损坏,错误应该更早发生?

有什么想法会导致这种情况吗?

编辑1:是否可以从持有框架的全局变量中抓取框架,同时从流程线程写入框架?

编辑2:由于线程之间缺乏同步而出现问题。将捕获移动到处理循环,现在它完美无缺,并且速度几乎与单独线程中的速度相同......

2 个答案:

答案 0 :(得分:0)

正如GPPK评论的那样,您的相机有时可能无法拍摄照片。这可能是由于竞争条件,IO系统问题,高CPU负载等原因造成的。 在openCV documentation中,您可以看到方法retrieve返回布尔值以及图像 cv2.VideoCapture.retrieve([image[, channel]]) → retval, image
捕获时,只需检查retval是否为True,如果不是,请尝试捕获另一帧。如果捕获重复失败,则与相机的连接中断。

答案 1 :(得分:0)

正如@GPPK所评论的,您的相机有时可能无法捕获图片。发生这种情况的原因可能是竞争状况,IO system中的问题,高CPU负载等。在openCV文档中,您可以看到检索到的方法返回的是布尔值和图像。

cv2.VideoCapture.retrieve([image[, channel]]) → retval, image

捕获时,只需检查retval是否为 True ,否则,请尝试捕获另一帧。

如果反复拍摄失败,则表明与相机的连接断开。