diff --git a/armor/include/show_images/show_images.h b/armor/include/show_images/show_images.h index 14c8c66..e745673 100644 --- a/armor/include/show_images/show_images.h +++ b/armor/include/show_images/show_images.h @@ -13,5 +13,8 @@ void showArmorBoxVector(std::string windows_name, const cv::Mat &src, const std::vector &armor_box); void showArmorBox(std::string windows_name, const cv::Mat &src, cv::Rect2d armor_box); void showContours(std::string windows_name, const cv::Mat &src, const std::vector &light_blobs); +void showArmorBoxClass(std::string window_names, const cv::Mat &src, vector boxes_one, + vector boxes_two, vector boxes_three); + #endif /* _SHOW_IMAGES_H_ */ diff --git a/armor/src/armor_finder/armor_finder.cpp b/armor/src/armor_finder/armor_finder.cpp index 9a19d59..b00302f 100644 --- a/armor/src/armor_finder/armor_finder.cpp +++ b/armor/src/armor_finder/armor_finder.cpp @@ -22,14 +22,15 @@ ArmorFinder::ArmorFinder(EnemyColor color, Uart &u, string paras_folder) : void ArmorFinder::run(cv::Mat &src) { cv::Mat src_use; - if (src.type() == CV_8UC3) { - cv::cvtColor(src, src_use, CV_RGB2GRAY); - }else{ +// if (src.type() == CV_8UC3) { +// cv::cvtColor(src, src_use, CV_RGB2GRAY); +// }else{ src_use = src.clone(); - } - cv::cvtColor(src_use, src_gray, CV_BayerBG2GRAY); +// } + cv::cvtColor(src_use, src_gray, CV_RGB2GRAY); -// return stateSearchingTarget(src_use); + stateSearchingTarget(src_use); + return; switch (state){ case SEARCHING_STATE: @@ -49,7 +50,7 @@ void ArmorFinder::run(cv::Mat &src) { } break; case TRACKING_STATE: - if(!stateTrackingTarget(src_use)){ + if(!stateTrackingTarget(src_gray)){ state = SEARCHING_STATE; //std::cout << "into search!" << std::endl; } diff --git a/armor/src/armor_finder/classifier/classifier.cpp b/armor/src/armor_finder/classifier/classifier.cpp index c998116..13bf868 100644 --- a/armor/src/armor_finder/classifier/classifier.cpp +++ b/armor/src/armor_finder/classifier/classifier.cpp @@ -258,6 +258,9 @@ Classifier::Classifier(const string &folder) : state(true){ fc1_b = load_fc_b(folder+"fc1_b"); fc2_w = load_fc_w(folder+"fc2_w"); fc2_b = load_fc_b(folder+"fc2_b"); + if(state){ + LOGM("Load paras success!"); + } } //#define PRINT_MAT(name) (cout << #name":\n" << name << endl) @@ -285,10 +288,16 @@ Classifier::operator bool() const { } int Classifier::operator()(const cv::Mat &image) { - MatrixXd x; - cv2eigen(image, x); - x /= 255.0; - vector sub = {x}; + MatrixXd r, g, b; + std::vector channels; + cv::split(image, channels); + cv2eigen(channels[0], b); + cv2eigen(channels[1], g); + cv2eigen(channels[2], r); + r /= 255; + g /= 255; + b /= 255; + vector sub = {b, g, r}; vector> in = {sub}; MatrixXd result = calculate(in); MatrixXd::Index minRow, minCol; diff --git a/armor/src/armor_finder/state_machine/searching_state/image_process/image_process.cpp b/armor/src/armor_finder/state_machine/searching_state/image_process/image_process.cpp index 140cdc5..a7a22c9 100644 --- a/armor/src/armor_finder/state_machine/searching_state/image_process/image_process.cpp +++ b/armor/src/armor_finder/state_machine/searching_state/image_process/image_process.cpp @@ -36,15 +36,17 @@ void imageColorSplit(cv::Mat &src_input, cv::Mat &split, EnemyColor color) { resize(channels.at(0), blue, cv::Size(640, 480)); resize(channels.at(2), red, cv::Size(640, 480)); if(color == ENEMY_RED){ - split = red; + split = red - blue; }else if(color == ENEMY_BLUE){ - split = blue; + split = blue - red; } } } void imagePreProcess(cv::Mat &src) { +// cv::medianBlur(src, src, 5); + static cv::Mat kernel_erode = getStructuringElement(cv::MORPH_RECT, cv::Size(1, 4)); erode(src, src, kernel_erode); diff --git a/armor/src/armor_finder/state_machine/searching_state/searching_state.cpp b/armor/src/armor_finder/state_machine/searching_state/searching_state.cpp index 4415fd9..a07367b 100644 --- a/armor/src/armor_finder/state_machine/searching_state/searching_state.cpp +++ b/armor/src/armor_finder/state_machine/searching_state/searching_state.cpp @@ -114,8 +114,8 @@ static bool findArmorBoxes(LightBlobs &light_blobs, std::vector &arm cv::Rect2d rect_left = light_blobs.at(static_cast(i)).rect.boundingRect(); cv::Rect2d rect_right = light_blobs.at(static_cast(j)).rect.boundingRect(); double min_x, min_y, max_x, max_y; - min_x = fmin(rect_left.x, rect_right.x) - 5; - max_x = fmax(rect_left.x + rect_left.width, rect_right.x + rect_right.width) + 5; + min_x = fmin(rect_left.x, rect_right.x); + max_x = fmax(rect_left.x + rect_left.width, rect_right.x + rect_right.width); min_y = fmin(rect_left.y, rect_right.y) - 5; max_y = fmax(rect_left.y + rect_left.height, rect_right.y + rect_right.height) + 5; if (min_x < 0 || max_x > 640 || min_y < 0 || max_y > 480) { @@ -151,7 +151,7 @@ bool judge_light_color(std::vector &light, std::vector &co bool ArmorFinder::stateSearchingTarget(cv::Mat &src) { cv::Mat split, pmsrc=src.clone(); LightBlobs light_blobs, pm_light_blobs, light_blobs_real; - std::vector armor_boxes; + std::vector armor_boxes, boxes_one, boxes_two, boxes_three; // cv::resize(src, pmsrc, cv::Size(320, 240)); imageColorSplit(src, split, enemy_color); @@ -174,20 +174,45 @@ bool ArmorFinder::stateSearchingTarget(cv::Mat &src) { if(!findArmorBoxes(light_blobs, armor_boxes)){ return false; } + if(show_armor_boxes){ + showArmorBoxVector("boxes", split, armor_boxes); + cv::waitKey(1); + } if(classifier){ - for(const auto &box : armor_boxes){ + for(auto box : armor_boxes){ cv::Mat roi = src(box).clone(); - cv::resize(roi, roi, cv::Size(60, 45)); - if(classifier(roi)){ - armor_box = box; - break; + cv::resize(roi, roi, cv::Size(48, 36)); +// cv::imshow("roi", roi); +// cv::waitKey(0); + int c = classifier(roi); +// cout << c << endl; + switch(c){ + case 1: + boxes_one.emplace_back(box); + break; + case 2: + boxes_two.emplace_back(box); + break; + case 3: + boxes_three.emplace_back(box); + break; } } + if(!boxes_one.empty()){ + armor_box = boxes_one[0]; + }else if(!boxes_two.empty()){ + armor_box = boxes_two[0]; + }else if(!boxes_three.empty()){ + armor_box = boxes_three[0]; + } + if(show_armor_box){ + showArmorBoxClass("class", src, boxes_one, boxes_two, boxes_three); + } }else{ armor_box = armor_boxes[0]; } - if(show_armor_boxes){ - showArmorBoxVector("boxes", split, armor_boxes); + if(show_armor_box){ + showArmorBox("box", src, armor_box); cv::waitKey(1); } if(split.size() == cv::Size(320, 240)){ @@ -196,6 +221,5 @@ bool ArmorFinder::stateSearchingTarget(cv::Mat &src) { armor_box.width *= 2; armor_box.height *= 2; } - return sendBoxPosition(); } diff --git a/armor/src/show_images/show_images.cpp b/armor/src/show_images/show_images.cpp index 7ba2c41..4b7fbca 100644 --- a/armor/src/show_images/show_images.cpp +++ b/armor/src/show_images/show_images.cpp @@ -18,6 +18,28 @@ void showArmorBoxVector(std::string windows_name, const cv::Mat &src, const std: imshow(windows_name, image2show); } +void showArmorBoxClass(std::string windows_name, const cv::Mat &src, vector boxes_one, + vector boxes_two, vector boxes_three){ + static Mat image2show; + if (src.type() == CV_8UC1) // 黑白图像 + { + cvtColor(src, image2show, COLOR_GRAY2RGB); + } else if(src.type() == CV_8UC3) //RGB 彩色 + { + image2show = src.clone(); + } + for (auto &box:boxes_one) { + rectangle(image2show, box, Scalar(255, 0, 0), 1); + } + for (auto &box:boxes_two) { + rectangle(image2show, box, Scalar(0, 255, 0), 1); + } + for (auto &box:boxes_three) { + rectangle(image2show, box, Scalar(0, 0, 255), 1); + } + imshow(windows_name, image2show); +} + void showArmorBox(std::string windows_name, const cv::Mat &src, cv::Rect2d armor_box) { static Mat image2show; if (src.type() == CV_8UC1) // 黑白图像 diff --git a/main.cpp b/main.cpp index 89595da..5d00bfd 100644 --- a/main.cpp +++ b/main.cpp @@ -48,25 +48,28 @@ int main(int argc, char *argv[]) cin >> from_camera; } - WrapperHead *video; - if(from_camera) - video = new CameraWrapper; - else - video = new VideoWrapper("r_l_640.avi", "fan_640.avi"); - - if (video->init()) { + WrapperHead *video_armor; + WrapperHead *video_enegy; + if(from_camera) { + video_armor = new CameraWrapper("armor"); + video_enegy = new CameraWrapper("energy"); + }else { + video_armor = new VideoWrapper("/home/xinyang/Desktop/Video.mp4"); + video_enegy = new VideoWrapper("/home/xinyang/Desktop/Video.mp4"); + } + if (video_enegy->init() && video_armor->init()) { cout << "Video source initialization successfully." << endl; } Mat energy_src, armor_src; - ArmorFinder armorFinder(ENEMY_BLUE, uart, "../paras/"); + ArmorFinder armorFinder(ENEMY_BLUE, uart, "/home/xinyang/Desktop/AutoAim/tools/para/"); Energy energy(uart); energy.setAllyColor(ally_color); energy.setRotation(energy_part_rotation); - while (video->read(energy_src, armor_src)) + while (video_armor->read(energy_src) && video_armor->read(armor_src)) { if(show_origin) { imshow("enery src", energy_src); @@ -78,15 +81,16 @@ int main(int argc, char *argv[]) } energy.run(energy_src); }else{ - armorFinder.run(armor_src); + CNT_TIME(WORD_LIGHT_BLUE, "Armor Time", { + armorFinder.run(armor_src); + }); } - if (waitKey(1) == 'q') { flag = false; break; } } - delete video; + delete video_enegy, video_armor; cout << "Program fails. Restarting" << endl; } diff --git a/others/include/camera/camera_wrapper.h b/others/include/camera/camera_wrapper.h index 283e3b2..2e6cf99 100644 --- a/others/include/camera/camera_wrapper.h +++ b/others/include/camera/camera_wrapper.h @@ -18,40 +18,31 @@ class CameraWrapper: public WrapperHead { private: - unsigned char* rgb_buffer0; - unsigned char* rgb_buffer1; + const std::string name; + + unsigned char* rgb_buffer; int camera_cnts; - int camera_status0, camera_status1; + int camera_status; tSdkCameraDevInfo camera_enum_list[2]; - int h_camera0; - int h_camera1; - char camera_name0[32]; - char camera_name1[32]; + int h_camera; + char camera_name[32]; - tSdkCameraCapbility tCapability0; - tSdkCameraCapbility tCapability1; - tSdkFrameHead frame_info0; - tSdkFrameHead frame_info1; - BYTE *pby_buffer0; - BYTE *pby_buffer1; - IplImage* iplImage0; - IplImage* iplImage1; - int channel0; - int channel1; + tSdkCameraCapbility tCapability; + tSdkFrameHead frame_info; + BYTE *pby_buffer; + IplImage* iplImage; + int channel; - - - void swapCameraHandle(); - public: CameraWrapper(); + CameraWrapper(const std::string &n); ~CameraWrapper() final; bool init() final; - bool read(cv::Mat& src0, cv::Mat& src1) final; - bool readRaw(cv::Mat& src0, cv::Mat& src1); - bool readProcessed(cv::Mat& src0, cv::Mat& src1); + bool read(cv::Mat& src) final; + bool readRaw(cv::Mat& src); + bool readProcessed(cv::Mat& src); }; diff --git a/others/include/camera/video_wrapper.h b/others/include/camera/video_wrapper.h index 1ef2d1b..92b23d0 100644 --- a/others/include/camera/video_wrapper.h +++ b/others/include/camera/video_wrapper.h @@ -16,7 +16,7 @@ class VideoWrapper:public WrapperHead { public: - VideoWrapper(const std::string& filename0, const std::string& filename1); + VideoWrapper(const std::string& filename); ~VideoWrapper(); @@ -33,9 +33,9 @@ public: * @param src_right : output source video of right camera * @return bool value: whether the reading is successful */ - bool read(cv::Mat &src_left, cv::Mat &src_right) final; + bool read(cv::Mat &src) final; private: - cv::VideoCapture video0, video1; + cv::VideoCapture video; }; diff --git a/others/include/camera/wrapper_head.h b/others/include/camera/wrapper_head.h index 7df8c47..bb9dfea 100644 --- a/others/include/camera/wrapper_head.h +++ b/others/include/camera/wrapper_head.h @@ -11,11 +11,10 @@ * @brief A virtual class for wrapper of camera and video files */ class WrapperHead { - public: virtual ~WrapperHead() = default;; virtual bool init() = 0; - virtual bool read(cv::Mat &src_left, cv::Mat &src_right) = 0; + virtual bool read(cv::Mat &src) = 0; }; diff --git a/others/src/camera/camera_wrapper.cpp b/others/src/camera/camera_wrapper.cpp index 4802ab9..c42effa 100644 --- a/others/src/camera/camera_wrapper.cpp +++ b/others/src/camera/camera_wrapper.cpp @@ -3,20 +3,26 @@ // #include +#include using std::cout; using std::endl; using namespace cv; -CameraWrapper::CameraWrapper() -{ - camera_cnts = 2; - camera_status0 = -1; - camera_status1 = -1; - iplImage0 = nullptr; - iplImage1 = nullptr; - channel0 = 3; - channel1 = 3; +CameraWrapper::CameraWrapper(const std::string &n): + name(n), + camera_cnts(2), + camera_status(-1), + iplImage(nullptr), + channel(3){ +} + +CameraWrapper::CameraWrapper(): + name("NULL"), + camera_cnts(2), + camera_status(-1), + iplImage(nullptr), + channel(3){ } @@ -30,69 +36,52 @@ bool CameraWrapper::init() { //没有连接设备 if (camera_cnts == 0) { - cout<<"No device detected!"<= 1){ + LOGM("%d camera device detected!", camera_cnts); } - else if(camera_cnts == 1) - { - cout<<"Only one camera device detected"<= camera_cnts){ + LOGE("No device name %s!", name.data()); return false; } - CameraGetFriendlyName(h_camera0, camera_name0); - CameraGetFriendlyName(h_camera1, camera_name1); - cout<<"camera names: "< 0.2: + self.train_samples.append(self.file2nparray("%s/%s" % (dir, file))) + self.train_labels.append(self.id2label(i)) + else: + self.test_samples.append(self.file2nparray("%s/%s" % (dir, file))) + self.test_labels.append(self.id2label(i)) + self.train_samples = np.array(self.train_samples) + self.train_labels = np.array(self.train_labels) + self.test_samples = np.array(self.test_samples) + self.test_labels = np.array(self.test_labels) + return sets def sample_train_sets(self, length): samples = [] labels = [] for i in range(length): - id = random.randint(0, length-1) - samples.append(self.train_sets[id][0]) - labels.append(self.train_sets[id][1]) + id = random.randint(0, len(self.train_samples)-1) + samples.append(self.train_samples[id]) + labels.append(self.train_labels[id]) return np.array(samples), np.array(labels) def all_train_sets(self): - return self.train_sets[:, 0, :, :], self.train_sets[:, 1, :, :] + return self.train_samples[:], self.train_labels[:] def all_test_sets(self): - return self.test_sets[:, 0, :, :], self.test_sets[:, 1, :, :] + return self.test_samples[:], self.test_labels[:]