firewirecameras.h

来自「一个语言识别引擎」· C头文件 代码 · 共 220 行

H
220
字号
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-

/*
 * Copyright (C) 2006 Charles C. Kemp
 * CopyPolicy: Released under the terms of the GNU GPL v2.0.
 *
 */


// By cckemp mit edu
// Modded by paulfitz mit edu
// re-adapted for YARP2, by nat (almost nothing done)

#ifndef FIREWIRECAMERAS
#define FIREWIRECAMERAS

#include "GlobalMathHelper.h"

extern "C"{
#include <libdc1394/dc1394_control.h>
#include <libraw1394/raw1394.h>
}

#include "daq_state.h"

#define MAX_NUM_CAMERAS 2


//need to fix this 20040908 cckemp
//no cameras need to be shutdown,
//since none are currently valid and started
//free(): invalid pointer 0x40247620!
//now trying to destroy handle for dc1394...destroyed.
//firewire shutdown complete.

class CCKCamera
{
public:
  
    dc1394_camerainfo camera_info;
    dc1394_feature_set feature_set;
    dc1394_miscinfo misc_info;
    dc1394_cameracapture capture;
 
    DAQState dstate;
};

//shutter influences motion blur and image brightness
//gain and shutter have a large impact on image brightness
//brightness has a smaller impact on image brightness 
//gain seems to introduce the most noise for image brightness increase
           
enum CaptureType{ _320x240, _160x120, _160x120_3x3, _160x120_5x5};

class FWCameras
{
public:

    ~FWCameras() {}

    FWCameras(bool dma_on_in=true)
    {}

    bool Restart(bool dma_on_in=true) {
        Shutdown();
        init_cameras(dma_on_in);
        return(a_camera_is_ready());
    }
    void Shutdown() { shutdown_firewire(); }

    int GetNumberOfCameras() {return(num_cameras);}

    int HowManyCamerasAreReady() {
        int n=0;
        for(int c=0; c<GetNumberOfCameras(); c++)
            if(cam_num_ok(c)) n++;
        return(n);
    }

    int getBufferLength(int camera_num=0);
    int getX(int camera_num=0);
    int getY(int camera_num=0);

    bool CameraIsReady(int camera_num=0){
        return(cam_num_ok(camera_num));
    }

    bool Capture(unsigned char *im, int camera_num=0);
		     
    void SetCaptureSize(CaptureType capture_size_in) { capture_size = capture_size_in; }
    void SetJpgQuality(int jpg_quality_in) { jpg_quality = jpg_quality_in; }
    int GetJpgQuality() { return(jpg_quality); }

    void SetAuto(bool auto_adjustment_on, int camera_num=0);
    void SetToDefaults(int camera_num = 0) {
        DAQState ds;
        Set(ds, camera_num, true);
    }

    void SetExposure(int exposure_in, int camera_num=0);
    void SetShutter(int shutter_in, int camera_num=0);
    void SetGain(int gain_in, int camera_num=0);
    void SetBrightness(int brightness_in, int camera_num=0);
    void SetColor(int u_b_in, int v_r_in, int camera_num=0);
  
    void SetExposure(float exposure_in, int camera_num=0);
    void SetShutter(float shutter_in, int camera_num=0);
    void SetGain(float gain_in, int camera_num=0);
    void SetBrightness(float brightness_in, int camera_num=0);
    void SetColor(float u_b_in, float v_r_in, int camera_num=0);

    float GetFExposure(int camera_num=0) { return(cameras[camera_num].dstate.GetFExposure()); }
    float GetFShutter(int camera_num=0) { return(cameras[camera_num].dstate.GetFShutter()); }
    float GetFGain(int camera_num=0) { return(cameras[camera_num].dstate.GetFGain());}
    float GetFBrightness(int camera_num=0) { return(cameras[camera_num].dstate.GetFBrightness()); }
    float GetFUBColor(int camera_num=0) { return(cameras[camera_num].dstate.GetFUBColor()); }
    float GetFVRColor(int camera_num=0) { return(cameras[camera_num].dstate.GetFVRColor()); }

