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