camera gain strategy
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user