    void Set(DAQState & dstate_in, int camera_num = 0, bool force = false)
    {
        if(force)
            {	
                SetExposure(dstate_in.exposure, camera_num);
                SetShutter(dstate_in.shutter, camera_num);
                SetGain(dstate_in.gain, camera_num);
                SetBrightness(dstate_in.brightness, camera_num);
                SetColor(dstate_in.u_b_value, dstate_in.v_r_value, camera_num);
            }
        else
            {
                if(dstate_in.exposure != cameras[camera_num].dstate.exposure) 
                    SetExposure(dstate_in.exposure, camera_num);
                if(dstate_in.shutter != cameras[camera_num].dstate.shutter) 
                    SetShutter(dstate_in.shutter, camera_num);
                if(dstate_in.gain != cameras[camera_num].dstate.gain) 
                    SetGain(dstate_in.gain, camera_num);
                if(dstate_in.brightness != cameras[camera_num].dstate.brightness) 
                    SetBrightness(dstate_in.brightness, camera_num);
                if((dstate_in.u_b_value != cameras[camera_num].dstate.u_b_value)||
                   (dstate_in.v_r_value!=cameras[camera_num].dstate.v_r_value)) 
                    SetColor(dstate_in.u_b_value, dstate_in.v_r_value, camera_num);
            }
    }
  
    int GetExposure(int camera_num=0) { return(cameras[camera_num].dstate.GetExposure()); }
    int GetShutter(int camera_num=0) { return(cameras[camera_num].dstate.GetShutter()); }
    int GetGain(int camera_num=0) { return(cameras[camera_num].dstate.GetGain()); }
    int GetBrightness(int camera_num=0) { return(cameras[camera_num].dstate.GetBrightness()); }
    int GetUBColor(int camera_num=0) { return(cameras[camera_num].dstate.GetUBColor()); }
    int GetVRColor(int camera_num=0) { return(cameras[camera_num].dstate.GetVRColor()); }

    // set the size of the frame, currently only a limited number of options are available
    // (320x240 and 160x120), the function returns false if asked to produce an image of a 
    // different format. Future versions of the driver might support more choices.
    bool SetSize(int x, int y);

    bool init_cameras(bool dma_on_in=true);
private:

    raw1394handle_t handle;
    nodeid_t *camera_nodes; 
    int num_nodes;
    int num_cameras;
    bool dma_on;
    char *dma_device_file;
    bool fw_ready[MAX_NUM_CAMERAS];
    CCKCamera cameras[MAX_NUM_CAMERAS];
    CaptureType capture_size;
    int jpg_quality;

    void set_nothing_ready(){
        for(int i=0; i<MAX_NUM_CAMERAS; i++) {
            fw_ready[i] = false;
        }
    }

    bool a_camera_is_ready() {
        bool any_ready = false;
        for(int c=0; c<GetNumberOfCameras(); c++)
            any_ready = any_ready || cam_num_ok(c);
        return(any_ready);
    }

    bool cam_num_ok(int camera_num) {
        if((camera_num>=0)&&(camera_num<GetNumberOfCameras())){
            return(fw_ready[camera_num]);
        }
        return(false);
    }

    void init_variables(bool dma_on_in=true){
        capture_size = _320x240;
        jpg_quality = 80;
        handle = NULL;
        camera_nodes = NULL;
        num_nodes = 0;
        num_cameras = 0;
        dma_on = dma_on_in;
        dma_device_file = NULL;
        set_nothing_ready();
    }

    void shutdown_camera( int camera_num = 0 );
    bool capture_a_frame(int camera_num = 0);
    bool release_capture_buffer(dc1394_cameracapture * camera, int camera_num = 0);
    void get_info_for_cameras();
    void get_camera_info(int camera_num = 0);
    bool init_firewire();
    bool start_firewire(int camera_num=0);
    void shutdown_firewire();
    void capture_320x240_color_image(unsigned char * & buff_out, int camera_num = 0 );
    void capture_color_image_5x5(unsigned char * & buff_out, int camera_num = 0 );
    void capture_color_image_3x3(unsigned char * & buff_out,  int camera_num = 0 );
    //  void capture_color_image(YARPImageOf<YarpPixelRGB> & grabbed_image_out, int camera_num = 0 );

    //  void capture_mono_image(YARPImageOf<YarpPixelMono> &grabbed_image_out, int camera_num = 0);
};

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?