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"
|
#include "ofApp.h"
|
||||||
|
|
||||||
#define VIDEO_WIDTH 568
|
#define VIDEO_WIDTH 360
|
||||||
#define VIDEO_HEIGHT 320
|
#define VIDEO_HEIGHT 640
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
void ofApp::setup(){
|
void ofApp::setup(){
|
||||||
vidPlayer.load("beer.mkv"); // in /bin/data/
|
vidPlayer.load("video.mkv"); // in /bin/data/
|
||||||
vidPlayer.play();
|
vidPlayer.play();
|
||||||
vidPlayer.setLoopState(OF_LOOP_NORMAL);
|
vidPlayer.setLoopState(OF_LOOP_NORMAL);
|
||||||
|
|
||||||
@ -23,25 +23,23 @@ void ofApp::update(){
|
|||||||
|
|
||||||
vidPlayer.update();
|
vidPlayer.update();
|
||||||
colorVideo.setFromPixels(vidPlayer.getPixels());
|
colorVideo.setFromPixels(vidPlayer.getPixels());
|
||||||
|
|
||||||
grayVideo = colorVideo; // Convert Color to Grayscale
|
grayVideo = colorVideo; // Convert Color to Grayscale
|
||||||
|
|
||||||
|
//cvInRange();
|
||||||
|
//colorVideo.convertToGrayscalePlanarImage(red, 0);
|
||||||
|
|
||||||
if (learnBackground){
|
if (learnBackground){
|
||||||
background = grayVideo;
|
recognizer.setBackground(grayVideo);
|
||||||
learnBackground = false;
|
learnBackground = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Background subtraction
|
recognizer.setThreshhold(threshhold);
|
||||||
binarized.absDiff(background, grayVideo);
|
recognizer.update(grayVideo, VIDEO_WIDTH, VIDEO_HEIGHT);
|
||||||
// Binarization
|
|
||||||
binarized.threshold(threshhold);
|
|
||||||
|
|
||||||
contourFinder.findContours(
|
background = recognizer.background;
|
||||||
binarized,
|
subtracted = recognizer.subtracted;
|
||||||
10,
|
binarized = recognizer.binarized;
|
||||||
VIDEO_HEIGHT * VIDEO_WIDTH / 10,
|
contourFinder = recognizer.contourFinder;
|
||||||
10,
|
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
@ -50,12 +48,20 @@ void ofApp::draw(){
|
|||||||
ofSetHexColor(0xffffff);
|
ofSetHexColor(0xffffff);
|
||||||
colorVideo.draw(20, 20);
|
colorVideo.draw(20, 20);
|
||||||
grayVideo.draw(40 + VIDEO_WIDTH, 20);
|
grayVideo.draw(40 + VIDEO_WIDTH, 20);
|
||||||
background.draw(20, 40 + VIDEO_HEIGHT);
|
subtracted.draw(60 + 2 * VIDEO_WIDTH, 20);
|
||||||
binarized.draw(40 + VIDEO_WIDTH, 40 + VIDEO_HEIGHT);
|
//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();
|
ofFill();
|
||||||
ofSetHexColor(0x333333);
|
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);
|
ofSetHexColor(0xffffff);
|
||||||
|
|
||||||
for (int i = 0; i < contourFinder.blobs.size(); i++) {
|
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)
|
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(),
|
ofDrawBitmapString(sizeStr.str(),
|
||||||
contourFinder.blobs[i].boundingRect.getCenter().x + 40 + VIDEO_WIDTH,
|
contourFinder.blobs[i].boundingRect.getCenter().x + 80 + 3 * VIDEO_WIDTH,
|
||||||
contourFinder.blobs[i].boundingRect.getCenter().y + 60 + VIDEO_HEIGHT + VIDEO_HEIGHT);
|
contourFinder.blobs[i].boundingRect.getCenter().y + 20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ofMain.h"
|
#include "ofMain.h"
|
||||||
#include "ofxOpenCv.h"
|
#include "ofxOpenCv.h"
|
||||||
#include "ofxGui.h"
|
#include "ofxGui.h"
|
||||||
|
#include "bpRecognizer.h"
|
||||||
|
|
||||||
class ofApp : public ofBaseApp{
|
class ofApp : public ofBaseApp{
|
||||||
|
|
||||||
@ -28,8 +29,10 @@ class ofApp : public ofBaseApp{
|
|||||||
// Images displaying original video
|
// Images displaying original video
|
||||||
ofxCvColorImage colorVideo;
|
ofxCvColorImage colorVideo;
|
||||||
ofxCvGrayscaleImage grayVideo;
|
ofxCvGrayscaleImage grayVideo;
|
||||||
|
bpRecognizer recognizer;
|
||||||
|
|
||||||
ofxCvGrayscaleImage background;
|
ofxCvGrayscaleImage background;
|
||||||
|
ofxCvGrayscaleImage subtracted;
|
||||||
ofxCvGrayscaleImage binarized;
|
ofxCvGrayscaleImage binarized;
|
||||||
|
|
||||||
ofxCvContourFinder contourFinder;
|
ofxCvContourFinder contourFinder;
|
||||||
@ -39,4 +42,8 @@ class ofApp : public ofBaseApp{
|
|||||||
ofxPanel gui;
|
ofxPanel gui;
|
||||||
|
|
||||||
ofParameter<int> threshhold;
|
ofParameter<int> threshhold;
|
||||||
|
|
||||||
|
ofxCvGrayscaleImage red;
|
||||||
|
ofxCvGrayscaleImage green;
|
||||||
|
ofxCvGrayscaleImage blue;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user