vector<Rect> GetHelmetRect(Mat src,Rect HogHeadRect) { ExpandRectDifSize(src,HogHeadRect,0,0); Mat HogHeadImg = src(HogHeadRect); // vector<Rect> helmet =DetectColorWithHSV(HogHeadImg,HelmetColor()); vector<Rect> helmet = DetectHelmet(HogHeadImg); vector<Rect> faces=GetFaceRect(src,HogHeadRect); for( int j=0; j<faces.size(); j++ ) { Rect hrc= faces[j]; hrc.y=faces[j].y-faces[j].height*0.5; ExpandRectDifSize(src,hrc,0,0); Mat helmelFaceImg = src(hrc); // vector<Rect> helmelFaceRect =DetectColorWithHSV(helmelFaceImg,HelmetColor()); vector<Rect> helmelFaceRect =DetectHelmet(helmelFaceImg); for( int k=0; k<helmelFaceRect.size(); k++ ) { helmelFaceRect[k].x+=hrc.x; helmelFaceRect[k].y+=hrc.y; helmet.push_back(helmelFaceRect[k]); } } for(int m=0;m<helmet.size();m++) { helmet[m].x+=HogHeadRect.x; helmet[m].y+=HogHeadRect.y; } return helmet; }
void CExampleDemoDlg::OnBnClickedBtnNext() { SAFE_DELETE(m_pOrignImage); //当要按下个按钮的时候,保存上一张图片的选择结果到相应的文件夹中,移动新的图片,需要等到delete后,才能移动,否则无法访问 if (m_classifyid>=0) { CString classify_file; classify_file.Format("%d", m_classifyid); classify_file =classify_file+"\\"+ CString(m_imagefilename.back().c_str()); CString imgpath = m_imagefilepathname.back().c_str(); MoveFile(imgpath, classify_file); //MoveFile("0.jpg", "t.jpg"); m_imagefilepathname.pop_back(); m_imagefilename.pop_back(); ((CButton *)GetDlgItem(IDC_GROUP_BUTTON+ m_classifyid))->SetCheck(FALSE); m_classifyid = -1; } if (m_imagefilepathname.empty()) { AfxMessageBox("当前文件已挑选完毕,请重新选择新的文件夹"); m_classifyid = -1; return; } string strFoo = m_imagefilepathname.back(); m_pOrignImage = ReadBitmap(strFoo); if (!GetFaceRect(m_pOrignImage)) { m_classifyid = 19; SAFE_DELETE(m_pOrignImage); OnBnClickedBtnNext(); //remove(szName); //m_imagefilepathname.pop_back(); //m_imagefilename.pop_back(); } //SAFE_DELETE(pInImage); this->Invalidate(FALSE); }
Rect GetSmokeResult(Mat &src,Rect PedestrianRect,vector<Rect> helmetRectFirst) { CvRNG rng; rng= cvRNG(cvGetTickCount()); Rect HogHeadRect; vector<Rect> smokeRect; for(int j=0;j<helmetRectFirst.size();j++) { if(helmetRectFirst[j].width<10||helmetRectFirst[j].height<10) { continue; }else{ HogHeadRect =GetHeadRect(helmetRectFirst[j]); vector<Rect> faces=GetFaceRect(src,HogHeadRect); for(int k=0;k<faces.size();k++) { // smokeRect = GetSmokeRect(src,faces[k]); //检测人脸,并识别名字 ExpandRectDifSize(src,faces[k],0,0); Mat faceImg = src(faces[k]); smokeRect = GetSmokeRect(faceImg,faces[k]); if(smokeRect.size()>0) { rectangle(src,PedestrianRect,CV_RGB(255,0,0),3); string smokestr ="someone is smoking"; // putText(src, smokestr, Point(faces[k].x+faces[k].width,faces[k].y+faces[k].height), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 3); // imwrite("D://Error//"+to_string((long double)rng)+"smokeError.jpg",src); return PedestrianRect; } } } } return Rect(0,0,0,0); }
/*ExpandRectDifSize(src,FaceRect,FaceRect.width*0.1,FaceRect.height*0.1); Mat faceImg = src(FaceRect);*/ smokeRect =DetectSmoke(faceImg); for(int i=0;i<smokeRect.size();i++) { smokeRect[i].x+=FaceRect.x; smokeRect[i].y+=FaceRect.y; } return smokeRect; } Rect GetSmokeResult(Mat &src,Rect PedestrianRect,vector<Rect> helmetRectFirst) { CvRNG rng; rng= cvRNG(cvGetTickCount()); Rect HogHeadRect; vector<Rect> smokeRect; for(int j=0;j<helmetRectFirst.size();j++) { if(helmetRectFirst[j].width<10||helmetRectFirst[j].height<10) { continue; }else{ HogHeadRect =GetHeadRect(helmetRectFirst[j]); vector<Rect> faces=GetFaceRect(src,HogHeadRect); for(int k=0;k<faces.size();k++) { // smokeRect = GetSmokeRect(src,faces[k]); //检测人脸,并识别名字 ExpandRectDifSize(src,faces[k],0,0); Mat faceImg = src(faces[k]); smokeRect = GetSmokeRect(faceImg,faces[k]); if(smokeRect.size()>0) { rectangle(src,PedestrianRect,CV_RGB(255,0,0),3); string smokestr ="someone is smoking"; // putText(src, smokestr, Point(faces[k].x+faces[k].width,faces[k].y+faces[k].height), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 3); // imwrite("D://Error//"+to_string((long double)rng)+"smokeError.jpg",src); return PedestrianRect; } } } } return Rect(0,0,0,0); } //************************************ //* 输入:输入5帧的Mat图像,第一帧和最后一帧相差50 //* 输出:未带安全帽的人形坐标位置:noHelmetPedestrianRect //* 未系好安全带的人形坐标位子: //* 吸烟的人形坐标位置:smokePedestrianRect //* 马甲人员是否到位:ClassDetectionResult(true:到位(不报警);false:不到位(报警)) //*************************************/ void DetectConstructionSite(vector<Mat> orgMat,vector<Rect> &noHelmetPedestrianRect,vector<Rect> &smokePedestrianRect,bool &ClassDetectionResult,vector<Rect> &noBeltPedestrianRect) { CvRNG rng; rng= cvRNG(cvGetTickCount()); vector<Rect> PedestrianRect; vector<Rect> helmetRect; vector<Rect> smokeRect; vector<Rect> helmetBeltRect; vector<Rect> supervisorRectPerMat; Rect HogHeadRect; Mat src = orgMat[0]; PedestrianRect = GetCoilRegionPeople(src); for(int i=0;i<PedestrianRect.size();i++) { HogHeadRect=GetHeadRect(PedestrianRect[i]); helmetRect=GetHelmetRect(src,HogHeadRect); vector<Rect> faces=GetFaceRect(src,HogHeadRect); //检测到未系安全带 helmetBeltRect = DetectHelmetBelt(faces,src); if(helmetBeltRect.size()>0) { noBeltPedestrianRect.push_back(PedestrianRect[i]); } for(int j=0;j<faces.size();j++) { //检测到吸烟 smokeRect = GetSmokeRect(src,faces[j]); smokePedestrianRect.push_back(PedestrianRect[i]); } //未检测到安全帽 if(helmetRect.size()==0) { noHelmetPedestrianRect.push_back(PedestrianRect[i]); } //检测是否穿了马甲 int isOn = DetectSupervisorClass(PedestrianRect[i],src); if(isOn==1) { supervisorRectPerMat.push_back(PedestrianRect[i]); } } vector<Rect> supervisorPedRect; for(int k =1;k<orgMat.size();k++) { supervisorPedRect = GetCoilRegionPeople(orgMat[k]); for(int s =0;s<supervisorPedRect.size();s++) { int isOn1 = DetectSupervisorClass(supervisorPedRect[s],orgMat[k]);//Bug点 if(isOn1==1) { for(int w =0;w<supervisorRectPerMat.size();w++) { if(abs(supervisorRectPerMat[w].x-supervisorPedRect[s].x)>20&&abs(supervisorRectPerMat[w].y-supervisorPedRect[s].y)>20) { supervisorRectPerMat.push_back(supervisorPedRect[s]); } } } } } if(supervisorRectPerMat.size()>=1) { ClassDetectionResult = true; } else { ClassDetectionResult = false; } }