This commit is contained in:
JiatongSun
2019-04-28 11:00:20 +08:00
parent e3fc7cf05c
commit c2b4bdf4cd
7 changed files with 64 additions and 32 deletions

View File

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

View File

@@ -36,6 +36,7 @@ int Energy::findFan(const cv::Mat &src, vector<EnergyPart> &fans, int &last_fans
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;
cout<<"fan area: "<<length<<'\t'<<width<<endl;
// if(length>20&&width>20){
// cout<<cur_rect.center;

View File

@@ -13,16 +13,16 @@ void Energy::initEnergyPartParam() {
energy_part_param_.RPM = 10;
energy_part_param_.HIT_TIME = 1.14;
energy_part_param_.GRAY_THRESH = 240;
energy_part_param_.GRAY_THRESH = 220;
energy_part_param_.SPLIT_GRAY_THRESH = 60;
energy_part_param_.FAN_GRAY_THRESH = 75;
energy_part_param_.ARMOR_GRAY_THRESH = 80;
energy_part_param_.FAN_CONTOUR_AREA_MAX = 17000;
energy_part_param_.FAN_CONTOUR_AREA_MIN = 0;
energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 100;
energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 90;
energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 140;
energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 40;
energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 35;
energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 60;
energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4;
energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1;

View File

@@ -12,7 +12,7 @@ extern float curr_yaw, curr_pitch, mark_yaw, mark_pitch;
extern int mark;
int Energy::run(cv::Mat &src){
// imshow("src",src);
imshow("src",src);
fans.clear();
armors.clear();
fanPosition.clear();
@@ -25,11 +25,11 @@ int Energy::run(cv::Mat &src){
// if(first_armor_centers.size()>200)first_armor_centers.clear();
// cout<<"first_armor_centers.size(): "<<first_armor_centers.size()<<endl;
imagePreprocess(src);
// imagePreprocess(src);
// imshow("img_preprocess",src);
threshold(src, src, energy_part_param_.GRAY_THRESH, 255, THRESH_BINARY);
// imshow("bin",src);
imshow("bin",src);
fans_cnt = findFan(src, fans, last_fans_cnt);
@@ -51,8 +51,8 @@ int Energy::run(cv::Mat &src){
cout<<"all_armor_centers.size(): "<<all_armor_centers.size()<<endl;
cycleLeastFit();
// cycle_center = cv::Point(212,246);
// radius = 123.942;
cycle_center = cv::Point(321,319);
radius = 109.178;
attack_distance = ATTACK_DISTANCE * 123.323 / radius;
getFanPosition(fanPosition, fans, cycle_center, radius);

View File

@@ -51,13 +51,13 @@ int main(int argc, char *argv[])
WrapperHead *video_armor;
WrapperHead *video_energy;
if(from_camera) {
video_armor = new CameraWrapper("armor");
video_energy = new CameraWrapper("energy");
// video_armor = new CameraWrapper();
video_energy = new CameraWrapper();
}else {
video_armor = new VideoWrapper("r_l_640.avi");
video_energy = new VideoWrapper("r_l_640.avi");
}
if (video_energy->init() && video_armor->init()) {
if (video_energy->init()) {
cout << "Video source initialization successfully." << endl;
}
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
energy.setAllyColor(ally_color);
energy.setRotation(energy_part_rotation);
while (video_energy->read(energy_src) && video_armor->read(armor_src))
while (video_energy->read(energy_src) && video_energy->read(armor_src))
{
if(show_origin) {
imshow("enery src", energy_src);
@@ -90,7 +90,7 @@ int main(int argc, char *argv[])
break;
}
}
delete video_energy, video_armor;
delete video_energy;
cout << "Program fails. Restarting" << endl;
}
@@ -119,7 +119,7 @@ void uartReceive(Uart* uart){
}
memcpy(&curr_yaw, buffer, 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(mark == 0){
mark = 1;

View File

@@ -19,6 +19,7 @@
class CameraWrapper: public WrapperHead {
private:
const std::string name;
int mode;
unsigned char* rgb_buffer;
int camera_cnts;
@@ -37,6 +38,9 @@ private:
public:
CameraWrapper();
CameraWrapper(const std::string &n);
CameraWrapper(int camera_mode);
CameraWrapper(const std::string &n,int camera_mode);
~CameraWrapper() final;
bool init() final;

View File

@@ -9,16 +9,36 @@ using std::cout;
using std::endl;
using namespace cv;
CameraWrapper::CameraWrapper(const std::string &n):
name(n),
camera_cnts(2),
camera_status(-1),
iplImage(nullptr),
channel(3){
}
CameraWrapper::CameraWrapper():
name("NULL"),
mode(1),
camera_cnts(2),
camera_status(-1),
iplImage(nullptr),
channel(3){
}
CameraWrapper::CameraWrapper(const std::string &n):
name(n),
mode(1),
camera_cnts(2),
camera_status(-1),
iplImage(nullptr),
channel(3){
}
CameraWrapper::CameraWrapper(int camera_mode):
name("NULL"),
mode(camera_mode),
camera_cnts(2),
camera_status(-1),
iplImage(nullptr),
channel(3){
}
CameraWrapper::CameraWrapper(const std::string &n,int camera_mode):
name(n),
mode(camera_mode),
camera_cnts(2),
camera_status(-1),
iplImage(nullptr),
@@ -68,15 +88,22 @@ bool CameraWrapper::init() {
rgb_buffer = (unsigned char *)malloc(tCapability.sResolutionRange.iHeightMax *
tCapability.sResolutionRange.iWidthMax * 3);
// 不使用自动曝光
CameraSetAeState(h_camera, false);
// 曝光时间10ms
CameraSetExposureTime(h_camera, 10000);
// 模拟增益4
CameraSetAnalogGain(h_camera, 63);
// 使用预设LUT表
CameraSetLutMode(h_camera, LUTMODE_PRESET);
if(mode == 0){
// 不使用自动曝光
CameraSetAeState(h_camera, false);
// 曝光时间10ms
CameraSetExposureTime(h_camera, 10000);
// 模拟增益4
CameraSetAnalogGain(h_camera, 63);
// 使用预设LUT表
CameraSetLutMode(h_camera, LUTMODE_PRESET);
}
else if(mode == 1){
// 使用自动曝光
CameraSetAeState(h_camera, true);
// 抗频闪
// CameraSetAntiFlick(h_camera, true);
}
/*让SDK进入工作模式开始接收来自相机发送的图像
数据。如果当前相机是触发模式,则需要接收到