- 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<470
if (*it_Cr > 145 && *it_Cr < 470)
*it_Red = 255;
else
*it_Red = 0;
// GREEN 95<Cr<110
if (*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 contour
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()];
// Determine the area to track
for (int i = 0; i < contours.size(); i++)
{
cvClearSeq(pointSeq);
// Get the point set of the convex hull
convexHull(Mat(contours[i]), hull, true);
int hullcount = (int)hull.size();
// Save points of the convex hull
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 (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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292628.html
標籤:AI
上一篇:人工智能學習筆記----06
