Auto Aim
This commit is contained in:
@@ -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(6, 6));
|
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
|
||||||
morphologyEx(src, src, MORPH_CLOSE, element);
|
morphologyEx(src, src, MORPH_CLOSE, element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 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;
|
||||||
|
cout<<"fan area: "<<length<<'\t'<<width<<endl;
|
||||||
|
|
||||||
// if(length>20&&width>20){
|
// if(length>20&&width>20){
|
||||||
// cout<<cur_rect.center;
|
// cout<<cur_rect.center;
|
||||||
|
|||||||
@@ -13,16 +13,16 @@ void Energy::initEnergyPartParam() {
|
|||||||
energy_part_param_.RPM = 10;
|
energy_part_param_.RPM = 10;
|
||||||
energy_part_param_.HIT_TIME = 1.14;
|
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_.SPLIT_GRAY_THRESH = 60;
|
||||||
energy_part_param_.FAN_GRAY_THRESH = 75;
|
energy_part_param_.FAN_GRAY_THRESH = 75;
|
||||||
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 = 0;
|
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_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_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;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ extern float curr_yaw, curr_pitch, mark_yaw, mark_pitch;
|
|||||||
extern int mark;
|
extern int mark;
|
||||||
|
|
||||||
int Energy::run(cv::Mat &src){
|
int Energy::run(cv::Mat &src){
|
||||||
// imshow("src",src);
|
imshow("src",src);
|
||||||
fans.clear();
|
fans.clear();
|
||||||
armors.clear();
|
armors.clear();
|
||||||
fanPosition.clear();
|
fanPosition.clear();
|
||||||
@@ -25,11 +25,11 @@ int Energy::run(cv::Mat &src){
|
|||||||
// if(first_armor_centers.size()>200)first_armor_centers.clear();
|
// if(first_armor_centers.size()>200)first_armor_centers.clear();
|
||||||
// cout<<"first_armor_centers.size(): "<<first_armor_centers.size()<<endl;
|
// cout<<"first_armor_centers.size(): "<<first_armor_centers.size()<<endl;
|
||||||
|
|
||||||
imagePreprocess(src);
|
// imagePreprocess(src);
|
||||||
// imshow("img_preprocess",src);
|
// imshow("img_preprocess",src);
|
||||||
|
|
||||||
threshold(src, src, energy_part_param_.GRAY_THRESH, 255, THRESH_BINARY);
|
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);
|
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;
|
cout<<"all_armor_centers.size(): "<<all_armor_centers.size()<<endl;
|
||||||
cycleLeastFit();
|
cycleLeastFit();
|
||||||
|
|
||||||
// cycle_center = cv::Point(212,246);
|
cycle_center = cv::Point(321,319);
|
||||||
// radius = 123.942;
|
radius = 109.178;
|
||||||
attack_distance = ATTACK_DISTANCE * 123.323 / radius;
|
attack_distance = ATTACK_DISTANCE * 123.323 / radius;
|
||||||
|
|
||||||
getFanPosition(fanPosition, fans, cycle_center, radius);
|
getFanPosition(fanPosition, fans, cycle_center, radius);
|
||||||
|
|||||||
12
main.cpp
12
main.cpp
@@ -51,13 +51,13 @@ int main(int argc, char *argv[])
|
|||||||
WrapperHead *video_armor;
|
WrapperHead *video_armor;
|
||||||
WrapperHead *video_energy;
|
WrapperHead *video_energy;
|
||||||
if(from_camera) {
|
if(from_camera) {
|
||||||
video_armor = new CameraWrapper("armor");
|
// video_armor = new CameraWrapper();
|
||||||
video_energy = new CameraWrapper("energy");
|
video_energy = new CameraWrapper();
|
||||||
}else {
|
}else {
|
||||||
video_armor = new VideoWrapper("r_l_640.avi");
|
video_armor = new VideoWrapper("r_l_640.avi");
|
||||||
video_energy = 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;
|
cout << "Video source initialization successfully." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
|
|||||||
energy.setAllyColor(ally_color);
|
energy.setAllyColor(ally_color);
|
||||||
energy.setRotation(energy_part_rotation);
|
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) {
|
if(show_origin) {
|
||||||
imshow("enery src", energy_src);
|
imshow("enery src", energy_src);
|
||||||
@@ -90,7 +90,7 @@ int main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete video_energy, video_armor;
|
delete video_energy;
|
||||||
cout << "Program fails. Restarting" << endl;
|
cout << "Program fails. Restarting" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ void uartReceive(Uart* uart){
|
|||||||
}
|
}
|
||||||
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){
|
||||||
if(mark == 0){
|
if(mark == 0){
|
||||||
mark = 1;
|
mark = 1;
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
class CameraWrapper: public WrapperHead {
|
class CameraWrapper: public WrapperHead {
|
||||||
private:
|
private:
|
||||||
const std::string name;
|
const std::string name;
|
||||||
|
int mode;
|
||||||
|
|
||||||
unsigned char* rgb_buffer;
|
unsigned char* rgb_buffer;
|
||||||
int camera_cnts;
|
int camera_cnts;
|
||||||
@@ -37,6 +38,9 @@ private:
|
|||||||
public:
|
public:
|
||||||
CameraWrapper();
|
CameraWrapper();
|
||||||
CameraWrapper(const std::string &n);
|
CameraWrapper(const std::string &n);
|
||||||
|
CameraWrapper(int camera_mode);
|
||||||
|
CameraWrapper(const std::string &n,int camera_mode);
|
||||||
|
|
||||||
~CameraWrapper() final;
|
~CameraWrapper() final;
|
||||||
|
|
||||||
bool init() final;
|
bool init() final;
|
||||||
|
|||||||
@@ -9,16 +9,36 @@ using std::cout;
|
|||||||
using std::endl;
|
using std::endl;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
CameraWrapper::CameraWrapper(const std::string &n):
|
CameraWrapper::CameraWrapper():
|
||||||
name(n),
|
name("NULL"),
|
||||||
|
mode(1),
|
||||||
camera_cnts(2),
|
camera_cnts(2),
|
||||||
camera_status(-1),
|
camera_status(-1),
|
||||||
iplImage(nullptr),
|
iplImage(nullptr),
|
||||||
channel(3){
|
channel(3){
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraWrapper::CameraWrapper():
|
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"),
|
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_cnts(2),
|
||||||
camera_status(-1),
|
camera_status(-1),
|
||||||
iplImage(nullptr),
|
iplImage(nullptr),
|
||||||
@@ -68,7 +88,7 @@ bool CameraWrapper::init() {
|
|||||||
|
|
||||||
rgb_buffer = (unsigned char *)malloc(tCapability.sResolutionRange.iHeightMax *
|
rgb_buffer = (unsigned char *)malloc(tCapability.sResolutionRange.iHeightMax *
|
||||||
tCapability.sResolutionRange.iWidthMax * 3);
|
tCapability.sResolutionRange.iWidthMax * 3);
|
||||||
|
if(mode == 0){
|
||||||
// 不使用自动曝光
|
// 不使用自动曝光
|
||||||
CameraSetAeState(h_camera, false);
|
CameraSetAeState(h_camera, false);
|
||||||
// 曝光时间10ms
|
// 曝光时间10ms
|
||||||
@@ -77,6 +97,13 @@ bool CameraWrapper::init() {
|
|||||||
CameraSetAnalogGain(h_camera, 63);
|
CameraSetAnalogGain(h_camera, 63);
|
||||||
// 使用预设LUT表
|
// 使用预设LUT表
|
||||||
CameraSetLutMode(h_camera, LUTMODE_PRESET);
|
CameraSetLutMode(h_camera, LUTMODE_PRESET);
|
||||||
|
}
|
||||||
|
else if(mode == 1){
|
||||||
|
// 使用自动曝光
|
||||||
|
CameraSetAeState(h_camera, true);
|
||||||
|
// 抗频闪
|
||||||
|
// CameraSetAntiFlick(h_camera, true);
|
||||||
|
}
|
||||||
|
|
||||||
/*让SDK进入工作模式,开始接收来自相机发送的图像
|
/*让SDK进入工作模式,开始接收来自相机发送的图像
|
||||||
数据。如果当前相机是触发模式,则需要接收到
|
数据。如果当前相机是触发模式,则需要接收到
|
||||||
|
|||||||
Reference in New Issue
Block a user