zoukankan      html  css  js  c++  java
  • 利用opencv从USB摄像头获取图片

    由于opencv自带的VideoCapture函数直接从usb摄像头获取视频数据,所以用这个来作为实时的图像来源用于实体检测识别是很方便的。

    1. 安装opencv

    安装的步骤可以按照之前这个文章操作。如果在测试的时候:

    cam = cv2.VideoCapture(0)
    print cam.isOpend()
    

    返回了False,很有可能是在安装的时候cmake的配置没有设置后,可以make uninstall之后重新cmake。

    2. 安装usb摄像头驱动(这个一般都不需要)

    如果系统没有预装usb摄像头的驱动,那么根据所用的摄像头安装相应的驱动即可。安装完之后可以用lsusb或者v4l2-ctl --list-device命令查看当前链接的usb设备来确认。这里我们使用的摄像头是罗技c930e。

    3. 设置摄像头参数

    设置可以在脚本中用opencv或者在命令行用v4l2-ctl命令设置:
    1). opencv

    """
    0. CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
    1. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
    3. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file
    4. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
    5. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
    6. CV_CAP_PROP_FPS Frame rate.
    7. CV_CAP_PROP_FOURCC 4-character code of codec.
    8. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
    9. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
    10. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
    11. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
    12. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
    13. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
    14. CV_CAP_PROP_HUE Hue of the image (only for cameras).
    15. CV_CAP_PROP_GAIN Gain of the image (only for cameras).
    16. CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
    17. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
    18. CV_CAP_PROP_WHITE_BALANCE Currently unsupported
    19. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
    """
    
    # set camera properties
    cam.set(4, 1280)     # img width,第一个数字对应上述属性
    cam.set(5, 640)     # img height
    cam.set(6, 24)      # video FPS
    

    2). v4l2-ctl
    首先用v4l2-ctl --list-device确定usb摄像头的device编号(一般为/dev/video0),然后查看该设备可以设置的参数:

    v4l2-ctl -d /dev/video0 --list-ctrls
    

    罗技c930e摄像头的参数如下:

                         brightness (int)    : min=0 max=255 step=1 default=-8193 value=128
                           contrast (int)    : min=0 max=255 step=1 default=57343 value=128
                         saturation (int)    : min=0 max=255 step=1 default=57343 value=128
     white_balance_temperature_auto (bool)   : default=1 value=1
                               gain (int)    : min=0 max=255 step=1 default=57343 value=0
               power_line_frequency (menu)   : min=0 max=2 default=2 value=2
          white_balance_temperature (int)    : min=2000 max=6500 step=1 default=57343 value=4000 flags=inactive
                          sharpness (int)    : min=0 max=255 step=1 default=57343 value=128
             backlight_compensation (int)    : min=0 max=1 step=1 default=57343 value=0
                      exposure_auto (menu)   : min=0 max=3 default=0 value=3
                  exposure_absolute (int)    : min=3 max=2047 step=1 default=250 value=250 flags=inactive
             exposure_auto_priority (bool)   : default=0 value=1
                       pan_absolute (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                      tilt_absolute (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                     focus_absolute (int)    : min=0 max=250 step=5 default=8189 value=0 flags=inactive
                         focus_auto (bool)   : default=1 value=1
                      zoom_absolute (int)    : min=100 max=500 step=1 default=57343 value=100
    

    最后可以可以设置参数了:

    v4l2-ctl --set-ctrl=zoom_absolute=200    #放大两倍
    

    4. opencv获取图片

    这个就很简单了,这里就说明下用waitKey参数来用键盘输入控制视频流:

    import cv2
    
    cam = cv2.VideoCapture(0)
    img_counter = 0
    while cam.isOpened():
        ret, frame = cam.read()
        cv2.imshow("test", frame)
        if not ret:
            break
        key = cv2.waitKey(1) & 0xFF
    
        if key == 27: 
            # press ESC to escape (ESC ASCII value: 27)
            print("Escape hit, closing...")
            break
        elif key == 32:
            # press Space to capture image (Space ASCII value: 32)
            img_name = "opencv_frame_{}.png".format(img_counter)
            cv2.imwrite(img_name, frame)
            print("{} written!".format(img_name))
            img_counter += 1
        else:
            pass
    cam.release()
    cv2.destroyAllWindows()
    

    PS:waitKey(1) & 0xFF获取当前按的键的ascii码,如果要用其他键来控制,用相应键的ascii码替换即可。(ascii码查询)。

    参考

    1. http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture
    2. http://stackoverflow.com/questions/11420748/setting-camera-parameters-in-opencv-python
    3. http://kurokesu.com/main/2016/01/16/manual-usb-camera-settings-in-linux/
    4. http://stackoverflow.com/questions/34588464/python-how-to-capture-image-from-webcam-on-click-using-opencv
    5. http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00000520.html
  • 相关阅读:
    关于数据结构的建立
    让背景居中
    亲,你还在使用IE6吗?你 OUT 了!
    ASP 编程 防止字符编码出现乱码的最佳办法
    asp无组件上传图片 动态保存文件名 upload.inc逐句翻译
    微信小程序 textarea 简易解决方案
    PHP ckeditor富文本编辑器 结合ckfinder实现图片上传功能
    PHP 苹果消息推送
    PHP短信发送服务 youe短信企业服务
    c#简单易用的短信发送服务 悠逸企业短信服务
  • 原文地址:https://www.cnblogs.com/arkenstone/p/6872665.html
Copyright © 2011-2022 走看看