Python 3.x 如何脱离RaspberryPi Cam的AWB/AE(Raspi4、RaspiCamV2.1、Python、OpenCV)

Python 3.x 如何脱离RaspberryPi Cam的AWB/AE(Raspi4、RaspiCamV2.1、Python、OpenCV),python-3.x,opencv,camera,raspberry-pi4,Python 3.x,Opencv,Camera,Raspberry Pi4,我正在使用 -树莓型4 -覆盆子照相机2.1版 -蟒蛇3 -OpenCV3 试图从电影中捕捉色彩,并成功地模仿 但由于AWB/AE,有时会错过目标 我试图阻止他们 OpenCVs“.set” -->不支持 “raspivid”命令 -->不对 picamera.camera()模块 -->cv2.CVT颜色(框架,cv2.COLOR_BGR2HSV) 这是一个错误 我找不到正确的方法。 希望能提供帮助,谢谢。有控制自动白平衡()和自动曝光()的属性 据我所知,可以在python中使用它们(而不是

我正在使用 -树莓型4 -覆盆子照相机2.1版 -蟒蛇3 -OpenCV3 试图从电影中捕捉色彩,并成功地模仿

但由于AWB/AE,有时会错过目标

我试图阻止他们

  • OpenCVs“.set”

    -->不支持

  • “raspivid”命令

    -->不对

  • picamera.camera()模块

    -->cv2.CVT颜色(框架,cv2.COLOR_BGR2HSV) 这是一个错误

  • 我找不到正确的方法。
    希望能提供帮助,谢谢。

    有控制自动白平衡()和自动曝光()的属性

    据我所知,可以在python中使用它们(而不是像链接到的代码中那样使用原始整数值):

    但请注意,这并不适用于所有后端,至少GStreamer没有提供控制摄像头参数的方法,而V4L2则取决于摄像头驱动程序

    您可以通过在第二个参数处将API传递给构造函数来强制使用它。

    自己解决它

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    import picamera
    import time
    
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    
    def detect(img):
        hsv_min = np.array([20,100,80])
        hsv_max = np.array([27,255,255])
        masked = cv2.inRange(img, hsv_min, hsv_max)
    
        return masked
    
    
    def main():
        #camera mode
        camera = PiCamera()
        camera.resolution = (640, 480)
        camera.framerate = 20
        camera.awb_mode = 'fluorescent'
        camera.awb_gains = 4
        camera.exposure_mode = 'off'
        capture = PiRGBArray(camera, size=(640, 480))
    
        # allow the camera to warmup
        time.sleep(0.1)
    
        for frame in camera.capture_continuous(capture, format="bgr", use_video_port=True):
            image = frame.array
            hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
            mask = detect(hsv)
    
            label = cv2.connectedComponentsWithStats(mask)
    
            cv2.imshow("Image", image)
            cv2.imshow("Mask", mask)
    
            key = cv2.waitKey(1) & 0xFF
            capture.truncate(0)
    
            if cv2.waitKey(25) & 0xFF == ord('q'):
                break
    
    if __name__ == '__main__':
        main() 
    

    谢谢合作

    当然,有时短时间内可能会错过目标。这取决于很多事情。但是你可以保持目标的最后一个坐标直到下一次检测。您好,欢迎来到SO。我不是什么大专家,但你最好打开AWB/AE。你应该阅读更多关于用相机编程拍照的内容。它有很多依赖项,但一般流程是“触发搜索焦点”->“锁定焦点”->“触发搜索曝光”->“锁定曝光”->“触发搜索WB”->“锁定WB”->“拍照”。如果任何一个步骤失败或超时,那么你必须正确处理它。现在还不清楚你到底想做什么:你正在试图关闭自动白平衡和自动曝光吗?如果是这样,那你为什么要把BGR转换成HSV呢?谢谢你的回复。对于anotoine,BGR到HSV更容易找到具有选择色调的颜色。与我的代码基本相同。谢谢,但不幸的是,我尝试了这种方法。您是对的,我的camea(=raspberrypi cam)可能不受cap.set(15,0)/cap.set(16,0)支持,因为它不工作。capset(10,*)工作。
    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    import picamera
    import time
    
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    
    def detect(img):
        hsv_min = np.array([20,100,80])
        hsv_max = np.array([27,255,255])
        masked = cv2.inRange(img, hsv_min, hsv_max)
    
        return masked
    
    
    def main():
        #camera mode
        camera = PiCamera()
        camera.resolution = (640, 480)
        camera.framerate = 20
        camera.awb_mode = 'fluorescent'
        camera.awb_gains = 4
        camera.exposure_mode = 'off'
        capture = PiRGBArray(camera, size=(640, 480))
    
        # allow the camera to warmup
        time.sleep(0.1)
    
        for frame in camera.capture_continuous(capture, format="bgr", use_video_port=True):
            image = frame.array
            hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
            mask = detect(hsv)
    
            label = cv2.connectedComponentsWithStats(mask)
    
            cv2.imshow("Image", image)
            cv2.imshow("Mask", mask)
    
            key = cv2.waitKey(1) & 0xFF
            capture.truncate(0)
    
            if cv2.waitKey(25) & 0xFF == ord('q'):
                break
    
    if __name__ == '__main__':
        main()