cvtColor无法断言scn==3 | | scn==4,但映像确实有3个通道并且存在

2024-06-09 04:49:51 发布

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

我试着用树莓皮做面部检测,所以我想找到最快的方法来做任何事情。(700MHz处理器上的每毫秒计数!)在

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

  • 获取网络摄像头图片(可选择游戏机摄像头或openCV的cv2.VideoCapture)
  • 调整大小、转换为灰度,以及(如果需要)转换为numpy和rotate。在

这听起来很奇怪,但是为了拍摄照片,游戏机摄像头比树莓派上的openCV快60毫秒。在

假设从pygame曲面到numpy的额外转换,加上90度旋转,所需时间不到60毫秒,那么使用混合模式是值得的。在

这里的问题是我得到了一个奇怪的cvtColor错误,声称我的numpy ndarray(目前opencv2.0的后端)没有3到4个通道。在

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

这是精简后的代码。在

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)

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

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

^{pr2}$

这是怎么回事?在


Tags: 代码imageimportnumpygetcv2opencvpygame
1条回答
网友
1楼 · 发布于 2024-06-09 04:49:51

找到了答案。显然,numpy实际上并没有在您处理ndarray时更新它们,它只是将临时更改记在心里。那样的话一切都很好很快。在

虽然OpenCV 2的C++版本可以处理,但是Python绑定不能——而且因为pyGooS的SurfAlgt代码工作于NUMPY,任何类型的情况下,你去pyGoope≫OpenCV都会碰到这个问题。在

话说回来,你只要打个电话就行了numpy.复制()你打电话后pygame.surfarray.array3d(). 在

新副本将没有这些临时更改。因此,不必费心使用array3d(),只需使用pixels3d()-无论如何,您都必须复制一个副本,所以不要创建两个副本。在

为了了解更多信息,我认为这些临时性的变化被称为“大步前进”或类似的东西。在

相关问题 更多 >