diff --git a/energy/include/energy/energy.h b/energy/include/energy/energy.h index 29cfcf7..896f292 100644 --- a/energy/include/energy/energy.h +++ b/energy/include/energy/energy.h @@ -102,18 +102,17 @@ private: void initEnergyPartParam(); void initRotation(); - int findFan(const cv::Mat &src, vector &fans, int &last_fans_cnt); - int findArmor(const cv::Mat &src, vector &armors, int &last_armors_cnt); + int findFan(const cv::Mat src, int &last_fans_cnt); + int findArmor(const cv::Mat src, int &last_armors_cnt); int findCenterR(const cv::Mat src); void showFanContours(std::string windows_name, const cv::Mat &src, const std::vector &fans); void showArmorContours(std::string windows_name, const cv::Mat &src, const std::vector &armors); - void showBothContours(std::string windows_name, const cv::Mat &src, const std::vector &fans, - const std::vector &armors); + void showBothContours(std::string windows_name, const cv::Mat src); void showCenterRContours(std::string windows_name, const cv::Mat src); - bool isValidFanContour(const vector &fan_contour); - bool isValidArmorContour(const vector &armor_contour); + bool isValidFanContour(const vector fan_contour); + bool isValidArmorContour(const vector armor_contour); bool isValidCenterRContour(const vector center_R_contour); void getFanPosition(std::vector &fanPosition, const std::vector &fans, cv::Point cycle_center, double radius); diff --git a/energy/src/energy/find/energy_finder.cpp b/energy/src/energy/find/energy_finder.cpp index ce8bdca..6aadb29 100644 --- a/energy/src/energy/find/energy_finder.cpp +++ b/energy/src/energy/find/energy_finder.cpp @@ -8,7 +8,10 @@ using std::cout; using std::endl; using std::vector; -int Energy::findFan(const cv::Mat &src, vector &fans, int &last_fans_cnt) { +//---------------------------------------------------------------------------------------------------------------------- +// 此函数用于寻找图像内所有的大风车扇叶 +// --------------------------------------------------------------------------------------------------------------------- +int Energy::findFan(const cv::Mat src, int &last_fans_cnt) { if (src.empty())return 0; static Mat src_bin; src_bin = src.clone(); @@ -16,6 +19,7 @@ int Energy::findFan(const cv::Mat &src, vector &fans, int &last_fans if(src.type() == CV_8UC3){ cvtColor(src_bin, src_bin, CV_BGR2GRAY); } + std::vector > fan_contours; StructingElementClose(src_bin,6,6); @@ -59,8 +63,10 @@ int Energy::findFan(const cv::Mat &src, vector &fans, int &last_fans } - -int Energy::findArmor(const cv::Mat &src, vector &armors, int &last_armors_cnt) { +//---------------------------------------------------------------------------------------------------------------------- +// 此函数用于寻找图像内所有的大风车装甲板模块 +// --------------------------------------------------------------------------------------------------------------------- +int Energy::findArmor(const cv::Mat src, int &last_armors_cnt) { if (src.empty())return 0; static Mat src_bin; src_bin = src.clone(); @@ -72,7 +78,6 @@ int Energy::findArmor(const cv::Mat &src, vector &armors, int &last_ std::vector > armor_contours_external;//用总轮廓减去外轮廓,只保留内轮廓,除去流动条的影响。 StructingElementErodeDilate(src_bin); -// StructingElementClose(src_bin,10,10); // imshow("armor struct",src_bin); findContours(src_bin, armor_contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); @@ -121,6 +126,10 @@ int Energy::findArmor(const cv::Mat &src, vector &armors, int &last_ return static_cast(armors.size()); } + +//---------------------------------------------------------------------------------------------------------------------- +// 此函数用于寻找图像内大风车中心字母“R” +// --------------------------------------------------------------------------------------------------------------------- int Energy::findCenterR(const cv::Mat src) { if (src.empty())return 0; static Mat src_bin; @@ -159,7 +168,10 @@ int Energy::findCenterR(const cv::Mat src) { return static_cast(centerRs.size()); } -bool Energy::isValidFanContour(const vector &fan_contour) { +//---------------------------------------------------------------------------------------------------------------------- +// 此函数用于判断找到的矩形候选区是否为扇叶 +// --------------------------------------------------------------------------------------------------------------------- +bool Energy::isValidFanContour(const vector fan_contour) { double cur_contour_area = contourArea(fan_contour); if (cur_contour_area > energy_part_param_.FAN_CONTOUR_AREA_MAX || cur_contour_area < energy_part_param_.FAN_CONTOUR_AREA_MIN) @@ -179,29 +191,31 @@ bool Energy::isValidFanContour(const vector &fan_contour) { //cout<<"length width min fail."< energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX || -// length_width_ratio < energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN) -// { -// //cout<<"length width ratio fail."< energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX || + length_width_ratio < energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN) + { + //cout<<"length width ratio fail."< &armor_contour) { +//---------------------------------------------------------------------------------------------------------------------- +// 此函数用于判断找到的矩形候选区是否为装甲板 +// --------------------------------------------------------------------------------------------------------------------- +bool Energy::isValidArmorContour(const vector armor_contour) { double cur_contour_area = contourArea(armor_contour); -// if (cur_contour_area > energy_part_param_.ARMOR_CONTOUR_AREA_MAX || -// cur_contour_area < energy_part_param_.ARMOR_CONTOUR_AREA_MIN) -// { -// //cout< energy_part_param_.ARMOR_CONTOUR_AREA_MAX || + cur_contour_area < energy_part_param_.ARMOR_CONTOUR_AREA_MIN) + { + //cout< cur_size.width ? cur_size.height : cur_size.width; @@ -230,15 +244,18 @@ bool Energy::isValidArmorContour(const vector &armor_contour) { return true; } +//---------------------------------------------------------------------------------------------------------------------- +// 此函数用于判断找到的矩形候选区是否为可能的风车中心R候选区 +// --------------------------------------------------------------------------------------------------------------------- bool Energy::isValidCenterRContour(const vector center_R_contour) { double cur_contour_area = contourArea(center_R_contour); -// if (cur_contour_area > energy_part_param_.ARMOR_CONTOUR_AREA_MAX || -// cur_contour_area < energy_part_param_.ARMOR_CONTOUR_AREA_MIN) -// { -// //cout< energy_part_param_.ARMOR_CONTOUR_AREA_MAX || + cur_contour_area < energy_part_param_.ARMOR_CONTOUR_AREA_MIN) + { + //cout< cur_size.width ? cur_size.height : cur_size.width; diff --git a/energy/src/energy/run.cpp b/energy/src/energy/run.cpp index 08e2874..1cdfa78 100644 --- a/energy/src/energy/run.cpp +++ b/energy/src/energy/run.cpp @@ -33,18 +33,18 @@ int Energy::run(cv::Mat &src){ - fans_cnt = findFan(src, fans, last_fans_cnt); + fans_cnt = findFan(src, last_fans_cnt); // cout<<"fans_cnt: "<0)showFanContours("fan",src,fans); // fans_cnt=0; - armors_cnt = findArmor(src, armors, last_armors_cnt); + armors_cnt = findArmor(src, last_armors_cnt); // cout<<"armors_cnt: "<0) showArmorContours("armor",src,armors); - if(armors_cnt>0||fans_cnt>0) showBothContours("Both",src, fans, armors); + if(armors_cnt>0||fans_cnt>0) showBothContours("Both",src); centerRs_cnt = findCenterR(src); if(centerRs_cnt>0)showCenterRContours("R",src); diff --git a/energy/src/energy/show/show.cpp b/energy/src/energy/show/show.cpp index 912ecd2..d5f23b1 100644 --- a/energy/src/energy/show/show.cpp +++ b/energy/src/energy/show/show.cpp @@ -83,8 +83,7 @@ void Energy::showCenterRContours(std::string windows_name, const cv::Mat src) { imshow(windows_name, image2show); } -void Energy::showBothContours(std::string windows_name, const cv::Mat &src, const std::vector &fans, - const std::vector &armors) { +void Energy::showBothContours(std::string windows_name, const cv::Mat src) { if (src.empty())return; static Mat image2show; if(src.type() == CV_8UC1) // 黑白图像