Browse Source

Change background subtraction algorithm

fleischmannma75068
Mario Fleischmann 2 years ago
parent
commit
4b0d468c4f

+ 530
- 528
beerpong/beerpong.vcxproj
File diff suppressed because it is too large
View File


+ 1154
- 1148
beerpong/beerpong.vcxproj.filters
File diff suppressed because it is too large
View File


+ 30
- 0
beerpong/src/bpRecognizer.cpp View File

@@ -0,0 +1,30 @@
#include "bpRecognizer.h"


void bpRecognizer::update(ofxCvGrayscaleImage image, int video_width, int video_height) {
//subtracted.absDiff(image, background);

subtracted.allocate(video_width, video_height);
for (int i = 0; i < video_width * video_height; i++)
{
subtracted.getPixels()[i] = image.getPixels()[i] > background.getPixels()[i] + threshhold ? 255 : 0;
}
binarized = subtracted;
//binarized.threshold(threshhold);

contourFinder.findContours(
binarized,
10,
video_height * video_width / 10,
10,
true);
}

void bpRecognizer::setThreshhold(int threshhold) {
this->threshhold = threshhold;
}

void bpRecognizer::setBackground(ofxCvGrayscaleImage image) {
this->background = image;
}

+ 19
- 0
beerpong/src/bpRecognizer.h View File

@@ -0,0 +1,19 @@
#pragma once

#include "ofxOpenCv.h"

class bpRecognizer
{
public:
void update(ofxCvGrayscaleImage image, int video_width, int video_height);
void setThreshhold(int threshhold);
void setBackground(ofxCvGrayscaleImage image);

ofxCvGrayscaleImage currentImage;
ofxCvGrayscaleImage background;
ofxCvGrayscaleImage subtracted;
ofxCvGrayscaleImage binarized;
ofxCvContourFinder contourFinder;
int threshhold;
};


+ 28
- 22
beerpong/src/ofApp.cpp View File

@@ -1,11 +1,11 @@
#include "ofApp.h"

#define VIDEO_WIDTH 568
#define VIDEO_HEIGHT 320
#define VIDEO_WIDTH 360
#define VIDEO_HEIGHT 640

//--------------------------------------------------------------
void ofApp::setup(){
vidPlayer.load("beer.mkv"); // in /bin/data/
vidPlayer.load("video.mkv"); // in /bin/data/
vidPlayer.play();
vidPlayer.setLoopState(OF_LOOP_NORMAL);

@@ -23,25 +23,23 @@ void ofApp::update(){

vidPlayer.update();
colorVideo.setFromPixels(vidPlayer.getPixels());

grayVideo = colorVideo; // Convert Color to Grayscale
//cvInRange();
//colorVideo.convertToGrayscalePlanarImage(red, 0);

if (learnBackground){
background = grayVideo;
recognizer.setBackground(grayVideo);
learnBackground = false;
}

// Background subtraction
binarized.absDiff(background, grayVideo);
// Binarization
binarized.threshold(threshhold);

contourFinder.findContours(
binarized,
10,
VIDEO_HEIGHT * VIDEO_WIDTH / 10,
10,
true);
recognizer.setThreshhold(threshhold);
recognizer.update(grayVideo, VIDEO_WIDTH, VIDEO_HEIGHT);

background = recognizer.background;
subtracted = recognizer.subtracted;
binarized = recognizer.binarized;
contourFinder = recognizer.contourFinder;
}

//--------------------------------------------------------------
@@ -50,12 +48,20 @@ 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);
subtracted.draw(60 + 2 * VIDEO_WIDTH, 20);
//binarized.draw(80 + 3 * VIDEO_WIDTH, 20);
//colorVideo.draw(20, 20);
//grayVideo.draw(40 + VIDEO_WIDTH, 20);
//background.draw(20, 40 + VIDEO_HEIGHT);
//binarized.draw(40 + VIDEO_WIDTH, 40 + VIDEO_HEIGHT);

//red.draw(40 + VIDEO_WIDTH, 20);
//green.draw(20, 40 + VIDEO_HEIGHT);
//blue.draw(40 + VIDEO_WIDTH, 40 + VIDEO_HEIGHT);

ofFill();
ofSetHexColor(0x333333);
ofDrawRectangle(40 + VIDEO_WIDTH, 60 + VIDEO_HEIGHT + VIDEO_HEIGHT, VIDEO_WIDTH, VIDEO_HEIGHT);
ofDrawRectangle(80 + 3 * VIDEO_WIDTH, 20, VIDEO_WIDTH, VIDEO_HEIGHT);
ofSetHexColor(0xffffff);

for (int i = 0; i < contourFinder.blobs.size(); i++) {
@@ -75,10 +81,10 @@ void ofApp::draw(){

if (aspect_ratio > 0.5 && aspect_ratio < 1.5)
{
blob.draw(40 + VIDEO_WIDTH, 60 + VIDEO_HEIGHT + VIDEO_HEIGHT);
blob.draw(80 + 3 * VIDEO_WIDTH, 20);
ofDrawBitmapString(sizeStr.str(),
contourFinder.blobs[i].boundingRect.getCenter().x + 40 + VIDEO_WIDTH,
contourFinder.blobs[i].boundingRect.getCenter().y + 60 + VIDEO_HEIGHT + VIDEO_HEIGHT);
contourFinder.blobs[i].boundingRect.getCenter().x + 80 + 3 * VIDEO_WIDTH,
contourFinder.blobs[i].boundingRect.getCenter().y + 20);
}
}


+ 7
- 0
beerpong/src/ofApp.h View File

@@ -3,6 +3,7 @@
#include "ofMain.h"
#include "ofxOpenCv.h"
#include "ofxGui.h"
#include "bpRecognizer.h"

class ofApp : public ofBaseApp{

@@ -28,8 +29,10 @@ class ofApp : public ofBaseApp{
// Images displaying original video
ofxCvColorImage colorVideo;
ofxCvGrayscaleImage grayVideo;
bpRecognizer recognizer;

ofxCvGrayscaleImage background;
ofxCvGrayscaleImage subtracted;
ofxCvGrayscaleImage binarized;

ofxCvContourFinder contourFinder;
@@ -39,4 +42,8 @@ class ofApp : public ofBaseApp{
ofxPanel gui;

ofParameter<int> threshhold;

ofxCvGrayscaleImage red;
ofxCvGrayscaleImage green;
ofxCvGrayscaleImage blue;
};

Loading…
Cancel
Save