OpenCV 360度行车辅助系统——红绿灯智能预判

2024-01-25 01:30

本文主要是介绍OpenCV 360度行车辅助系统——红绿灯智能预判,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. AI学习红绿灯

此功能仅限前置摄像头。当视频刚开始播放时,通过自研AI算法学习红绿像素高频出现的位置,学习结束后根据学习结果判断是否使用AI红绿灯 区域,并在接下来的视频部分针对区域进行红绿灯识别。

检测到红灯则在视频底端显示“Red”字样,检测到绿灯则在视频底端显示“Green”字样。

 

 

1、收集前5%帧的红绿色素点

2、按照坐标大小排序,删掉前后10%,删掉异常大、小的值

3、筛选后判断结果数量是否充足,充足则开始使用,不足则用系统默认的区域

4、在应用的过程中持续监测红绿像素,如果出现大幅度像素密集点偏移,则重新学习

Mat player::RG_detector(Mat frame)
{Mat detected_frame = frame.clone();Mat roi(detected_frame, Rect(400,200,400,100));Rect detected_rect(400,200,400,100);//调整亮度frame.convertTo(img, img.type(), a, b);//转换为YCrCb颜色空间cvtColor(img, imgYCrCb, CV_BGR2YCrCb);imgRed.create(imgYCrCb.rows, imgYCrCb.cols, CV_8UC1);imgGreen.create(imgYCrCb.rows, imgYCrCb.cols, CV_8UC1);//分解YCrCb的三个成分vector<Mat> planes;split(imgYCrCb, planes);// 遍历以根据Cr分量拆分红色和绿色MatIterator_<uchar> it_Cr = planes[1].begin<uchar>(),it_Cr_end = planes[1].end<uchar>();MatIterator_<uchar> it_Red = imgRed.begin<uchar>();MatIterator_<uchar> it_Green = imgGreen.begin<uchar>();for (; it_Cr != it_Cr_end; ++it_Cr, ++it_Red, ++it_Green){// RED, 145<Cr<470if (*it_Cr > 145 && *it_Cr < 470)*it_Red = 255;else*it_Red = 0;// GREEN 95<Cr<110if (*it_Cr > 95 && *it_Cr < 110)*it_Green = 255;else*it_Green = 0;}redCount = processImgR(imgRed);greenCount = processImgG(imgGreen);cout << "red:" << redCount << ";  " << "green:" << greenCount << endl;if(currentFrameNumber < 50){putText(frame, "AI learning", hintTextPoint, font_face, font_scale, Scalar(135, 74, 32), thickness, 8, 0);}else{if(redCount > greenCount ){putText(frame, "Red", hintTextPoint, font_face, font_scale, Scalar(41, 41, 239), thickness, 8, 0);}else if(redCount < greenCount ){putText(frame, "Green", hintTextPoint, font_face, font_scale, Scalar(22, 210, 115), thickness, 8, 0);}}return frame;
}bool player::RGB_AI_learn_x_y(int x, int y)
{if(currentFrameNumber <= totalFrameNumber / 20){if(y <= frame.cols/2){RGB_learn_array_x.push_back(x);RGB_learn_array_y.push_back(y);}}else{sort(RGB_learn_array_x.begin(), RGB_learn_array_x.end());sort(RGB_learn_array_y.begin(), RGB_learn_array_y.end());if(int subArrayNum = RGB_learn_array_x.size() - RGB_learn_array_y.size() != 0){//删除多余元素if(subArrayNum > 0){for(int i=0; i<subArrayNum; i++){RGB_learn_array_x.pop_back();}}else if(subArrayNum < 0){for(int i=0; i>subArrayNum; i--){RGB_learn_array_y.pop_back();}}}int delete_count = 0, delete_total = RGB_learn_array_x.size()/10;for(delete_count = 0; delete_count < delete_total; delete_count++){//删除 10% 较大值RGB_learn_array_x.pop_back();RGB_learn_array_y.pop_back();}sort(RGB_learn_array_x.rbegin(), RGB_learn_array_x.rend());sort(RGB_learn_array_y.rbegin(), RGB_learn_array_y.rend());for(delete_count = 0; delete_count < delete_total; delete_count++){//删除 10% 较小值RGB_learn_array_x.pop_back();RGB_learn_array_y.pop_back();}sort(RGB_learn_array_x.begin(), RGB_learn_array_x.end());sort(RGB_learn_array_y.begin(), RGB_learn_array_y.end());long long int sum_x, sum_y;sum_x = accumulate(begin(RGB_learn_array_x),end(RGB_learn_array_x), 0);sum_y = accumulate(begin(RGB_learn_array_y),end(RGB_learn_array_y), 0);//计算均值RGB_learn_x = (int)sum_x / RGB_learn_array_x.size();RGB_learn_y = (int)sum_y / RGB_learn_array_y.size();//计算范围RGB_learn_w = RGB_learn_array_x.end() - RGB_learn_array_x.begin();RGB_learn_h = RGB_learn_array_y.end() - RGB_learn_array_y.begin();if(RGB_learn_array_x.size()>50)return true;//如果学习到大量红绿灯,认为学习有效else return false;}
}int player::processImgR(Mat src)
{Mat tmp;vector<vector<Point>> contours;vector<Vec4i> hierarchy;vector<Point> hull;CvPoint2D32f tempNode;CvMemStorage* storage = cvCreateMemStorage();CvSeq* pointSeq = cvCreateSeq(CV_32FC2, sizeof(CvSeq), sizeof(CvPoint2D32f), storage);Rect* trackBox;Rect* result;int resultNum = 0;int area = 0;src.copyTo(tmp);//提取轮廓findContours(tmp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);if (contours.size() > 0){trackBox = new Rect[contours.size()];result = new Rect[contours.size()];//确定要跟踪的区域for (int i = 0; i < contours.size(); i++){cvClearSeq(pointSeq);// 获取凸包的点集convexHull(Mat(contours[i]), hull, true);int hullcount = (int)hull.size();// 凸包的保存点for (int j = 0; j < hullcount - 1; j++){//if(HoughCircle_detector(src) > 1){bool final_learn_result;if(currentFrameNumber <= totalFrameNumber / 20){//前面 5% 帧用来学习红绿灯位置final_learn_result = RGB_AI_learn_x_y(hull[j].x, hull[j].y);}else{if(final_learn_result == true){//学习有效,使用AI识别红绿灯if(hull[j].x >= RGB_learn_x-RGB_learn_w/2 && hull[j].x <= RGB_learn_x+RGB_learn_w/2 &&hull[j].y >= RGB_learn_y-RGB_learn_h/2 && hull[j].y <= RGB_learn_y+RGB_learn_h/2){//cout<<"AI success!"<<endl;tempNode.x = hull[j].x;tempNode.y = hull[j].y;cvSeqPush(pointSeq, &tempNode);}}else{if(hull[j].x >= 400 && hull[j].x <= 800 &&hull[j].y >= 400 && hull[j].y <= 550){tempNode.x = hull[j].x;tempNode.y = hull[j].y;cvSeqPush(pointSeq, &tempNode);}}}}}trackBox[i] = cvBoundingRect(pointSeq);}if (isFirstDetectedR){lastTrackBoxR = new Rect[contours.size()];for (int i = 0; i < contours.size(); i++)lastTrackBoxR[i] = trackBox[i];lastTrackNumR = contours.size();isFirstDetectedR = false;}else{for (int i = 0; i < contours.size(); i++){for (int j = 0; j < lastTrackNumR; j++){if (isIntersected(trackBox[i], lastTrackBoxR[j])){result[resultNum] = trackBox[i];break;}}resultNum++;}delete[] lastTrackBoxR;lastTrackBoxR = new Rect[contours.size()];for (int i = 0; i < contours.size(); i++){lastTrackBoxR[i] = trackBox[i];}lastTrackNumR = contours.size();}delete[] trackBox;}else{isFirstDetectedR = true;result = NULL;}cvReleaseMemStorage(&storage);if (result != NULL){for (int i = 0; i < resultNum; i++){area += result[i].area();}}delete[] result;return area;
}int player::processImgG(Mat src)
{Mat tmp;vector<vector<Point> > contours;vector<Vec4i> hierarchy;vector< Point > hull;CvPoint2D32f tempNode;CvMemStorage* storage = cvCreateMemStorage();CvSeq* pointSeq = cvCreateSeq(CV_32FC2, sizeof(CvSeq), sizeof(CvPoint2D32f), storage);Rect* trackBox;Rect* result;int resultNum = 0;int area = 0;src.copyTo(tmp);// Extract the contourfindContours(tmp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);if (contours.size() > 0){trackBox = new Rect[contours.size()];result = new Rect[contours.size()];// Determine the area to trackfor (int i = 0; i < contours.size(); i++){cvClearSeq(pointSeq);// Get the point set of the convex hullconvexHull(Mat(contours[i]), hull, true);int hullcount = (int)hull.size();// Save points of the convex hullfor (int j = 0; j < hullcount - 1; j++){//if(HoughCircle_detector(src) > 1){bool final_learn_result;if(currentFrameNumber <= totalFrameNumber / 20){//前面 5% 帧用来学习红绿灯位置final_learn_result = RGB_AI_learn_x_y(hull[j].x, hull[j].y);}else{if(final_learn_result == true){//学习有效,使用AI识别红绿灯if(hull[j].x >= RGB_learn_x-RGB_learn_w/2 && hull[j].x <= RGB_learn_x+RGB_learn_w/2 &&hull[j].y >= RGB_learn_y-RGB_learn_h/2 && hull[j].y <= RGB_learn_y+RGB_learn_h/2){//cout<<"AI success!"<<endl;tempNode.x = hull[j].x;tempNode.y = hull[j].y;cvSeqPush(pointSeq, &tempNode);}}else{if(hull[j].x >= 400 && hull[j].x <= 800 &&hull[j].y >= 400 && hull[j].y <= 550){tempNode.x = hull[j].x;tempNode.y = hull[j].y;cvSeqPush(pointSeq, &tempNode);}}}}}trackBox[i] = cvBoundingRect(pointSeq);}if (isFirstDetectedG){lastTrackBoxG = new Rect[contours.size()];for (int i = 0; i < contours.size(); i++)lastTrackBoxG[i] = trackBox[i];lastTrackNumG = contours.size();isFirstDetectedG = false;}else{for (int i = 0; i < contours.size(); i++){for (int j = 0; j < lastTrackNumG; j++){if (isIntersected(trackBox[i], lastTrackBoxG[j])){result[resultNum] = trackBox[i];break;}}resultNum++;}delete[] lastTrackBoxG;lastTrackBoxG = new Rect[contours.size()];for (int i = 0; i < contours.size(); i++){lastTrackBoxG[i] = trackBox[i];}lastTrackNumG = contours.size();}delete[] trackBox;}else{isFirstDetectedG = true;result = NULL;}cvReleaseMemStorage(&storage);if (result != NULL){for (int i = 0; i < resultNum; i++){area += result[i].area();}}delete[] result;return area;
}

这篇关于OpenCV 360度行车辅助系统——红绿灯智能预判的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641669

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识