简体   繁体   English

gphoto2 如何处理失焦警告

[英]gphoto2 how to handle Out of Focus warning

Here is how I capture image with my camera这是我用相机拍摄图像的方法

import logging
import gphoto2 as gp
def main():
    def callback(level, domain, string, data=None):
        print('Callback: level =', level, ', domain =', domain, ', string =', string)
        if data:
            print('Callback data:', data)

    logging.basicConfig(
        format='%(levelname)s: %(name)s: %(message)s', level=logging.WARNING)
    callback_obj = gp.check_result(gp.use_python_logging())

    camera = gp.Camera()
    camera.init()
    try:
        camera_file_path = gp.check_result(camera.capture(gp.GP_CAPTURE_IMAGE))
    except gp.GPhoto2Error as ex:
        print("callback: ", ex, ex.code, ex.message, ex.string)
    camera.exit()

if __name__ == "__main__" : exit(main())

If the camera is not able to focus it generates following error如果相机无法对焦,则会产生以下错误

...
WARNING: gphoto2: (ptp_usb_getresp [usb.c:466]) PTP_OC 0x90c8 receiving resp failed: Out of Focus (0xa002)
WARNING: gphoto2: (camera_nikon_capture [library.c:3153]) 'ret' failed: 'Out of Focus' (0xa002)
WARNING: gphoto2: (gp_context_error) Out of Focus
WARNING: gphoto2: (gp_camera_capture [gphoto2-camera.c:1340]) 'camera->functions->capture (camera, type, path, context)' failed: -1
('callback: ', GPhoto2Error('[-1] Unspecified error',), -1, '[-1] Unspecified error', 'Unspecified error')

The exception error code is -1 but how can I capture Out of Focus warning?异常错误代码为-1但如何捕获“ Out of Focus警告?

UPDATE更新

Filtered out unnecessary errors from logs从日志中过滤掉不必要的错误

import logging
import gphoto2 as gp
from datetime import datetime
def main():
    def callback(level, domain, string, data=None):
        err_codes = ("(0x2005)", "(0x2019)")
        if not string.decode().endswith(err_codes):
            print("[{0}] {1}: {2}".format(datetime.utcnow(), domain.decode(), string.decode()))
        if data:
            print('Callback data:', data)

    callback_obj = gp.check_result(gp.gp_log_add_func(gp.GP_LOG_ERROR, callback))
    camera = gp.Camera()
    try:
        camera.init()
    except gp.GPhoto2Error as err:
        exit(err.code)

    try:
        camera_file_path = camera.capture(gp.GP_CAPTURE_IMAGE)
    except gp.GPhoto2Error as err:
        exit(err.code)
    camera.exit()

if __name__ == "__main__" : exit(main())

You've defined a callback function, in which you could parse the error string to detect out of focus, but you haven't installed your callback so libgphoto2 isn't using it.您已经定义了一个回调函数,您可以在其中解析错误字符串以检测失焦,但您尚未安装回调,因此 libgphoto2 未使用它。 Use gp_log_add_func to install your callback.使用gp_log_add_func来安装你的回调。

Also, you're passing the return value of camera.capture to gp.check_result .此外,您将camera.capture的返回值camera.capturegp.check_result This is incorrect as camera.capture already checks the result and raises an exception if there's an error.这是不正确的,因为camera.capture已经检查了结果并在出现错误时引发异常。

If you can figure out the name of the logger, you can add your own handler to it and do your own log processing.如果您能找出记录器的名称,则可以向其中添加自己的处理程序并进行自己的日志处理。

Calling "getLogger" with your camera library's name would get you the logger.使用您的相机库的名称调用“getLogger”将使您获得记录器。

Calling AddHandler on that logger with a custom handler would allow you to do your own log processing for logs coming from that logger.使用自定义处理程序在该记录器上调用 AddHandler 将允许您对来自该记录器的日志进行自己的日志处理。

Please see Python's Logging Cookbook for more info有关更多信息,请参阅Python 的日志记录手册

Hope this helps希望这可以帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM