camera gain strategy

This commit is contained in:
wanpiqiu123
2019-07-22 09:23:48 +08:00
parent d7fd85ff15
commit e9df99447e
2 changed files with 61 additions and 42 deletions

View File

@@ -33,6 +33,6 @@
//#define GIMBAL_FLIP_MODE (-1)
//#define CHASSIS_FLIP_MODE (-1)
//#define WITH_TIME_BASED_CAMERA_GAIN
#endif /* SETCONFIG_H */

View File

@@ -13,79 +13,98 @@ using std::cout;
using std::endl;
using namespace cv;
CameraWrapper::CameraWrapper(int camera_mode, const std::string &n):
CameraWrapper::CameraWrapper(int camera_mode, const std::string &n) :
name(n),
mode(camera_mode),
camera_cnts(2),
camera_status(-1),
iplImage(nullptr),
rgb_buffer(nullptr),
channel(3){
channel(3) {
}
bool CameraWrapper::init() {
CameraSdkInit(1);
int camera_enumerate_device_status = CameraEnumerateDevice(camera_enum_list, &camera_cnts);
if(camera_enumerate_device_status != CAMERA_STATUS_SUCCESS){
int camera_enumerate_device_status = CameraEnumerateDevice(camera_enum_list, &camera_cnts);
if (camera_enumerate_device_status != CAMERA_STATUS_SUCCESS) {
LOGE("CameraEnumerateDevice fail with %d!", camera_enumerate_device_status);
}
if (camera_cnts == 0) {
LOGE("No camera device detected!");
return false;
}else if(camera_cnts >= 1){
} else if (camera_cnts >= 1) {
LOGM("%d camera device detected!", camera_cnts);
}
int i;
for(i=0; i<camera_cnts; i++){
for (i = 0; i < camera_cnts; i++) {
camera_status = CameraInit(&camera_enum_list[i], -1, -1, &h_camera);
if (camera_status != CAMERA_STATUS_SUCCESS) {
CameraUnInit(h_camera);
continue;
}
CameraGetFriendlyName(h_camera, camera_name);
if(name=="NULL" || strcmp(name.data(), camera_name)==0){
if (name == "NULL" || strcmp(name.data(), camera_name) == 0) {
break;
}
CameraUnInit(h_camera);
}
if(i >= camera_cnts){
if (i >= camera_cnts) {
LOGE("No device name %s or device open error!!", name.data());
return false;
}
auto status = CameraGetCapability(h_camera, &tCapability);
if (status != CAMERA_STATUS_SUCCESS) {
cout << "CameraGetCapability return error code " << status << endl;
return false;
}
auto status = CameraGetCapability(h_camera, &tCapability);
if (status != CAMERA_STATUS_SUCCESS) {
cout << "CameraGetCapability return error code " << status << endl;
return false;
}
rgb_buffer = (unsigned char *)malloc(tCapability.sResolutionRange.iHeightMax *
tCapability.sResolutionRange.iWidthMax * 3);
rgb_buffer = (unsigned char *) malloc(tCapability.sResolutionRange.iHeightMax *
tCapability.sResolutionRange.iWidthMax * 3);
#ifdef Windows
char filepath[200];
sprintf(filepath, PROJECT_DIR"/others/%s.Config", name.data());
if (CameraReadParameterFromFile(h_camera, filepath) != CAMERA_STATUS_SUCCESS) {
LOGE("Load parameter %s from file fail!", filepath);
return false;
}
if (CameraLoadParameter(h_camera, PARAMETER_TEAM_A) != CAMERA_STATUS_SUCCESS) {
LOGE("CameraLoadParameter %s fail!", filepath);
return false;
}
LOGM("successfully loaded %s!", filepath);
char filepath[200];
sprintf(filepath, PROJECT_DIR"/others/%s.Config", name.data());
if (CameraReadParameterFromFile(h_camera, filepath) != CAMERA_STATUS_SUCCESS) {
LOGE("Load parameter %s from file fail!", filepath);
return false;
}
if (CameraLoadParameter(h_camera, PARAMETER_TEAM_A) != CAMERA_STATUS_SUCCESS) {
LOGE("CameraLoadParameter %s fail!", filepath);
return false;
}
LOGM("successfully loaded %s!", filepath);
#elif defined(Linux)
CameraSetAeState(h_camera, false);
CameraSetExposureTime(h_camera, CAMERA_EXPOSURE*1000);
CameraSetExposureTime(h_camera, CAMERA_EXPOSURE * 1000);
#ifndef WITH_TIME_BASED_CAMERA_GAIN
CameraSetAnalogGain(h_camera, ARMOR_CAMERA_GAIN);
if(mode == 0){
#else
#include <sys/time.h>
timeval tv;
int gain;
gettimeofday(&tv, nullptr);
float hour = tv.tv_sec / 3600.0;
if (6 <= hour && hour < 10) {
gain = 20;
} else if (10 <= hour && hour < 16) {
gain = 10;
} else if (16 <= hour && hour < 17) {
gain = 20;
} else if (17 <= hour && hour < 18) {
gain = 40;
} else {
gain = 50;
}
#endif
if (mode == 0) {
CameraSetGain(h_camera, CAMERA_BLUE_GAIN, CAMERA_GREEN_GAIN, CAMERA_RED_GAIN);
CameraSetLutMode(h_camera, LUTMODE_PRESET);
}
#endif
double t;
CameraGetExposureTime(h_camera, &t);
LOGM("Exposure time: %lfms", t / 1000.0);
double t;
CameraGetExposureTime(h_camera, &t);
LOGM("Exposure time: %lfms", t / 1000.0);
/*让SDK进入工作模式开始接收来自相机发送的图像
数据。如果当前相机是触发模式,则需要接收到
触发帧以后才会更新图像。 */
@@ -97,7 +116,7 @@ bool CameraWrapper::init() {
CameraSetGamma、CameraSetContrast、CameraSetGain等设置图像伽马、对比度、RGB数字增益等等。
CameraGetFriendlyName CameraSetFriendlyName 获取/设置相机名称(该名称可写入相机硬件)
*/
cout << tCapability.sIspCapacity.bMonoSensor << endl;
cout << tCapability.sIspCapacity.bMonoSensor << endl;
if (tCapability.sIspCapacity.bMonoSensor) {
channel = 1;
CameraSetIspOutFormat(h_camera, CAMERA_MEDIA_TYPE_MONO8);
@@ -114,13 +133,13 @@ bool CameraWrapper::changeBrightness(int brightness) {
CameraSetAnalogGain(h_camera, brightness);
}
bool CameraWrapper::read(cv::Mat& src) {
if(mode==0)return readProcessed(src);
if(mode==1)return readRaw(src);
bool CameraWrapper::read(cv::Mat &src) {
if (mode == 0)return readProcessed(src);
if (mode == 1)return readRaw(src);
}
bool CameraWrapper::readRaw(cv::Mat &src) {
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 1000) == CAMERA_STATUS_SUCCESS){
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 1000) == CAMERA_STATUS_SUCCESS) {
if (iplImage) {
cvReleaseImageHeader(&iplImage);
}
@@ -144,8 +163,9 @@ bool CameraWrapper::readRaw(cv::Mat &src) {
bool CameraWrapper::readProcessed(cv::Mat &src) {
// cerr << "Get-1" << endl;
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 1000) == CAMERA_STATUS_SUCCESS){
CameraImageProcess(h_camera, pby_buffer, rgb_buffer, &frame_info); // this function is super slow, better not to use it.
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 1000) == CAMERA_STATUS_SUCCESS) {
CameraImageProcess(h_camera, pby_buffer, rgb_buffer,
&frame_info); // this function is super slow, better not to use it.
if (iplImage) {
cvReleaseImageHeader(&iplImage);
}
@@ -162,11 +182,10 @@ bool CameraWrapper::readProcessed(cv::Mat &src) {
}
}
CameraWrapper::~CameraWrapper()
{
CameraWrapper::~CameraWrapper() {
CameraUnInit(h_camera);
//注意先反初始化后再free
if(rgb_buffer != nullptr)
if (rgb_buffer != nullptr)
free(rgb_buffer);
}