energy changed

This commit is contained in:
sun
2019-07-05 16:34:03 +08:00
parent da45e62806
commit ba85a1e27f
7 changed files with 105 additions and 69 deletions

View File

@@ -18,28 +18,12 @@ const double PI = 3.1415926;
const int CLOCKWISE = 1; const int CLOCKWISE = 1;
const int ANTICLOCKWISE = -1; const int ANTICLOCKWISE = -1;
const float ATTACK_DISTANCE = 718;//cm const float ATTACK_DISTANCE = 718;//cm
const double WHOLE_FAN = 80;//cm
const double ARMOR_CENTER_TO_CYCLE_CENTER = 75;//cm const double ARMOR_CENTER_TO_CYCLE_CENTER = 75;//cm
//const double ARMOR_CENTER_TO_CYCLE_CENTER = 71;//cm
const int EXTRACT_POINT_X = 120; const int EXTRACT_POINT_X = 120;
const int EXTRACT_POINT_Y = 0; const int EXTRACT_POINT_Y = 0;
const int EXTRACT_WIDTH = 400; const int EXTRACT_WIDTH = 400;
const int EXTRACT_HEIGHT = 300; const int EXTRACT_HEIGHT = 300;
//以摄像头正方向位y轴
const int GM_L = 14;//云台摄像头z方向
const int GM_X = 15;//云台摄像头x方向
const int GM_H = 16;//云台摄像头y方向
//const double STRETCH = 231.0/640.0;//实际距离与图像伸缩比
const double STRETCH = 0.34;
const int ZERO_POINT_X = 281;
const int ZERO_POINT_Y = 188;
const double YAW_ORIGIN_RAD = PI/180*2.25;
const double PITCH_ORIGIN_RAD = PI/180*14.85;
const double LIFT_HEIGHT = 20;//云台抬升高度
#endif //CONSTANT_H #endif //CONSTANT_H

View File

@@ -25,7 +25,7 @@ class Energy {
public: public:
Energy(Serial &u, uint8_t &color);//构造函数,参数为串口和敌方颜色 Energy(Serial &u, uint8_t &color);//构造函数,参数为串口和敌方颜色
~Energy();//默认析构函数 ~Energy();//默认析构函数
int run(cv::Mat &src); int run(cv::Mat &gimble_src, cv::Mat &base_src);
Serial &serial;//串口 Serial &serial;//串口
void setEnergyRotationInit();//判断顺逆时针函数 void setEnergyRotationInit();//判断顺逆时针函数
void extract(cv::Mat &src);//框取图像中的一块区域进行处理 void extract(cv::Mat &src);//框取图像中的一块区域进行处理

View File

@@ -10,6 +10,11 @@
using std::vector; using std::vector;
//----------------------------------------------------------------------------------------------------------------------
// 此结构体为能量机关模块的结构体,用于寻找矩形轮廓
// ---------------------------------------------------------------------------------------------------------------------
struct EnergyPart { struct EnergyPart {
cv::RotatedRect rect; cv::RotatedRect rect;
float angle; float angle;
@@ -21,40 +26,45 @@ struct EnergyPart {
}; };
}; };
//----------------------------------------------------------------------------------------------------------------------
// 此结构体包括能量机关参数
// ---------------------------------------------------------------------------------------------------------------------
struct EnergyPartParam { struct EnergyPartParam {
int GRAY_THRESH; int 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;//装甲板识别二值化阈值
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_LENGTH_MAX;//扇叶长边长度最大值
long FAN_CONTOUR_WIDTH_MIN; long FAN_CONTOUR_WIDTH_MIN;//扇叶宽边长度最小值
long FAN_CONTOUR_WIDTH_MAX; 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;//扇叶长宽比最小值
long ARMOR_CONTOUR_AREA_MAX; long ARMOR_CONTOUR_AREA_MAX;//装甲板面积最大值
long ARMOR_CONTOUR_AREA_MIN; long ARMOR_CONTOUR_AREA_MIN;//装甲板面积最小值
long ARMOR_CONTOUR_LENGTH_MIN; long ARMOR_CONTOUR_LENGTH_MIN;//装甲板长边长度最小值
long ARMOR_CONTOUR_WIDTH_MIN; long ARMOR_CONTOUR_WIDTH_MIN;//装甲板长边长度最大值
long ARMOR_CONTOUR_LENGTH_MAX; long ARMOR_CONTOUR_LENGTH_MAX;//装甲板宽边长度最小值
long ARMOR_CONTOUR_WIDTH_MAX; long ARMOR_CONTOUR_WIDTH_MAX;//装甲板宽边长度最大值
float ARMOR_CONTOUR_HW_RATIO_MAX; float ARMOR_CONTOUR_HW_RATIO_MAX;//装甲板长宽比最大值
float ARMOR_CONTOUR_HW_RATIO_MIN; float ARMOR_CONTOUR_HW_RATIO_MIN;//装甲板长宽比最小值
long CENTER_R_CONTOUR_AREA_MAX; long CENTER_R_CONTOUR_AREA_MAX;//风车中心R面积最大值
long CENTER_R_CONTOUR_AREA_MIN; long CENTER_R_CONTOUR_AREA_MIN;//风车中心R面积最小值
long CENTER_R_CONTOUR_LENGTH_MIN; long CENTER_R_CONTOUR_LENGTH_MIN;//风车中心R长边长度最小值
long CENTER_R_CONTOUR_WIDTH_MIN; long CENTER_R_CONTOUR_WIDTH_MIN;//风车中心R长边长度最大值
long CENTER_R_CONTOUR_LENGTH_MAX; long CENTER_R_CONTOUR_LENGTH_MAX;//风车中心R宽边长度最小值
long CENTER_R_CONTOUR_WIDTH_MAX; long CENTER_R_CONTOUR_WIDTH_MAX;//风车中心R宽边长度最大值
float CENTER_R_CONTOUR_HW_RATIO_MAX; float CENTER_R_CONTOUR_HW_RATIO_MAX;//风车中心R长宽比最大值
float CENTER_R_CONTOUR_HW_RATIO_MIN; float CENTER_R_CONTOUR_HW_RATIO_MIN;//风车中心R长宽比最小值
float TWIN_ANGEL_MAX; float TWIN_ANGEL_MAX;//扇叶和装甲板匹配时极坐标角度差的最大值
}; };

