【问题标题】:Opencv raspicamOpencv raspicam
【发布时间】:2016-02-14 15:49:50
【问题描述】:

您好,我想运行此代码以在带有 OpenCV 的树莓派 B 上使用 raspicam 检测汽车,但遇到了错误。

import numpy as np
import cv2

car_cascade = cv2.CascadeClassifier('cars3.xml')
cap = cv2.VideoCapture(0)

while 1:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cars = car_cascade.detectMultiScale(gray, 1.3, 5)

    for (x,y,w,h) in cars:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]

    cv2.imshow('img',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

运行代码后返回

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /home/pi/installopencv/opencv-3.1.0/modules/imgproc/src/color.cpp, line 8000
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: /home/pi/installopencv/opencv-3.1.0/modules/imgproc/src/color.cpp:8000: error: (-215) scn == 3 || scn == 4 in function cvtColor

发生错误是因为我使用的是 raspicam 并且“cap = cv2.VideoCapture(0)”仅适用于网络摄像头吗?我尝试启用 V4L2 模块,但效果不佳

【问题讨论】:

    标签: python opencv raspberry-pi2 haar-classifier


    【解决方案1】:

    如果您想使用 Raspberry PI 摄像头模块,请使用 picamera 模块获取帧,而不是 OpenCV'2 videoCapture 模块。特别是您要安装支持数组的模块:

    pip install "picamera[array]"
    

    这将允许您轻松地将帧传递给 OpenCV。 关于如何从头开始here 有一个很好的教程 这是它的要点:

    # import the necessary packages
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2
    
    # initialize the camera and grab a reference to the raw camera capture
    camera = PiCamera()
    camera.resolution = (640, 480)
    camera.framerate = 32
    rawCapture = PiRGBArray(camera, size=(640, 480))
    
    # allow the camera to warmup
    time.sleep(0.1)
    
    # capture frames from the camera
    for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
        # grab the raw NumPy array representing the image, then initialize the timestamp
        # and occupied/unoccupied text
        image = frame.array
    
        # show the frame
        cv2.imshow("Frame", image)
        key = cv2.waitKey(1) & 0xFF
    
        # clear the stream in preparation for the next frame
        rawCapture.truncate(0)
    
        # if the `q` key was pressed, break from the loop
        if key == ord("q"):
            break
    

    在您的情况下,您可能希望将格式从 "rgb" 更改为 "yuv"。 这样,您可以直接提取y(luminosity) 通道,这将是您的灰度方法。希望您不必进行色彩空间转换(从 BGR 到灰度)和从 CSI(而不是 USB)获取帧,从而在速度上获得小幅提升。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 1970-01-01
      • 2020-09-29
      • 2016-06-11
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2014-06-25
      • 2014-06-21
      相关资源
      最近更新 更多