OpenCV断言失败错误:函数cv::cvtColor works ALTERNATE times中的(-215)scn==3 | | scn==4

2024-10-04 15:21:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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 Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file ........\opencv\modules\imgproc\src\color.cpp, line 3737 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.error: ........\opencv\modules\imgproc\src\color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

但它只在每一次跑步的交替时间发生。可能是什么问题?我从其他文章中了解到,当cv2.cvtColor试图转换没有3或4个通道的空图像时,会发生此错误。当指定了错误的路径时,通常会发生这种情况。对我来说,因为它每一次都运行良好,所以来源不可能是错误的。请帮忙!!


Tags: 代码srcimg错误cv2viscppx1
2条回答

在进入while循环或cap.read()之前使用time.sleep(2)。这一次会帮助你的相机加速。

至少我在你的代码中没有发现任何主要问题,即“应该工作”。问题似乎出在摄像机驱动程序上。摄像头不同,摄像头驱动程序也不同(也称为小车)。

不幸的是,调试相机驱动程序不是一个很容易的任务。奇怪的行为很可能与特定的相机、操作系统、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_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.readret)中的第一个值。如果图像真的被捕获了,那就是True。另外,cam.read应该阻塞,直到有可用的图像,不需要添加任何延迟。

很可能你会得到一个列表[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.")

当然,司机可能已经坏了,你必须偶尔释放并重新打开它。更丑但也可行。

小结:“很可能它不能治愈,它不会杀死你,而且有药物可以缓解症状。”

相关问题 更多 >

    热门问题