energy changed
This commit is contained in:
@@ -92,7 +92,6 @@ private:
|
|||||||
float sum_yaw, sum_pitch;//yaw和pitch的累计误差,即PID中积分项
|
float sum_yaw, sum_pitch;//yaw和pitch的累计误差,即PID中积分项
|
||||||
|
|
||||||
systime time_start_guess;
|
systime time_start_guess;
|
||||||
systime time_start_energy;
|
|
||||||
|
|
||||||
cv::RotatedRect centerR;//风车中心字母R的可能候选区
|
cv::RotatedRect centerR;//风车中心字母R的可能候选区
|
||||||
cv::RotatedRect flow_strip;//图像中所有流动条(理论上只有一个)
|
cv::RotatedRect flow_strip;//图像中所有流动条(理论上只有一个)
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ using std::vector;
|
|||||||
// ---------------------------------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------------------------------
|
||||||
struct EnergyPartParam {
|
struct EnergyPartParam {
|
||||||
int GRAY_THRESH;//二值化阈值
|
int GRAY_THRESH;//二值化阈值
|
||||||
int SUB_GRAY_THRESH;//备用二值化阈值
|
int RED_GRAY_THRESH;//红方二值化阈值
|
||||||
|
int BLUE_GRAY_THRESH;//蓝方二值化阈值
|
||||||
int SPLIT_GRAY_THRESH;//通道分离二值化阈值
|
int SPLIT_GRAY_THRESH;//通道分离二值化阈值
|
||||||
int FAN_GRAY_THRESH;//扇叶识别二值化阈值
|
int FAN_GRAY_THRESH;//扇叶识别二值化阈值
|
||||||
int ARMOR_GRAY_THRESH;//装甲板识别二值化阈值
|
int ARMOR_GRAY_THRESH;//装甲板识别二值化阈值
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
|
extern McuData mcu_data;
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// 此函数用于清空各vector
|
// 此函数用于清空各vector
|
||||||
@@ -26,15 +28,11 @@ void Energy::clearAll() {
|
|||||||
void Energy::initImage(cv::Mat &src) {
|
void Energy::initImage(cv::Mat &src) {
|
||||||
// imagePreprocess(src);
|
// imagePreprocess(src);
|
||||||
// if(show_process)imshow("img_preprocess", src);
|
// if(show_process)imshow("img_preprocess", src);
|
||||||
systime cur_time;
|
|
||||||
getsystime(cur_time);
|
|
||||||
float interval = getTimeIntervalms(cur_time, time_start_energy);
|
|
||||||
|
|
||||||
if (src.type() == CV_8UC3)cvtColor(src, src, COLOR_BGR2GRAY);
|
if (src.type() == CV_8UC3)cvtColor(src, src, COLOR_BGR2GRAY);
|
||||||
if(interval > 3000 && !is_find_target){
|
if (mcu_data.enemy_color == ENEMY_BLUE){
|
||||||
threshold(src, src, energy_part_param_.SUB_GRAY_THRESH, 255, THRESH_BINARY);
|
threshold(src, src, energy_part_param_.RED_GRAY_THRESH, 255, THRESH_BINARY);
|
||||||
}else{
|
} else if(mcu_data.enemy_color == ENEMY_RED){
|
||||||
threshold(src, src, energy_part_param_.GRAY_THRESH, 255, THRESH_BINARY);
|
threshold(src, src, energy_part_param_.BLUE_GRAY_THRESH, 255, THRESH_BINARY);
|
||||||
}
|
}
|
||||||
if (show_process)imshow("bin", src);
|
if (show_process)imshow("bin", src);
|
||||||
if (show_energy)waitKey(1);
|
if (show_energy)waitKey(1);
|
||||||
|
|||||||
@@ -83,16 +83,16 @@ void Energy::initEnergy() {
|
|||||||
void Energy::initEnergyPartParam() {
|
void Energy::initEnergyPartParam() {
|
||||||
// gimbal_energy_part_param_.GRAY_THRESH = 120;//home
|
// gimbal_energy_part_param_.GRAY_THRESH = 120;//home
|
||||||
// gimbal_energy_part_param_.GRAY_THRESH = 200;//official
|
// gimbal_energy_part_param_.GRAY_THRESH = 200;//official
|
||||||
gimbal_energy_part_param_.GRAY_THRESH = 180;//game
|
gimbal_energy_part_param_.RED_GRAY_THRESH = 180;//game
|
||||||
gimbal_energy_part_param_.SUB_GRAY_THRESH = 100;
|
gimbal_energy_part_param_.BLUE_GRAY_THRESH = 100;//game
|
||||||
gimbal_energy_part_param_.SPLIT_GRAY_THRESH = 180;
|
gimbal_energy_part_param_.SPLIT_GRAY_THRESH = 180;
|
||||||
gimbal_energy_part_param_.FAN_GRAY_THRESH = 75;
|
gimbal_energy_part_param_.FAN_GRAY_THRESH = 75;
|
||||||
gimbal_energy_part_param_.ARMOR_GRAY_THRESH = 80;
|
gimbal_energy_part_param_.ARMOR_GRAY_THRESH = 80;
|
||||||
|
|
||||||
gimbal_energy_part_param_.FAN_CONTOUR_AREA_MAX = 3000;
|
gimbal_energy_part_param_.FAN_CONTOUR_AREA_MAX = 5000;
|
||||||
gimbal_energy_part_param_.FAN_CONTOUR_AREA_MIN = 500;
|
gimbal_energy_part_param_.FAN_CONTOUR_AREA_MIN = 1500;
|
||||||
gimbal_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 55;
|
gimbal_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 55;
|
||||||
gimbal_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 95;
|
gimbal_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 100;
|
||||||
gimbal_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 20;
|
gimbal_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 20;
|
||||||
gimbal_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 52;
|
gimbal_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 52;
|
||||||
gimbal_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 3.5;
|
gimbal_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 3.5;
|
||||||
|
|||||||
@@ -53,8 +53,6 @@ void Energy::setBigEnergyInit() {
|
|||||||
initEnergy();
|
initEnergy();
|
||||||
initEnergyPartParam();
|
initEnergyPartParam();
|
||||||
|
|
||||||
getsystime(time_start_energy);
|
|
||||||
|
|
||||||
is_big = true;
|
is_big = true;
|
||||||
is_small = false;
|
is_small = false;
|
||||||
is_gimbal = true;
|
is_gimbal = true;
|
||||||
|
|||||||
@@ -79,22 +79,12 @@ void Energy::runBig(cv::Mat &gimbal_src) {
|
|||||||
if (findArmors(gimbal_src) < 1)return;
|
if (findArmors(gimbal_src) < 1)return;
|
||||||
if (show_energy)showArmors("armor", gimbal_src);
|
if (show_energy)showArmors("armor", gimbal_src);
|
||||||
if (!findFlowStripFan(gimbal_src)) {
|
if (!findFlowStripFan(gimbal_src)) {
|
||||||
if (!findFlowStripWeak(gimbal_src)){
|
if (!findFlowStripWeak(gimbal_src)) return;
|
||||||
is_find_target = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (show_energy)showFlowStripFan("strip fan", gimbal_src);
|
if (show_energy)showFlowStripFan("strip fan", gimbal_src);
|
||||||
if (!findTargetInFlowStripFan()) {
|
if (!findTargetInFlowStripFan()) return;
|
||||||
is_find_target = false;
|
if (!findFlowStrip(gimbal_src))return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!findFlowStrip(gimbal_src)){
|
|
||||||
is_find_target = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
is_find_target = true;
|
|
||||||
if (!findCenterROI(gimbal_src))return;
|
if (!findCenterROI(gimbal_src))return;
|
||||||
if (show_energy)showFlowStrip("strip", gimbal_src);
|
if (show_energy)showFlowStrip("strip", gimbal_src);
|
||||||
if (!findCenterR(gimbal_src))return;
|
if (!findCenterR(gimbal_src))return;
|
||||||
@@ -135,22 +125,12 @@ void Energy::runSmall(cv::Mat &gimbal_src) {
|
|||||||
if (findArmors(gimbal_src) < 1)return;
|
if (findArmors(gimbal_src) < 1)return;
|
||||||
if (show_energy)showArmors("armor", gimbal_src);
|
if (show_energy)showArmors("armor", gimbal_src);
|
||||||
if (!findFlowStripFan(gimbal_src)) {
|
if (!findFlowStripFan(gimbal_src)) {
|
||||||
if (!findFlowStripWeak(gimbal_src)){
|
if (!findFlowStripWeak(gimbal_src)) return;
|
||||||
is_find_target = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (show_energy)showFlowStripFan("strip fan", gimbal_src);
|
if (show_energy)showFlowStripFan("strip fan", gimbal_src);
|
||||||
if (!findTargetInFlowStripFan()) {
|
if (!findTargetInFlowStripFan()) return;
|
||||||
is_find_target = false;
|
if (!findFlowStrip(gimbal_src)) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!findFlowStrip(gimbal_src)){
|
|
||||||
is_find_target = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
is_find_target = true;
|
|
||||||
if (show_energy)showTarget("target", gimbal_src);
|
if (show_energy)showTarget("target", gimbal_src);
|
||||||
fans_cnt = findFans(gimbal_src);
|
fans_cnt = findFans(gimbal_src);
|
||||||
if (show_energy)showFans("fans", gimbal_src);
|
if (show_energy)showFans("fans", gimbal_src);
|
||||||
|
|||||||
29
main.cpp
29
main.cpp
@@ -30,7 +30,7 @@ using namespace std;
|
|||||||
McuData mcu_data = { // 单片机端回传结构体
|
McuData mcu_data = { // 单片机端回传结构体
|
||||||
0, // 当前云台yaw角
|
0, // 当前云台yaw角
|
||||||
0, // 当前云台pitch角
|
0, // 当前云台pitch角
|
||||||
SMALL_ENERGY_STATE, // 当前状态,自瞄-大符-小符
|
BIG_ENERGY_STATE, // 当前状态,自瞄-大符-小符
|
||||||
0, // 云台角度标记位
|
0, // 云台角度标记位
|
||||||
1, // 是否启用数字识别
|
1, // 是否启用数字识别
|
||||||
ENEMY_RED, // 敌方颜色
|
ENEMY_RED, // 敌方颜色
|
||||||
@@ -66,8 +66,8 @@ int main(int argc, char *argv[]) {
|
|||||||
video_gimbal = new CameraWrapper(ARMOR_CAMERA_EXPOSURE, ARMOR_CAMERA_GAIN, 2/*, "armor"*/);
|
video_gimbal = new CameraWrapper(ARMOR_CAMERA_EXPOSURE, ARMOR_CAMERA_GAIN, 2/*, "armor"*/);
|
||||||
video_chassis = new CameraWrapper(ENERGY_CAMERA_EXPOSURE, ENERGY_CAMERA_GAIN, 2/*, "energy"*/);
|
video_chassis = new CameraWrapper(ENERGY_CAMERA_EXPOSURE, ENERGY_CAMERA_GAIN, 2/*, "energy"*/);
|
||||||
} else {
|
} else {
|
||||||
video_gimbal = new VideoWrapper("/home/sun/桌面/video_8.7/round1-8-5-7-small.avi");
|
video_gimbal = new VideoWrapper("/home/sun/桌面/video_8.8/8.7.4-big.avi");
|
||||||
video_chassis = new VideoWrapper("/home/sun/桌面/video_8.7/round1-8-5-7-small.avi");
|
video_chassis = new VideoWrapper("/home/sun/桌面/video_8.8/8.7.4-big.avi");
|
||||||
}
|
}
|
||||||
if (video_gimbal->init()) {
|
if (video_gimbal->init()) {
|
||||||
LOGM("video_gimbal source initialization successfully.");
|
LOGM("video_gimbal source initialization successfully.");
|
||||||
@@ -108,23 +108,26 @@ int main(int argc, char *argv[]) {
|
|||||||
LOGW("video_gimbal source unavailable!");
|
LOGW("video_gimbal source unavailable!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
checkReconnect(video_chassis->read(chassis_src));
|
// checkReconnect(video_chassis->read(chassis_src));
|
||||||
energy.setBigEnergyInit();
|
energy.setBigEnergyInit();
|
||||||
}
|
}
|
||||||
last_state = curr_state;//更新上一帧状态
|
last_state = curr_state;//更新上一帧状态
|
||||||
ok = checkReconnect(video_gimbal->read(gimbal_src));
|
ok = checkReconnect(video_gimbal->read(gimbal_src));
|
||||||
video_chassis->read(chassis_src);
|
// video_chassis->read(chassis_src);
|
||||||
#ifdef GIMBAL_FLIP_MODE
|
#ifdef GIMBAL_FLIP_MODE
|
||||||
flip(gimbal_src, gimbal_src, GIMBAL_FLIP_MODE);
|
flip(gimbal_src, gimbal_src, GIMBAL_FLIP_MODE);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CHASSIS_FLIP_MODE
|
//#ifdef CHASSIS_FLIP_MODE
|
||||||
flip(chassis_src, chassis_src, CHASSIS_FLIP_MODE);
|
// flip(chassis_src, chassis_src, CHASSIS_FLIP_MODE);
|
||||||
#endif
|
//#endif
|
||||||
if (!from_camera) extract(gimbal_src, chassis_src);
|
// if (!from_camera) extract(gimbal_src, chassis_src);
|
||||||
if (save_video) saveVideos(gimbal_src, chassis_src);//保存视频
|
// if (save_video) saveVideos(gimbal_src, chassis_src);//保存视频
|
||||||
if (show_origin) showOrigin(gimbal_src, chassis_src);//显示原始图像
|
// if (show_origin) showOrigin(gimbal_src, chassis_src);//显示原始图像
|
||||||
energy.runBig(gimbal_src, chassis_src);
|
if (!from_camera) extract(gimbal_src);
|
||||||
// energy.runBig(gimbal_src);
|
if (save_video) saveVideos(gimbal_src);//保存视频
|
||||||
|
if (show_origin) showOrigin(gimbal_src);//显示原始图像
|
||||||
|
// energy.runBig(gimbal_src, chassis_src);
|
||||||
|
energy.runBig(gimbal_src);
|
||||||
} else if (curr_state == SMALL_ENERGY_STATE) {
|
} else if (curr_state == SMALL_ENERGY_STATE) {
|
||||||
if (last_state != SMALL_ENERGY_STATE) {
|
if (last_state != SMALL_ENERGY_STATE) {
|
||||||
LOGM(STR_CTR(WORD_GREEN, "Start Small Energy!"));
|
LOGM(STR_CTR(WORD_GREEN, "Start Small Energy!"));
|
||||||
|
|||||||
Reference in New Issue
Block a user