View File

@@ -14,7 +14,10 @@ using std::vector;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// 此函数为能量机关模式主控制流函数 // 此函数为能量机关模式主控制流函数
// --------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------------
int Energy::run(cv::Mat &src){ int Energy::run(cv::Mat &gimble_src, cv::Mat &base_src){
cv::Mat src = gimble_src;
// imshow("src",src); // imshow("src",src);
fans.clear(); fans.clear();
armors.clear(); armors.clear();

View File

@@ -20,16 +20,13 @@
#include <log.h> #include <log.h>
#define ENERGY_STATE 'e'
#define ARMOR_STATE 'a'
using namespace cv; using namespace cv;
using namespace std; using namespace std;
mcu_data mcuData = { mcu_data mcuData = {
0, 0,
0, 0,
ENERGY_STATE, BIG_ENERGY_STATE,
0, 0,
1, 1,
ENEMY_RED, ENEMY_RED,
@@ -101,26 +98,28 @@ int main(int argc, char *argv[]) {
cout<<"start running"<<endl; cout<<"start running"<<endl;
do { do {
CNT_TIME("Total", { CNT_TIME("Total", {
if (mcuData.state == ENERGY_STATE) { if (mcuData.state == BIG_ENERGY_STATE) {
if (last_state == ARMOR_STATE) { if (last_state != BIG_ENERGY_STATE) {
energy.setEnergyRotationInit(); energy.setEnergyRotationInit();
cout << "set" << endl; cout << "set" << endl;
} }
last_state = mcuData.state; last_state = mcuData.state;
if (video_energy) { if (video_armor && video_energy) {
ok = video_energy->read(energy_src); ok = video_armor->read(armor_src) && video_energy->read(energy_src);
if (!ok) { if (!ok) {
delete video_armor;
delete video_energy; delete video_energy;
video_armor = nullptr;
video_energy = nullptr; video_energy = nullptr;
} }
if(save_video){ if(save_video){
Mat energy_save = energy_src.clone(); Mat energy_save = energy_src.clone();
cvtColor(energy_save,energy_save,COLOR_GRAY2BGR); cvtColor(energy_save,energy_save,COLOR_GRAY2BGR);
armor_video_writer.write(armor_src);
energy_video_writer.write(energy_save); energy_video_writer.write(energy_save);
// cout<<energy_src.type()<<endl;
// LOGM(STR_CTR(WORD_GREEN,"Save ENERGY!"));
} }
if (show_origin) { if (show_origin) {
imshow("armor src", armor_src);
imshow("energy src", energy_src); imshow("energy src", energy_src);
} }
// if (from_camera == 0) { // if (from_camera == 0) {
@@ -128,17 +127,56 @@ int main(int argc, char *argv[]) {
// imshow("resize", energy_src); // imshow("resize", energy_src);
// energy.extract(energy_src); // energy.extract(energy_src);
// } // }
energy.run(energy_src); energy.run(armor_src, energy_src);
// waitKey(1); waitKey(1);
} else { }
else {
video_energy = new CameraWrapper(1, "energy"); video_energy = new CameraWrapper(1, "energy");
if(!video_energy->init()){ if(!video_energy->init()){
delete video_energy; delete video_energy;
video_energy = nullptr; video_energy = nullptr;
} }
} }
}
} else if (mcuData.state == ARMOR_STATE) { else if (mcuData.state == SMALL_ENERGY_STATE) {
last_state = mcuData.state;
if (video_armor && video_energy) {
ok = video_armor->read(armor_src) && video_energy->read(energy_src);
if (!ok) {
delete video_armor;
delete video_energy;
video_armor = nullptr;
video_energy = nullptr;
}
if(save_video){
Mat energy_save = energy_src.clone();
cvtColor(energy_save,energy_save,COLOR_GRAY2BGR);
armor_video_writer.write(armor_src);
energy_video_writer.write(energy_save);
}
if (show_origin) {
imshow("armor src", armor_src);
imshow("energy src", energy_src);
}
// if (from_camera == 0) {
// cv::resize(energy_src, energy_src, cv::Size(640, 480), 2);
// imshow("resize", energy_src);
// energy.extract(energy_src);
// }
energy.run(armor_src, energy_src);
waitKey(1);
}
else {
video_energy = new CameraWrapper(1, "energy");
if(!video_energy->init()){
delete video_energy;
video_energy = nullptr;
}
}
}
else if (mcuData.state == ARMOR_STATE) {
last_state = mcuData.state; last_state = mcuData.state;
if (video_armor) { if (video_armor) {
ok = video_armor->read(armor_src); ok = video_armor->read(armor_src);
@@ -148,8 +186,6 @@ int main(int argc, char *argv[]) {
} }
if(save_video){ if(save_video){
armor_video_writer.write(armor_src); armor_video_writer.write(armor_src);
// cout<<armor_src.type()<<endl;
// LOGM(STR_CTR(WORD_GREEN,"Save ARMOR!"));
} }
// flip(armor_src, armor_src, 0); // flip(armor_src, armor_src, 0);
if (show_origin) { if (show_origin) {
@@ -158,7 +194,8 @@ int main(int argc, char *argv[]) {
CNT_TIME("Armor Time", { CNT_TIME("Armor Time", {
armorFinder.run(armor_src); armorFinder.run(armor_src);
}); });
} else { }
else {
video_armor = new CameraWrapper(0, "armor"); video_armor = new CameraWrapper(0, "armor");
if(!video_armor->init()){ if(!video_armor->init()){
delete video_armor; delete video_armor;
@@ -166,8 +203,7 @@ int main(int argc, char *argv[]) {
} }
} }
} }
// cout<<last_state<<endl;
waitKey(1);
}); });
} while (ok); } while (ok);

View File

@@ -13,6 +13,10 @@
#define ENEMY_BLUE 0 #define ENEMY_BLUE 0
#define ENEMY_RED 1 #define ENEMY_RED 1
#define BIG_ENERGY_STATE 'b'
#define SMALL_ENERGY_STATE 's'
#define ARMOR_STATE 'a'
struct mcu_data{ struct mcu_data{
float curr_yaw; float curr_yaw;
float curr_pitch; float curr_pitch;

View File

@@ -66,4 +66,3 @@ void lastVideo(std::string &video_name, const std::string &filename_prefix){
} }
if(cnt > 1) std::string video_name = filename_prefix + std::to_string(cnt) + ".avi"; if(cnt > 1) std::string video_name = filename_prefix + std::to_string(cnt) + ".avi";
} }