Change background subtraction algorithm
This commit is contained in:
parent
cdd4148156
commit
4b0d468c4f
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
30
beerpong/src/bpRecognizer.cpp
Normal file
30
beerpong/src/bpRecognizer.cpp
Normal 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
beerpong/src/bpRecognizer.h
Normal file
19
beerpong/src/bpRecognizer.h
Normal 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;
|
||||
};
|
||||
|
@ -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);
|
||||
recognizer.setThreshhold(threshhold);
|
||||
recognizer.update(grayVideo, VIDEO_WIDTH, VIDEO_HEIGHT);
|
||||
|
||||
contourFinder.findContours(
|
||||
binarized,
|
||||
10,
|
||||
VIDEO_HEIGHT * VIDEO_WIDTH / 10,
|
||||
10,
|
||||
true);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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…
x
Reference in New Issue
Block a user