我编写了一个程序,可以从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:由于线程之间缺乏同步而出现问题。将捕获移动到处理循环,现在它完美无缺,并且速度几乎与单独线程中的速度相同......
答案 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 ,否则,请尝试捕获另一帧。
如果反复拍摄失败,则表明与相机的连接断开。