This commit is contained in:
JiatongSun
2019-04-21 17:48:28 +08:00
parent 0d48e57bf9
commit a6233a50be
6 changed files with 43 additions and 32 deletions

View File

@@ -33,7 +33,9 @@ struct EnergyPartParam {
long FAN_CONTOUR_AREA_MAX; long FAN_CONTOUR_AREA_MAX;
long FAN_CONTOUR_AREA_MIN; long FAN_CONTOUR_AREA_MIN;
long FAN_CONTOUR_LENGTH_MIN; long FAN_CONTOUR_LENGTH_MIN;
long FAN_CONTOUR_LENGTH_MAX;
long FAN_CONTOUR_WIDTH_MIN; long FAN_CONTOUR_WIDTH_MIN;
long FAN_CONTOUR_WIDTH_MAX;
float FAN_CONTOUR_HW_RATIO_MAX; float FAN_CONTOUR_HW_RATIO_MAX;
float FAN_CONTOUR_HW_RATIO_MIN; float FAN_CONTOUR_HW_RATIO_MIN;

View File

@@ -11,7 +11,7 @@ using std::vector;
void Energy::StructingElementClose(cv::Mat &src){ void Energy::StructingElementClose(cv::Mat &src){
if (src.empty())return; if (src.empty())return;
//threshold(src, src, energy_part_param_.CAMERA_GRAY_THRESH, 255, THRESH_BINARY); //threshold(src, src, energy_part_param_.CAMERA_GRAY_THRESH, 255, THRESH_BINARY);
Mat element = getStructuringElement(MORPH_RECT, Size(4, 4)); Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
morphologyEx(src, src, MORPH_CLOSE, element); morphologyEx(src, src, MORPH_CLOSE, element);
} }

View File

@@ -19,7 +19,7 @@ int Energy::findFan(const cv::Mat &src, vector<EnergyPart> &fans, int &last_fans
std::vector<vector<Point> > fan_contours; std::vector<vector<Point> > fan_contours;
StructingElementClose(src_bin); StructingElementClose(src_bin);
// imshow("fan struct",src_bin); imshow("fan struct",src_bin);
findContours(src_bin, fan_contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); findContours(src_bin, fan_contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
@@ -28,25 +28,26 @@ int Energy::findFan(const cv::Mat &src, vector<EnergyPart> &fans, int &last_fans
continue; continue;
} }
// double cur_contour_area = contourArea(fan_contour); double cur_contour_area = contourArea(fan_contour);
// RotatedRect cur_rect = minAreaRect(fan_contour); RotatedRect cur_rect = minAreaRect(fan_contour);
// Size2f cur_size = cur_rect.size; Size2f cur_size = cur_rect.size;
// //
// cout<<"cur_contour_area: "<<cur_contour_area<<'\t'<<"rect_area: "<<cur_size.area()<<'\t'<<"ratio: "<<cur_contour_area/cur_size.area()<<endl; // cout<<"cur_contour_area: "<<cur_contour_area<<'\t'<<"rect_area: "<<cur_size.area()<<'\t'<<"ratio: "<<cur_contour_area/cur_size.area()<<endl;
// float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width; float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width;
// float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width; float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width;
// if(length>5&&width>5){ // if(length>20&&width>20){
// cout<<cur_rect.center; // cout<<cur_rect.center;
// fans.emplace_back(fan_contour); // fans.emplace_back(fan_contour);
// cout<<"fan area: "<<length<<'\t'<<width<<endl; // cout<<"fan area: "<<length<<'\t'<<width<<endl;
// } // }
//
fans.emplace_back(fan_contour); fans.emplace_back(fan_contour);
// cout<<"fan area: "<<length<<'\t'<<width<<endl; // cout<<"fan area: "<<length<<'\t'<<width<<endl;
} }
// cout<<fans.size()<<endl;
if(fans.size() < last_fans_cnt){ if(fans.size() < last_fans_cnt){
last_fans_cnt = static_cast<int>(fans.size()); last_fans_cnt = static_cast<int>(fans.size());
return -1; return -1;
@@ -100,13 +101,14 @@ int Energy::findArmor(const cv::Mat &src, vector<EnergyPart> &armors, int &last_
float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width; float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width;
float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width; float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width;
// if(length>10&&width>10){ // if(length>10&&width>5){
// armors.emplace_back(armor_contour);
// cout<<"armor area: "<<length<<'\t'<<width<<'\t'<<cur_rect.center<<endl;
// armors.emplace_back(armor_contour); // armors.emplace_back(armor_contour);
// cout<<"armor area: "<<length<<'\t'<<width<<endl;
// } // }
armors.emplace_back(armor_contour); armors.emplace_back(armor_contour);
cout<<"armor area: "<<length<<'\t'<<width<<endl;
// cout<<"armor area: "<<length<<'\t'<<width<<endl;
} }
if(armors.size() < last_armors_cnt){ if(armors.size() < last_armors_cnt){
last_armors_cnt = static_cast<int>(armors.size()); last_armors_cnt = static_cast<int>(armors.size());
@@ -164,7 +166,8 @@ bool Energy::isValidFanContour(const vector<cv::Point> &fan_contour) {
Size2f cur_size = cur_rect.size; Size2f cur_size = cur_rect.size;
float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width; float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width;
float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width; float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width;
if (length < energy_part_param_.FAN_CONTOUR_LENGTH_MIN || width < energy_part_param_.FAN_CONTOUR_WIDTH_MIN) if (length < energy_part_param_.FAN_CONTOUR_LENGTH_MIN || width < energy_part_param_.FAN_CONTOUR_WIDTH_MIN ||
length > energy_part_param_.FAN_CONTOUR_LENGTH_MAX || width > energy_part_param_.FAN_CONTOUR_WIDTH_MAX)
{ {
//cout<<"length width min fail."<<endl; //cout<<"length width min fail."<<endl;
return false; return false;

View File

@@ -11,7 +11,7 @@ using std::vector;
void Energy::initEnergyPartParam() { void Energy::initEnergyPartParam() {
energy_part_param_.RPM = 10; energy_part_param_.RPM = 10;
energy_part_param_.HIT_TIME = 1.5; energy_part_param_.HIT_TIME = 1.14;
energy_part_param_.GRAY_THRESH = 240; energy_part_param_.GRAY_THRESH = 240;
energy_part_param_.SPLIT_GRAY_THRESH = 80; energy_part_param_.SPLIT_GRAY_THRESH = 80;
@@ -19,17 +19,19 @@ void Energy::initEnergyPartParam() {
energy_part_param_.ARMOR_GRAY_THRESH = 80; energy_part_param_.ARMOR_GRAY_THRESH = 80;
energy_part_param_.FAN_CONTOUR_AREA_MAX = 17000; energy_part_param_.FAN_CONTOUR_AREA_MAX = 17000;
energy_part_param_.FAN_CONTOUR_AREA_MIN = 7000; energy_part_param_.FAN_CONTOUR_AREA_MIN = 0;
energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 150; energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 100;
energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 50; energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 140;
energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 40;
energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 60;
energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4; energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4;
energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1; energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1;
energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000; energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000;
energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0; energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0;
energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 50; energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 30;
energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 25; energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 20;
energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 80; energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 60;
energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 50; energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 50;
energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3; energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3;
energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1; energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1;

View File

@@ -63,9 +63,9 @@ int Energy::run(cv::Mat &src){
cycleLeastFit(); cycleLeastFit();
cycle_center = cv::Point(332,233); // cycle_center = cv::Point(212,246);
radius = 208.835; // radius = 123.942;
attack_distance = ATTACK_DISTANCE * 203.728 / radius; attack_distance = ATTACK_DISTANCE * 123.323 / radius;
getFanPosition(fanPosition, fans, cycle_center, radius); getFanPosition(fanPosition, fans, cycle_center, radius);
getArmorPosition(armorPosition, armors, cycle_center, radius); getArmorPosition(armorPosition, armors, cycle_center, radius);
@@ -74,7 +74,7 @@ int Energy::run(cv::Mat &src){
cout<<"The target armor center is: "<<target_center<<endl; cout<<"The target armor center is: "<<target_center<<endl;
getHitPoint(); getHitPoint();
hit_point = target_center; // hit_point = target_center;
cout << "The hit point position is " << hit_point << endl; cout << "The hit point position is " << hit_point << endl;
// hit_point = cycle_center; // hit_point = cycle_center;

View File

@@ -23,7 +23,7 @@ using namespace std;
#define ENERGY_STATE 1 #define ENERGY_STATE 1
#define ARMOR_STATE 0 #define ARMOR_STATE 0
int state = ARMOR_STATE; int state = ENERGY_STATE;
float curr_yaw=0, curr_pitch=0; float curr_yaw=0, curr_pitch=0;
float mark_yaw=0, mark_pitch=0; float mark_yaw=0, mark_pitch=0;
int mark = 0; int mark = 0;
@@ -99,24 +99,28 @@ void uartReceive(Uart* uart){
while((data=uart->receive()) != '\n'){ while((data=uart->receive()) != '\n'){
buffer[cnt++] = data; buffer[cnt++] = data;
if(cnt >= 100){ if(cnt >= 100){
LOGE("data receive over flow!"); // LOGE("data receive over flow!");
} }
} }
if(cnt == 10){ if(cnt == 10){
if(buffer[8] == 'e'){ if(buffer[8] == 'e'){
state = ENERGY_STATE; state = ENERGY_STATE;
LOGM("Energy state"); // LOGM("Energy state");
}else if(buffer[8] == 'a'){ }else if(buffer[8] == 'a'){
state = ARMOR_STATE; state = ARMOR_STATE;
LOGM("Armor state"); // LOGM("Armor state");
} }
memcpy(&curr_yaw, buffer, 4); memcpy(&curr_yaw, buffer, 4);
memcpy(&curr_pitch, buffer+4, 4); memcpy(&curr_pitch, buffer+4, 4);
LOGM("Get yaw:%f pitch:%f", curr_yaw, curr_pitch); // LOGM("Get yaw:%f pitch:%f", curr_yaw, curr_pitch);
if(buffer[9] == 1){ if(buffer[9] == 1){
mark_yaw = curr_yaw; if(mark == 0){
mark_pitch = curr_pitch; mark = 1;
LOGM("Marked"); mark_yaw = curr_yaw;
mark_pitch = curr_pitch;
}
// LOGM("Marked");
} }
} }
cnt = 0; cnt = 0;