当前位置: 首页 > 知识库问答 >
问题:

OpenCV断言失败错误:(-215)scn==3||scn==4在函数cv::cvtColor作品ALTERNATE次

长孙知
2023-03-14

我是Python和OpenCV的初学者。我正在尝试一段代码,它从网络摄像头获取输入图像。下面是一段代码。

cam = create_capture(video_src, fallback='synth:bg=../cpp/lena.jpg:noise=0.05')    
while True:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.equalizeHist(gray)

    rects = detect(gray, cascade)
    vis = img.copy()
    draw_rects(vis, rects, (0, 255, 0))
    for x1, y1, x2, y2 in rects:
        roi = gray[y1:y2, x1:x2]
        vis_roi = vis[y1:y2, x1:x2]
        subrects = detect(roi.copy(), nested)
        draw_rects(vis_roi, subrects, (255, 0, 0))
    dt = clock() - t

    draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))

    cv2.imshow('facedetect', vis)
    if 0xFF & cv2.waitKey(5) == 27:
        break

    cv2.setMouseCallback('facedetect',capture_image)

cv2.destroyAllWindows()

我同时使用Python2.7和Python3.4来执行此操作。在这两方面,我都面临一个奇怪的问题。代码给出了如下断言错误

OpenCV错误:cv::cvtColor,文件中的断言失败(scn==3 | | scn==4)。。。。。。。。\opencv\modules\imgproc\src\color。cpp,第3737行灰色=cv2。CVT颜色(img,cv2.颜色为灰色)cv2。错误:。。。。。。。。\opencv\modules\imgproc\src\color。cpp:3737:错误:(-215)scn==3 | | scn==4在函数cv::cvtColor中

但这种情况只会在跑步的每一个交替时间发生。可能是什么问题?我从其他帖子中读到,当cv2时,会发生这个错误。cvtColor尝试转换没有3或4个通道的空图像。这通常在指定错误路径时发生。就我的情况而言,由于它每隔一段时间都能正常工作,因此来源不可能是错误的。请帮忙!!

共有2个答案

游高杰
2023-03-14

使用时间。进入while循环或cap之前,先睡眠(2)。read()。这一次将帮助你的相机卷轴。

牛枫
2023-03-14

至少我在你的代码中没有发现任何重大问题,即“应该工作”。问题似乎出在相机驱动程序上。相机不同,相机驱动程序也不同(又名越野车)。

不幸的是,调试相机驱动程序并不是一项非常容易的任务。奇怪的行为很可能与特定的摄像机、操作系统、OpenCV和摄像机驱动程序版本绑定。司机不太可能被修好。试着让一切保持最新。

然而,由于您的相机可以捕捉每一秒的图像,因此还有很多事情要做。

首先,通过替换来验证问题确实存在于摄像机驱动程序中:

cam = create_capture(video_src, fallback='synth:bg=../cpp/lena.jpg:noise=0.05')

通过

cam = create_capture('synth:bg=../cpp/lena.jpg:noise=0.05')

从代码中可能可以明显看出,这将强制模拟摄影机。函数create\u capture只是提供此功能的VideoCapture的包装。如果您的代码运行良好,则问题出在视频驱动程序中。

验证后,您可以尝试运行以下代码:

import cv2

cam = cv2.VideoCapture(0)
cam.open(0)
results = [ cam.read()[0] for i in range(100) ]
print results

这应该会创建一个100个Trues的列表,这个过程应该需要几秒钟,因为相机应该捕获100个连续的图像。

在代码中,您似乎没有使用cam的返回元组中的第一个值。阅读ret在代码中)。如果真的捕获了图像,则为True。另外,cam。读取应在有图像可用之前停止,无需添加任何延迟。

您很可能会得到一个列表[True,False,True,False,…] 因为视频驱动程序做了一些奇怪的事情。没有什么好办法可以解决这个问题,但有一个丑陋的办法。将捕获行替换为:

# 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.")

当然,驱动程序可能会坏到你不得不偶尔释放并重新打开它。更丑但也可行。

总结:“很可能它无法治愈,也不会致死,而且有药物可以缓解症状。”

 类似资料:
  • 问题内容: 我个人在这个问题上花了很多时间,因此认为与将其发布到Stackoverflow有关。 问题取自:llSourcell / Object_Detection_demo_LIVE 问题答案: 甚至我也遇到了同样的问题,解决方案非常简单。请记住一件事,如果图像的RGB值在0-255的范围内,请确保这些值不是数据类型“ float”。由于OpenCV仅在值范围为0-1时才考虑浮动。如果发现浮点

  • 我试图创建一个ROI以上的脸检测到放置一顶帽子,如图所示:Plz点击这里:ROI以上的脸创建放置一顶帽子 OpenCV错误:断言失败(0<=ROI.X&&0<=ROI.Width&&ROI.X+ROI.Width<=M.cols&&0<=ROI.Y&&0<=ROI.Y&&0<=ROI.Y&&0<=ROI.Height&&ROI.Y+ROI.Height<=M.rows)在Mat中,文件/home/

  • 我正在用java开发一个程序,该程序使用opencv库获取一个图像文件夹并裁剪人脸。它使用了OpenCV中的人脸识别。我使用了它,但当我尝试使用更大的图像文件夹时,它会出现以下错误: OpenCV错误:Cv::OutOfMemoryError中内存不足(无法分配411068928字节),文件C:\builds\master_packslaveAddon-Win32-VC12-static\Open

  • 我是OpenCV的新手,我想练习一个简单的人脸检测和图像裁剪。 具体来说,我使用从文件夹中加载图像,然后检测人脸,在检测到的人脸上绘制矩形,然后只裁剪检测到的人脸区域。 OpenCV错误:断言失败(0<=ROI.X&&0<=ROI.Width&&ROI.X+ROI.Width<=M.cols&&0<=ROI.Y&&0<=ROI.Height&&ROI.Y+ROI.Height<=M.rows),在

  • 我是JMeter和断言概念的新手。当我试图执行一个JMX文件(包含JMeter中的断言)时,遇到了以下错误消息: 断言错误:错误断言失败:真断言失败消息:测试失败:变量(搜索结果)不相等/接收:找不到[[[]]]]比较:找不到[[[]]]]] 脚本的执行方式如下:$java-jar./apache-jmeter-2.10/bin/apachejmeter.jar-t./jmeter-master/