diff --git a/OpenCVVideoParser/main.cpp b/OpenCVVideoParser/main.cpp index 6b62b8e..1fc3bc4 100644 --- a/OpenCVVideoParser/main.cpp +++ b/OpenCVVideoParser/main.cpp @@ -78,7 +78,14 @@ public: sAppName = "Example"; } + enum Mode{ + SongSelect, + Playing, + ScoreScreen + }; + public: + Mode mode=SongSelect; cv::Mat edges; float frameView=0; cv::VideoCapture video; // open the video file @@ -115,27 +122,107 @@ public: FillRectDecal(pos+vf2d{0,size.y/2},size/2,{255,255,0,64}); FillRectDecal(pos+size/2,size/2,{0,255,0,64}); vf2d fontSize={2,2}; + DrawStringDecal(pos+vf2d{2,2},std::to_string(upperLeftPixelCount)+"/"+std::to_string(upperLeftDensity),BLACK,fontSize); DrawStringDecal(pos+vf2d{1,1},std::to_string(upperLeftPixelCount)+"/"+std::to_string(upperLeftDensity),WHITE,fontSize); + DrawStringDecal(pos+vf2d{size.x/2+2,2},std::to_string(upperRightPixelCount)+"/"+std::to_string(upperRightDensity),BLACK,fontSize); DrawStringDecal(pos+vf2d{size.x/2+1,1},std::to_string(upperRightPixelCount)+"/"+std::to_string(upperRightDensity),WHITE,fontSize); + DrawStringDecal(pos+vf2d{2,size.y/2+2},std::to_string(lowerLeftPixelCount)+"/"+std::to_string(lowerLeftDensity),BLACK,fontSize); DrawStringDecal(pos+vf2d{1,size.y/2+1},std::to_string(lowerLeftPixelCount)+"/"+std::to_string(lowerLeftDensity),WHITE,fontSize); + DrawStringDecal(pos+size/2+vf2d{2,2},std::to_string(lowerRightPixelCount)+"/"+std::to_string(lowerRightDensity),BLACK,fontSize); DrawStringDecal(pos+size/2+vf2d{1,1},std::to_string(lowerRightPixelCount)+"/"+std::to_string(lowerRightDensity),WHITE,fontSize); std::string leftDisplayStr=std::to_string(leftPixelCount)+"/"+std::to_string(leftDensity); + DrawStringDecal(pos+vf2d{2+size.x/4,2+size.y+16}-GetTextSize(leftDisplayStr)*fontSize/2,leftDisplayStr,BLACK,fontSize); DrawStringDecal(pos+vf2d{1+size.x/4,1+size.y+16}-GetTextSize(leftDisplayStr)*fontSize/2,leftDisplayStr,WHITE,fontSize); std::string rightDisplayStr=std::to_string(rightPixelCount)+"/"+std::to_string(rightDensity); + DrawStringDecal(pos+vf2d{2+size.x*0.75f,2+size.y+16}-GetTextSize(rightDisplayStr)*fontSize/2,rightDisplayStr,BLACK,fontSize); DrawStringDecal(pos+vf2d{1+size.x*0.75f,1+size.y+16}-GetTextSize(rightDisplayStr)*fontSize/2,rightDisplayStr,WHITE,fontSize); std::string centerDisplayStr=std::to_string(overallPixelCount)+"/"+std::to_string(overallDensity); + DrawStringDecal(pos+vf2d{2+size.x/2,2+size.y+48}-GetTextSize(centerDisplayStr)*fontSize/2,centerDisplayStr,BLACK,fontSize); DrawStringDecal(pos+vf2d{1+size.x/2,1+size.y+48}-GetTextSize(centerDisplayStr)*fontSize/2,centerDisplayStr,WHITE,fontSize); } + bool InLeftHalf(int x,int y){ + vf2d pos=upperLeft; + vf2d size=lowerRight-upperLeft; + return x=pos.x+size.x/2; + } + + bool InTopHalf(int x,int y){ + vf2d pos=upperLeft; + vf2d size=lowerRight-upperLeft; + return y(y,x); + if(!col)return; + if(xlowerRight.x||ylowerRight.y)return; + overallPixelCount++; + int neighborAmt=(x>0&&edges.at(y,x-1))+(x(y,x+1))+(y>0&&edges.at(y-1,x))+(y(y+1,x)); + overallDensity+=neighborAmt; + + if(InLeftHalf(x,y)){ + leftPixelCount++; + leftDensity+=neighborAmt; + if(InTopHalf(x,y)){ + upperLeftPixelCount++; + upperLeftDensity+=neighborAmt; + }else{ + lowerLeftPixelCount++; + lowerLeftDensity+=neighborAmt; + } + } + if(InRightHalf(x,y)){ + rightPixelCount++; + rightDensity+=neighborAmt; + if(InTopHalf(x,y)){ + upperRightPixelCount++; + upperRightDensity+=neighborAmt; + }else{ + lowerRightPixelCount++; + lowerRightDensity+=neighborAmt; + } + } + } + + void UpdateCounts(){ + if(!edgeDetect)return; + overallDensity=overallPixelCount=leftDensity=leftPixelCount=rightDensity= + rightPixelCount=lowerLeftDensity=lowerLeftPixelCount=upperLeftDensity= + upperLeftPixelCount=lowerRightDensity=lowerRightPixelCount=upperRightDensity= + upperRightPixelCount=0; + for(int y=0;y(y,x); + if(col){ + CalculatePixelCounts(x,y); + } + } + } + }; + void UpdateScreen(){ Clear(BLACK); + overallDensity=overallPixelCount=leftDensity=leftPixelCount=rightDensity= + rightPixelCount=lowerLeftDensity=lowerLeftPixelCount=upperLeftDensity= + upperLeftPixelCount=lowerRightDensity=lowerRightPixelCount=upperRightDensity= + upperRightPixelCount=0; cv::Mat targetFrame=get_frame(video,std::clamp(int(frameView),0,int(video.get(cv::CAP_PROP_FRAME_COUNT)))); if(edgeDetect){ cv::Canny(targetFrame,edges,edgeLowerThreshold,edgeUpperThreshold); for(int y=0;y(y,x); - Draw(x,y,{col,col,col}); + if(col){ + //Draw(x,y,{col,col,col}); + CalculatePixelCounts(x,y); + } } } }else{ @@ -159,7 +246,7 @@ public: UpdateScreen(); } if(GetKey(RIGHT).bHeld){ - frameView+=fElapsedTime*60; + frameView+=1; UpdateScreen(); } if(GetKey(LEFT).bPressed){ @@ -167,7 +254,7 @@ public: UpdateScreen(); } if(GetKey(LEFT).bHeld){ - frameView-=fElapsedTime*60; + frameView-=1; UpdateScreen(); } if(!cabDetected){ @@ -184,9 +271,11 @@ public: } if(GetMouse(Mouse::LEFT).bHeld){ lowerRight=GetMousePos(); + UpdateCounts(); } if(GetMouse(Mouse::LEFT).bReleased){ dragging=false; + UpdateCounts(); } if(GetKey(HOME).bPressed){ edgeDetect=!edgeDetect;