Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
{

"name": "(gdb) Launch", /* 配置名称,将会在启动配置的下拉菜单中显⽰ */
"preLaunchTask": "build", /* 调试前执⾏ 'build'选项 */
// "preLaunchTask": "build", /* 调试前执⾏ 'build'选项 */
"type": "cppdbg", /* 配置类型,这⾥只能为cppdbg */
"request": "launch",/**/
"program": "${workspaceFolder}/run.o", /*选择要调试的⽂件路径*/
Expand Down
12 changes: 7 additions & 5 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
"command": "/usr/bin/g++", /* 这⾥填写你的编译器地址 */
"args": [
/* 类似与qt的Pro⽂件⾥开始的那⼏句 */
"-Ofast",
"-march=native",
"-flto",
"-frename-registers",
"-std=c++11",// 静态链接
// "-Ofast",
// "-march=native",
// "-flto",
// "-frename-registers",
"-std=c++14",// 静态链接
"-static-libgcc",
"-lpthread",

Expand All @@ -31,6 +31,7 @@
"-I","${workspaceFolder}/module/RM_Buff/Target",
"-I","${workspaceFolder}/module/RM_Buff",
"-I","${workspaceFolder}/module/top_detect",
"-I","${workspaceFolder}/module/orc",
"-I","${workspaceFolder}/base",
"-I","/usr/local/include",
"-I","/usr/local/include/opencv4",
Expand All @@ -52,6 +53,7 @@
"${workspaceFolder}/module/RM_Buff/Target/Target.cpp",
"${workspaceFolder}/module/RM_Buff/RM_Buff.cpp",
"${workspaceFolder}/module/top_detect/top.cpp",
"${workspaceFolder}/module/orc/orc.cpp",
"${workspaceFolder}/base/connector.cpp",
"${workspaceFolder}/user/main.cpp",/* ${workspaceFolder}表⽰路径从当前项⽬⽂件夹开始 */
"-o", /* 编译输出⽂件的存放路径 */
Expand Down
3 changes: 2 additions & 1 deletion base/connector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Connector::Connector() {}
Connector::~Connector() {}

void Connector::run() {
model module_("mnist-8.onnx");
while (true) {
if (mv_capture_.isindustryimgInput()) {
src_img_ = mv_capture_.image();
Expand Down Expand Up @@ -40,7 +41,7 @@ void Connector::run() {
mv_capture_.cameraReleasebuff();
armor_.free_Memory();
// usleep(1);
if (cv::waitKey(1) == 'q') {
if (cv::waitKey(0) == 'q') {
return;
}
}
Expand Down
15 changes: 12 additions & 3 deletions base/connector.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,28 @@
#include "module/RM_Buff/RM_Buff.hpp"
#include "module/angle_solve/rm_solve_pnp.hpp"
#include "module/armor/rm_armor.hpp"


class Connector {
private:
cv::Mat src_img_;
mv_camera::RM_VideoCapture mv_capture_ =

mv_camera::RM_VideoCapture mv_capture_ =//初始相机的结构体
mv_camera::RM_VideoCapture(mv_camera::CameraParam(
1, mv_camera::RESOLUTION_1280_X_800, mv_camera::EXPOSURE_600));
1, mv_camera::RESOLUTION_1280_X_800, mv_camera::EXPOSURE_600));

armor::RM_ArmorDetector armor_ =
armor::RM_ArmorDetector("module/armor/armor_config.xml");

serial_port::SerialPort serial_ =
serial_port::SerialPort("devices/serial/serial_config.xml");

buff::RM_Buff buff_ = buff::RM_Buff("module/RM_Buff/Config/buff_config.xml");

cv::VideoCapture cap_ =
cv::VideoCapture("/home/xx/下载/视频/效果图/camera_MaxBuff18.avi");
cv::VideoCapture("/home/sms/VIDEO/camera_MaxBuff15.avi");



public:
void run();
Expand Down
Binary file added mnist-8.onnx
Binary file not shown.
4 changes: 4 additions & 0 deletions module/armor/armor_config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@
<V_BLUE_MIN>30</V_BLUE_MIN>
<V_BLUE_MAX>255</V_BLUE_MAX>





<!--~~~~~~~~~~~~~~ 1 图像处理部分 1 ~~~~~~~~~~~~~~-->

<!--~~~~~~~~~~~~~~ 2 灯条查找部分 2 ~~~~~~~~~~~~~~-->
Expand Down
115 changes: 109 additions & 6 deletions module/armor/rm_armor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ RM_ArmorDetector::RM_ArmorDetector(std::string _armor_config) {
fs_armor["S_BLUE_MAX"] >> image_config_.s_blue_max;
fs_armor["V_BLUE_MIN"] >> image_config_.v_blue_min;
fs_armor["V_BLUE_MAX"] >> image_config_.v_blue_max;


}

fs_armor["LIGHT_DRAW"] >> light_config_.light_draw;
fs_armor["LIGHT_EDTI"] >> light_config_.light_edit;
fs_armor["LIGHT_RATIO_W_H_MIN"] >> light_config_.ratio_w_h_min;
Expand Down Expand Up @@ -57,6 +60,8 @@ RM_ArmorDetector::RM_ArmorDetector(std::string _armor_config) {

std::cout << "装甲板参数初始化成功" << std::endl;
std::cout << "💚💚💚💚💚💚💚💚💚💚💚💚" << std::endl;


}

/**
Expand Down Expand Up @@ -162,8 +167,9 @@ bool RM_ArmorDetector::find_Light() {
* @return false 无法得到装甲板
*/
serial_port::Write_Data RM_ArmorDetector::run_Armor(
cv::Mat &_src_img, serial_port::Receive_Data _receive_data) {
cv::Mat &_src_img, serial_port::Receive_Data _receive_data ) {
//图像处理
frame = _src_img.clone();
run_Image(_src_img, _receive_data.my_color);
draw_img_ = _src_img;
if (find_Light()) {
Expand All @@ -180,6 +186,9 @@ serial_port::Write_Data RM_ArmorDetector::run_Armor(

if (armor_config_.armor_draw == 1 || light_config_.light_draw == 1 ||
armor_config_.armor_edit == 1 || light_config_.light_edit == 1) {
cv::putText(draw_img_,to_string( pnp_.returnDepth()),
cv::Point(50,100),cv::FONT_HERSHEY_SIMPLEX,1,
cv::Scalar(0,255,255),1,cv::LINE_AA);
imshow("armor_draw_img", draw_img_);
draw_img_ = cv::Mat::zeros(_src_img.size(), CV_8UC3);
}
Expand All @@ -191,6 +200,7 @@ serial_port::Write_Data RM_ArmorDetector::run_Armor(
}
if (armor_config_.armor_draw == 1 || light_config_.light_draw == 1 ||
armor_config_.armor_edit == 1 || light_config_.light_edit == 1) {

imshow("armor_draw_img", draw_img_);
draw_img_ = cv::Mat::zeros(_src_img.size(), CV_8UC3);
}
Expand All @@ -199,6 +209,79 @@ serial_port::Write_Data RM_ArmorDetector::run_Armor(
pnp_.returnYawAngle(), cv::Point(0, 0)),
pnp_.returnPitchAngle(), pnp_.returnDepth(), armor_.size(), 0);
}



/*********number*********************/

cv::Mat RM_ArmorDetector::Save_ROI(cv::Rect input_rect , cv::Mat img_input)
{
cv::Point Point_t;int width_ ,height_;
Point_t.x = input_rect.x + 10;
Point_t.y = input_rect.y - 30;
width_ = input_rect.width -20;
height_ = input_rect.height +50;
if(Point_t.x < 0)
{
Point_t.x = 0 ;
}
if(Point_t.y < 0)
{
Point_t.y = 0;
}
if(Point_t.x+width_ > img_input.cols)
{
width_ = img_input.cols - abs(Point_t.x);
}
if(Point_t.y+height_ > img_input.rows)
{
height_ = img_input.rows - abs(Point_t.y);
}

return img_input(cv::Rect(Point_t,cv::Size(width_,height_)));

}


bool RM_ArmorDetector::NumberOrc()
{

cv::namedWindow("数字number");
cv::createTrackbar("h_min_num", "数字number",&OrcCtrl_.num_cfg_.h_min_num,
255, NULL);
cv::createTrackbar("s_min_num", "数字number",
&OrcCtrl_.num_cfg_.s_min_num, 255, NULL);
cv::createTrackbar("v_min_num", "数字number",
&OrcCtrl_.num_cfg_.v_min_num, 255, NULL);

cv::createTrackbar("CONFIDENT", "数字number",
&OrcCtrl_.num_cfg_.Confident, 5000, NULL);//置信度
cv::createTrackbar("kernel_size", "数字number",
&OrcCtrl_.num_cfg_.kennerl_size, 10, NULL);//置信度

cv::Mat Number_img = Save_ROI(armor_data_.armor_rect.boundingRect(),frame);
int k =module_.inferring(Number_img,
2*OrcCtrl_.num_cfg_.kennerl_size-1,
cv::Scalar(OrcCtrl_.num_cfg_.h_min_num,OrcCtrl_.num_cfg_.s_min_num,OrcCtrl_.num_cfg_.v_min_num),
cv::Scalar(255,255,255),OrcCtrl_.num_cfg_.Confident);
if(OrcCtrl_.num_cfg_.switch_number == 1)
{
putText( frame, to_string(k), cv::Point(100, 100), 5, 5.0 ,cv::Scalar(0,360,360),
2, cv::LINE_8, false );
cv::imshow("frame_number",frame);
cv::imshow("number",Number_img);
}


if(k == 2)
{
return false;
}else{
return true;
}
}

/*********number*********************/
/**
* @brief 求两点之间的距离
*
Expand Down Expand Up @@ -323,7 +406,7 @@ bool RM_ArmorDetector::fitting_Armor() {
* @return true 找到了符合装甲板条件的位置
* @return false 没找到了符合装甲板条件的位置
*/
bool RM_ArmorDetector::light_Judge(int i, int j) {
bool RM_ArmorDetector::light_Judge(int i, int j ) {
armor_data_.left_light_height =
MAX(light_[i].size.height, light_[i].size.width);
armor_data_.left_light_width =
Expand All @@ -344,7 +427,8 @@ bool RM_ArmorDetector::light_Judge(int i, int j) {
armor_data_.light_width_aspect <
(armor_config_.light_width_ratio_max * 0.1) &&
armor_data_.light_width_aspect >
(armor_config_.light_height_ratio_min * 0.1)) {
(armor_config_.light_height_ratio_min * 0.1))
{
armor_data_.height = (armor_data_.left_light.size.height +
armor_data_.right_light.size.height) /
2;
Expand Down Expand Up @@ -377,12 +461,31 @@ bool RM_ArmorDetector::light_Judge(int i, int j) {
(armor_config_.small_armor_aspect_min * 0.1) &&
(armor_data_.aspect_ratio < armor_config_.armor_type_th * 0.1)) {
armor_data_.distinguish = 0; // 小装甲板
return true;


if(NumberOrc())
{
if(OrcCtrl_.num_cfg_.switch_number == 1)
{
cv::putText(draw_img_,"SMALL",cv::Point(50,50),cv::FONT_HERSHEY_SIMPLEX,2,
cv::Scalar(255,255,255),2,cv::LINE_AA);
}
return true;
}else
{
return false;
}
} else if (armor_data_.aspect_ratio >
(armor_config_.armor_type_th * 0.1) &&
armor_data_.aspect_ratio <
(armor_config_.big_armor_aspect_max * 0.1)) {
armor_data_.distinguish = 1; //大装甲板
(armor_config_.big_armor_aspect_max * 0.1)){
armor_data_.distinguish = 1; //大装甲板
NumberOrc();
if(OrcCtrl_.num_cfg_.switch_number == 1)
{
cv::putText(draw_img_,"BIG",cv::Point(50,50),cv::FONT_HERSHEY_SIMPLEX,2,
cv::Scalar(255,255,255),2,cv::LINE_AA);
}
return true;
}
}
Expand Down
29 changes: 26 additions & 3 deletions module/armor/rm_armor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
#include "module/angle_solve/rm_solve_pnp.hpp"
#include "module/filter/filter.hpp"
#include "module/top_detect/top.hpp"
#include "module/orc/orc.hpp"
#include "opencv_onnx_inferring.hpp"


namespace armor {
struct Armor_Data {
Expand Down Expand Up @@ -48,6 +51,7 @@ struct Armor_Cfg {
int small_armor_aspect_min;
int armor_type_th;
int big_armor_aspect_max;

};

struct Light_Cfg {
Expand Down Expand Up @@ -88,7 +92,12 @@ struct Image_Cfg {
int gray_edit = 0;
int color_edit = 0;
int method = 0;



};


/**
* @brief 图像处理
*
Expand All @@ -97,14 +106,23 @@ class RM_ArmorDetector {
//装甲板
public:
serial_port::Write_Data run_Armor(cv::Mat &_src_img,
serial_port::Receive_Data _receive_data);
bool light_Judge(int i, int j); //判断左右灯条能否组成装甲板
serial_port::Receive_Data _receive_data );
bool light_Judge(int i, int j ); //判断左右灯条能否组成装甲板
int average_Color(); //计算图像颜色平均值
bool fitting_Armor(); //拟合装甲板
bool find_Light(); //寻找灯条
void final_Armor(); //最优装甲板
void free_Memory(); //释放内存
int motion_Direction(); //判断装甲板运动方向
int motion_Direction(); //判断装甲板运动方向

/****************数字*************************/

bool NumberOrc();
cv::Mat Save_ROI( cv::Rect input_rect , cv::Mat img_input);

/****************数字*************************/


inline Armor_Data returnFinalArmor(int _num) { return armor_[_num]; }
inline cv::Point returnFinalArmorCenter(int _num) {
return armor_[num].armor_rect.center;
Expand Down Expand Up @@ -136,6 +154,10 @@ class RM_ArmorDetector {
Image_Cfg image_config_;
Light_Cfg light_config_;


Orc::OrcNumber OrcCtrl_ = Orc::OrcNumber("module/orc/orc_config.xml");
model module_ = model("mnist-8.onnx");

cv::Mat frame; //原图
cv::Mat draw_img_; //画板
cv::Mat gray_img_;
Expand Down Expand Up @@ -173,6 +195,7 @@ class RM_ArmorDetector {
int armor_direction = 0; // 1向右 -1 向左
int num = 0; //运行次数


//图像
private:
cv::Mat gray_trackbar_ = cv::Mat::zeros(1, 300, CV_8UC1);
Expand Down
25 changes: 25 additions & 0 deletions module/orc/orc.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include "orc.hpp"

namespace Orc
{
OrcNumber::OrcNumber(){}

OrcNumber::OrcNumber(std::string Orc_config_)
{
cv::FileStorage Orc_armor(Orc_config_, cv::FileStorage::READ);
Orc_armor["H_MIN_NUM"] >> num_cfg_.h_min_num;
Orc_armor["H_MAX_NUM"] >> num_cfg_.h_max_num;
Orc_armor["S_MIN_NUM"] >> num_cfg_.s_min_num;
Orc_armor["S_MAX_NUM"] >> num_cfg_.s_max_num;
Orc_armor["V_MIN_NUM"] >> num_cfg_.v_min_num;
Orc_armor["V_MAX_NUM"] >> num_cfg_.v_max_num;
Orc_armor["CONFIDENT"] >> num_cfg_.Confident;
Orc_armor["KERNEL_SIZE"] >> num_cfg_.kennerl_size;

Orc_armor["NUMBER_SWITCH"] >> num_cfg_.switch_number;
}
OrcNumber::~OrcNumber(){}


} // namespace Orc

Loading