void set_manual_exposure_gain(int camID, int exposure, int gain) { int success = dc1394_auto_on_off(handles[cameras[camID].port], cameras[camID].node, FEATURE_EXPOSURE, DC1394_FALSE); if (success != DC1394_SUCCESS) { fprintf(stderr, "can not turn off camera auto exposure\n"); return; } success = dc1394_set_exposure(handles[cameras[camID].port], cameras[camID].node, exposure); if (success != DC1394_SUCCESS) { fprintf(stderr, "set_exposure returned %d\n", success); return; } success = dc1394_set_gain(handles[cameras[camID].port], cameras[camID].node, gain); if (success != DC1394_SUCCESS) { fprintf(stderr, "set_gain returned %d\n", success); return; } }
//*** Method for automatic adaption of the lumination parameter****// int CameraDcam::autoBrightness(camera_data_msg *dataPackage) { int i, count, minCount, maxCount, bytesPerPixel, gain, shutter; double unclearPixel; unsigned int ubrightness; unsigned int ushutter; unsigned int ugain; int start; minCount = 0; maxCount = 0; // third = dataPackage->data.width * dataPackage->data.height bytesPerPixel = dataPackage->data.depth / 8; count = dataPackage->data.width * dataPackage->data.height * bytesPerPixel; start = (int)(count * (((double ) 1) - ((double) 1) / autoBrightnessSize)); start += start % bytesPerPixel; start++; for(i = start; i < count; i += bytesPerPixel) { if((unsigned char)dataPackage->byteStream[i] <= minHue) { minCount++; } else if((unsigned char)dataPackage->byteStream[i] >= maxHue) { maxCount++; } } if (dc1394_get_shutter(porthandle[dc1394CameraPortNo], camera_node, &ushutter) != DC1394_SUCCESS) { GDOS_WARNING("getting of shutter failed! "); return DC1394_FAILURE; } if (dc1394_get_gain(porthandle[dc1394CameraPortNo], camera_node, &ugain) != DC1394_SUCCESS) { GDOS_WARNING("getting of gain failed! "); return DC1394_FAILURE; } if (dc1394_get_brightness(porthandle[dc1394CameraPortNo], camera_node, &ubrightness) != DC1394_SUCCESS) { GDOS_WARNING("getting of brightness failed! "); return DC1394_FAILURE; } GDOS_DBG_DETAIL("count %i minCount %i maxCount %i actual shutter %i gain:%i brightness:%i \n", count, minCount, maxCount, ushutter, ugain, ubrightness); //if pixel are too dark, light them up! unclearPixel = ((double)(minCount - maxCount)) / count; //percent of over or under illum. pixel ubrightness = 124; if (unclearPixel > 0) { //light up if (ushutter < 4095) { ushutter += (unsigned int) (unclearPixel * shutterMult); if(ushutter > 4095) ushutter = 4095; } else { //increase gain ugain += (unsigned int) (unclearPixel * gainMult); if (ugain > 1023) { ugain = 1023;} } } else { //unclearPixel is negative, darken image if (ugain > 192) { //to handle negative values gain = (int) (ugain + unclearPixel * gainMult); if (gain < 192) gain = 192; ugain = gain; } else { shutter = (int) (ushutter + unclearPixel * shutterMult); if (shutter < 1) shutter = 1; ushutter = shutter; } } if (dc1394_set_shutter(porthandle[dc1394CameraPortNo], camera_node, ushutter) != DC1394_SUCCESS) { GDOS_WARNING("setting of shutter failed! is value:%i", ushutter ); return DC1394_FAILURE; } if (dc1394_set_gain(porthandle[dc1394CameraPortNo], camera_node, ugain) != DC1394_SUCCESS) { GDOS_WARNING("setting of gain failed! is value:%i", ugain ); return DC1394_FAILURE; } if (dc1394_set_brightness(porthandle[dc1394CameraPortNo], camera_node, ubrightness) != DC1394_SUCCESS) { GDOS_WARNING("setting of brightness failed! is value:%i", ubrightness ); return DC1394_FAILURE; } GDOS_DBG_DETAIL("set shutter:%i gain:%i brightness:%i \n", ushutter, ugain, ubrightness); return DC1394_SUCCESS; }