Implement pixel counts.
This commit is contained in:
parent
dd7c1e8396
commit
236312f4a6
@ -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 InRightHalf(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<pos.y+size.y/2;
|
||||
}
|
||||
|
||||
void CalculatePixelCounts(int x,int y){
|
||||
uint8_t col=edges.at<uint8_t>(y,x);
|
||||
if(!col)return;
|
||||
if(x<upperLeft.x||x>lowerRight.x||y<upperLeft.y||y>lowerRight.y)return;
|
||||
overallPixelCount++;
|
||||
int neighborAmt=(x>0&&edges.at<uint8_t>(y,x-1))+(x<edges.cols-1&&edges.at<uint8_t>(y,x+1))+(y>0&&edges.at<uint8_t>(y-1,x))+(y<edges.rows-1&&edges.at<uint8_t>(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<edges.rows;y++){
|
||||
for(int x=0;x<edges.cols;x++){
|
||||
uint8_t col=edges.at<uint8_t>(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<edges.rows;y++){
|
||||
for(int x=0;x<edges.cols;x++){
|
||||
uint8_t col=edges.at<uint8_t>(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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user