149 lines
3.7 KiB
C++
149 lines
3.7 KiB
C++
#include "ofApp.h"
|
|
|
|
#define VIDEO_WIDTH 568
|
|
#define VIDEO_HEIGHT 320
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::setup(){
|
|
vidPlayer.load("beer.mkv"); // in /bin/data/
|
|
vidPlayer.play();
|
|
vidPlayer.setLoopState(OF_LOOP_NORMAL);
|
|
|
|
colorVideo.allocate(VIDEO_WIDTH, VIDEO_HEIGHT);
|
|
grayVideo.allocate(VIDEO_WIDTH, VIDEO_HEIGHT);
|
|
|
|
learnBackground = true;
|
|
|
|
gui.setup("Parameter");
|
|
gui.add(threshhold.set("Threshhold", 80, 0, 255));
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::update(){
|
|
|
|
vidPlayer.update();
|
|
colorVideo.setFromPixels(vidPlayer.getPixels());
|
|
|
|
grayVideo = colorVideo; // Convert Color to Grayscale
|
|
|
|
if (learnBackground){
|
|
background = grayVideo;
|
|
learnBackground = false;
|
|
}
|
|
|
|
// Background subtraction
|
|
binarized.absDiff(background, grayVideo);
|
|
// Binarization
|
|
binarized.threshold(threshhold);
|
|
|
|
contourFinder.findContours(
|
|
binarized,
|
|
10,
|
|
VIDEO_HEIGHT * VIDEO_WIDTH / 10,
|
|
10,
|
|
true);
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::draw(){
|
|
|
|
ofSetHexColor(0xffffff);
|
|
colorVideo.draw(20, 20);
|
|
grayVideo.draw(40 + VIDEO_WIDTH, 20);
|
|
background.draw(20, 40 + VIDEO_HEIGHT);
|
|
binarized.draw(40 + VIDEO_WIDTH, 40 + VIDEO_HEIGHT);
|
|
|
|
ofFill();
|
|
ofSetHexColor(0x333333);
|
|
ofDrawRectangle(40 + VIDEO_WIDTH, 60 + VIDEO_HEIGHT + VIDEO_HEIGHT, VIDEO_WIDTH, VIDEO_HEIGHT);
|
|
ofSetHexColor(0xffffff);
|
|
|
|
for (int i = 0; i < contourFinder.blobs.size(); i++) {
|
|
ofxCvBlob blob = contourFinder.blobs[i];
|
|
|
|
|
|
// draw over the centroid if the blob is a hole
|
|
ofSetColor(255);
|
|
|
|
// https://docs.opencv.org/master/d1/d32/tutorial_py_contour_properties.html
|
|
float aspect_ratio = blob.boundingRect.getWidth() / blob.boundingRect.getHeight();
|
|
|
|
stringstream sizeStr;
|
|
sizeStr << std::to_string(i) << ": " << std::to_string(contourFinder.blobs[i].area);
|
|
sizeStr << " | F=" << aspect_ratio;
|
|
|
|
|
|
if (aspect_ratio > 0.5 && aspect_ratio < 1.5)
|
|
{
|
|
blob.draw(40 + VIDEO_WIDTH, 60 + VIDEO_HEIGHT + VIDEO_HEIGHT);
|
|
ofDrawBitmapString(sizeStr.str(),
|
|
contourFinder.blobs[i].boundingRect.getCenter().x + 40 + VIDEO_WIDTH,
|
|
contourFinder.blobs[i].boundingRect.getCenter().y + 60 + VIDEO_HEIGHT + VIDEO_HEIGHT);
|
|
}
|
|
}
|
|
|
|
|
|
gui.draw();
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::keyPressed(int key){
|
|
if (key == '-') threshhold--;
|
|
else if (key == '+') threshhold++;
|
|
else if (key == ' ') learnBackground = true;
|
|
else if (key == '0') vidPlayer.setPaused(!vidPlayer.isPaused());
|
|
else if (key == OF_KEY_RIGHT) vidPlayer.nextFrame();
|
|
else if (key == OF_KEY_LEFT) vidPlayer.previousFrame();
|
|
else;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::keyReleased(int key){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::mouseMoved(int x, int y ){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::mouseDragged(int x, int y, int button){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::mousePressed(int x, int y, int button){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::mouseReleased(int x, int y, int button){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::mouseEntered(int x, int y){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::mouseExited(int x, int y){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::windowResized(int w, int h){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::gotMessage(ofMessage msg){
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void ofApp::dragEvent(ofDragInfo dragInfo){
|
|
|
|
}
|