energy changed
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);//框取图像中的一块区域进行处理
|
||||||
|
|||||||
@@ -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;//扇叶和装甲板匹配时极坐标角度差的最大值
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
78
main.cpp
78
main.cpp
@@ -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,18 +127,57 @@ 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;
|
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;
|
||||||
if (video_armor) {
|
if (video_armor) {
|
||||||
ok = video_armor->read(armor_src);
|
ok = video_armor->read(armor_src);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
@@ -148,17 +186,16 @@ 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) {
|
||||||
imshow("armor src", armor_src);
|
imshow("armor src", armor_src);
|
||||||
}
|
}
|
||||||
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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user