代码之家  ›  专栏  ›  技术社区  ›  Mat_python

PiCameraValueError:分辨率1920x1080的缓冲区长度不正确

  •  3
  • Mat_python  · 技术社区  · 8 年前

    这是我检测圆/球的代码。 我想用Pi摄像机检测足球。(足球可以是任何颜色。)我遇到了一些PiCameraValueError问题。这个代码有什么问题。我正在使用复盆子Pi 2、Python 2和OpenCV。

    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2
    import sys
    import imutils
    import cv2.cv as cv
    # initialize the camera and grab a reference to the raw camera capture
    camera = PiCamera()
    
    rawCapture = PiRGBArray(camera)
    
    # capture frames from the camera
    for frame in camera.capture_continuous(rawCapture, format="bgr"):
        # grab the raw NumPy array representing the image, then initialize the timestamp
        # and occupied/unoccupied text
        image = frame.array
        img   = cv2.medianBlur(image, 5)
        imgg  = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
        cimg  = cv2.cvtColor(imgg, cv2.COLOR_GRAY2BGR)
        imgg  = cv2.blur(imgg, (3,3))
                #imgg = cv2.dilate(imgg, np.ones((5, 5)))
                #imgg = cv2.GaussianBlur(imgg,(5,5),0)
        circles = cv2.HoughCircles(imgg, cv.CV_HOUGH_GRADIENT, 1, 20, param1=100, param2=40, minRadius=5, maxRadius=90)
        cv2.imshow("cimg", imgg)
        key = cv2.waitKey(1)
        if key & 0xFF == ord('q'):
            break
        if circles is None:
            continue
    
        print circles
                #circles = np.uint16(np.around(circles))
        for i in circles[0,:]:
            cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1) # draw the outer circle
                       #cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) # draw the center of the circle
            cv2.imshow("Filtered", cimg)
    
    cv2.destroyWindow("cimg")
    cv2.destroyAllWindows() 
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Community CDub    7 年前

    如所解释的 here ,

    这个 PiCameraValueError 键盘中断异常。这很正常,不是一个bug (这更多地是输出机制的通用性的结果 picamera),但在Python 2中很难检测和响应 (通常的方法可能是抓住 PiCameraValueError以及主脚本运行的任何循环中)。 在Python 3下, exception chaining 可能会在异常堆栈中查找 键盘中断一。

    您需要做的是清除捕获之间的流。这个 PiRGBArray 文档介绍了如何使用truncate函数进行此操作。

    这里是来自, python face detection raspberry pi with picamera

    import io
    import time
    import picamera
    with picamera.PiCamera() as camera:
        stream = io.BytesIO()
        for foo in camera.capture_continuous(stream, format='jpeg'):
        # YOURS:  for frame in camera.capture_continuous(stream, format="bgr",  use_video_port=True):
            # Truncate the stream to the current position (in case
            # prior iterations output a longer image)
            stream.truncate()
            stream.seek(0)
            if process(stream):
                break