rm记录第三阶段(一):能量机关(一)

本文记录博主在学校工作室备赛的过程,主要任务是识别能量机关,由于资料有限,博主计划对现有代码进行二次开发。文章详细介绍了识别装甲板的步骤,包括图像处理、轮廓检测等,并决定借鉴其他学校代码,特别是深大的Detect类,重点理解Yolo目标检测方法,以解决装甲板和流动条识别问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

然后今天开始就是回到学校在工作室开始备赛了,然后就是目前的任务就是识别大符(回学校才知道单项赛不用识别装甲板,假期白干了,但是我的读代码能力确实是提高了),我要去复现一回,要不就是无法进行提高,可能对我现在来说很难吧,但是我会成功的(给自己一个暗示),然后因为能量机关是2019出来的,我可以参照的就很少了,因为我的装甲板识别是参照吉大的然后打算能量机关也用,但是他这里没有将代码全部写完,我计划在这上面做二次开发。后期参照其他学习改进,比如说深大的有几个想法就挺好,后期可以参照一下。

然后就是这会打算不全写了,就把思路写下来,然后后期的二次开发在具体写下来。

然后就是他这个是一个独立的文件夹,并没有和其他的建立起联系,然后开始:

这里的主函数是在run.cpp里面,从这里看起:

int main() {
	Energy energy;
	Mat src;
	VideoCapture cap("/home/dji/视频/fan.mp4");
	cap.set(CAP_PROP_FRAME_WIDTH, 640);			//设置相机采样宽度
	cap.set(CAP_PROP_FRAME_HEIGHT, 480);		//设置相机采样高度
	cap.set(CAP_PROP_BRIGHTNESS, 20);			//设置相机采样亮度
	cap.set(CV_CAP_PROP_FPS, 200);				//设置相机采样帧率
	do {
		//时间消耗测试
		double t, tc;
		t = getTickCount();
		cap >> src;
		//resize(src, src, Size(640, 480));
		energy.run(src);
		//时间消耗测试
		tc = (getTickCount() - t) / getTickFrequency();
		printf("time consume %.5f\n", tc);    //显示出耗费时间的多少
		waitKey(1);
	} while (true);
}

从第一行看起:先实例化一个敌人对象,然后先看看这个类(Energ.h里):

bool is_big;//大符模式为true
bool is_small;//小符模式为true
void run(cv::Mat& src);//程序运行

先看看这个有两个模式,然后我们的单项赛的话只有大符,那么后期的话记住实在这里定义的模式。

然后就是一个集成函数:然后我们看看这个函数,这里面集成得到就是这个类里面的定义的各种方法,一个个来:

void Energy::clearAll() {
    fans.clear();
    armors.clear();
    flow_strip_fans.clear();
    target_armors.clear();
    flow_strips.clear();
}

这个函数对各种容器进行初始化,就是清空。那么有哪些容器呢?

	std::vector<cv::RotatedRect> fans;//图像中所有扇叶
	std::vector<cv::RotatedRect> target_armors;//可能的目标装甲板
	std::vector<cv::RotatedRect> armors;//图像中所有可能装甲板
	std::vector<cv::RotatedRect> flow_strip_fans;//可能的流动扇叶
	std::vector<cv::RotatedRect> flow_strips;//可能的流动条

可见有扇叶,目标装甲板,可能的装甲板,流动扇叶,流动条


void Energy::initImage(cv::Mat& src) {
	if (src.type() == CV_8UC3) {
		cvtColor(src, src, COLOR_BGR2GRAY);
	}
	if (mcu_data.enemy_color == ENEMY_BLUE) {
		threshold(src, src, _flow.BLUE_GRAY_THRESH, 255, THRESH_BINARY);
	}
	else if (mcu_data.enemy_color == ENEMY_RED) {
		threshold(src, src, _flow.RED_GRAY_THRESH, 255, THRESH_BINARY);
	}
	
	if (show_process) imshow("bin", src);
	if (show_energy || show_process)waitKey(1);

}

这个是对图像进行初始化操作,先转灰度,然后分别对红蓝两种情况进行处理。然后对显示进行了判断:这里有几个定义:

	bool show_energy; //是否显示图像
	bool show_process;//是否显示调试过程
	bool show_wrong;//是否显示报错
	bool show_data;//是否显示数据

int Energy::findArmors(const cv::Mat& src) {
	if (src.empty()) {
        if (show_wrong) cout << "empty!" << endl;
        return 0;
    }
	static Mat dst;
	dst = src.clone();
	if (src.type() == CV_8UC3) {
		cvtColor(dst, dst, CV_BGR2GRAY);//若读取三通道视频文件,需转换为单通道
	}
	std::vector<vector<Point> > armor_contours;
	std::vector<vector<Point> > armor_contours_external;//用总轮廓减去外轮廓,只保留内轮廓,除去流动条的影响。

	ArmorDilate(dst);//图像膨胀,防止图像断开并更方便寻找
	if (show_process) imshow("Armorstuct", dst);
	findContours(dst, armor_contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
	findContours(dst, armor_contours_external, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
	for (unsigned int i = 0; i < armor_contours_external.size(); i++)//去除外轮廓
	{
		int external_contour_size = armor_conto
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值