gpt4 book ai didi

python - cvtColor 断言失败 scn == 3 || scn ==4,但是图像确实有3个 channel 并且存在

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:25 28 4
gpt4 key购买 nike

我正在尝试在 Raspberry Pi 上运行人脸检测,因此我正在尝试找到最快的方法来完成所有操作。 (在 700MHz 处理器上,每一毫秒都至关重要!)

我做了一个快速的速度测试,使我需要检查的各种选项超时,它们是:

  • 获取网络摄像头图片(选择pygame.camera或openCV的cv2.VideoCapture)
  • 调整大小,转换为灰度,并(如果需要)转换为 numpy 并旋转。

这听起来很奇怪,但是对于捕获图片,pygame.camera 在树莓派上比 openCV 快大约 60 毫秒。

假设从 pygame 表面到 numpy 的额外转换,加上 90 度旋转,需要不到 60 毫秒,那么混合使用是值得的。

这里的问题是我收到一个奇怪的 cvtColor 错误,声称我的 numpy ndarray(目前 opencv 2.0 的后端)没有 3 或 4 个 channel 。

这很奇怪,因为我在调用 cvtColor 之前打印出了 ndarray 的形状,它有 3 个 channel 。我只能假设我遗漏了一些非常明显的东西。

这是简化后的代码。

import pygame
import cv2
import numpy
from pygame import camera

pygame.init()
pygame.camera.init()

#get one shot from pygame camera
cam_list = pygame.camera.list_cameras()
pywebcam = pygame.camera.Camera(cam_list[0],(640,480))
pywebcam.start()
image = pywebcam.get_image()

for z in xrange(50):
image = pywebcam.get_image()

pywebcam.stop()

if image:
#numpy (convert to numpy as fast as possible)
numpy_image=pygame.surfarray.array3d(image)

print(numpy_image.shape)
numpy_image=cv2.cvtColor(numpy_image,cv2.COLOR_BGR2GRAY)
numpy_image = cv2.resize(numpy_image, (0,0), fx=0.25, fy=0.25)
numpy_image = numpy.rot90(numpy_image,3)

编辑:删除了一堆代码。新代码删除了所有分析。

我从这个程序得到的输出是:

Average time in range: 58.64 ms.

Pausing to ensure webcam is freed.

Average time in range: 115.56 ms.

(480, 640, 3)
Pure NumPy
0 ms to printing shape.
39 ms to convert to grayscale.
16 ms to resize.
0 ms to rotate.
58 total ms.

(640, 480, 3)
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /build/opencv-XZa2gn/opencv-2.3.1/modules/imgproc/src/color.cpp, line 2834
Traceback (most recent call last):
File "profile.py", line 72, in <module>
numpy_image=cv2.cvtColor(numpy_image,cv2.COLOR_BGR2GRAY)
cv2.error: /build/opencv-XZa2gn/opencv-2.3.1/modules/imgproc/src/color.cpp:2834: error: (-215) scn == 3 || scn == 4 in function cvtColor

这是怎么回事?

最佳答案

找到了答案。显然,当你处理它们时,numpy 实际上并没有更新 ndarray,它只是记住了临时的变化。这样事情就变得又好又快。

虽然 opencv 2.0 的 C++ 版本可以处理这个问题,但 python 绑定(bind)不能——而且由于 pygame 的 surfarray 代码可以在 numpy 上运行,任何你使用 pygame->opencv 的情况都会遇到这个问题。

话虽如此,您需要做的就是在调用 pygame.surfarray.array3d() 之后调用 numpy.copy()。

新副本不会有任何这些临时更改。因此,不要为 array3d() 而烦恼,只需使用 pixels3d() - 无论如何你都必须制作一个副本,所以不要制作两个。

有关更多信息,我认为临时更改称为“步幅”或类似的东西。

关于python - cvtColor 断言失败 scn == 3 || scn ==4,但是图像确实有3个 channel 并且存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23765886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com