mirror of
https://github.com/peterbraden/node-opencv.git
synced 2025-12-08 19:45:55 +00:00
WIP on TrackedObject re #22
This commit is contained in:
parent
a9717c7dc0
commit
e33afd97ef
@ -15,7 +15,7 @@ new cv.VideoCapture(0).read(function(mat){
|
|||||||
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
cv.readImage("./examples/stuff.png", function(err, im){
|
cv.readImage("./examples/stuff.png", function(err, im){
|
||||||
@ -32,3 +32,16 @@ cv.readImage("./examples/stuff.png", function(err, im){
|
|||||||
console.log(features)
|
console.log(features)
|
||||||
im.save('./out.jpg');
|
im.save('./out.jpg');
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
cv.readImage("./examples/stuff.png", function(err, im){
|
||||||
|
console.log("1")
|
||||||
|
var track = new cv.TrackedObject(im, [0,0,50,50]);
|
||||||
|
console.log("2")
|
||||||
|
console.log(track)
|
||||||
|
console.log("3")
|
||||||
|
console.log(track.track)
|
||||||
|
console.log("4")
|
||||||
|
console.log(track.track(im));
|
||||||
|
console.log("5")
|
||||||
|
})
|
||||||
|
|||||||
@ -16,8 +16,8 @@ TrackedObject::Init(Handle<Object> target) {
|
|||||||
// Prototype
|
// Prototype
|
||||||
//Local<ObjectTemplate> proto = constructor->PrototypeTemplate();
|
//Local<ObjectTemplate> proto = constructor->PrototypeTemplate();
|
||||||
|
|
||||||
target->Set(String::NewSymbol("TrackedObject"), constructor->GetFunction());
|
|
||||||
NODE_SET_PROTOTYPE_METHOD(constructor, "track", Track);
|
NODE_SET_PROTOTYPE_METHOD(constructor, "track", Track);
|
||||||
|
target->Set(String::NewSymbol("TrackedObject"), constructor->GetFunction());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -29,39 +29,49 @@ TrackedObject::New(const Arguments &args) {
|
|||||||
return v8::ThrowException(v8::Exception::TypeError(v8::String::New("Cannot Instantiate without new")));
|
return v8::ThrowException(v8::Exception::TypeError(v8::String::New("Cannot Instantiate without new")));
|
||||||
|
|
||||||
Matrix* m = ObjectWrap::Unwrap<Matrix>(args[0]->ToObject());
|
Matrix* m = ObjectWrap::Unwrap<Matrix>(args[0]->ToObject());
|
||||||
cv::Rect r;
|
cv::Rect r = cv::Rect(0, 0, 50, 50);
|
||||||
TrackedObject *to = new TrackedObject(m->mat, r);
|
TrackedObject *to = new TrackedObject(m->mat, r);
|
||||||
|
|
||||||
to->Wrap(args.This());
|
to->Wrap(args.This());
|
||||||
return args.This();
|
return args.This();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TrackedObject::TrackedObject(cv::Mat image, cv::Rect rect){
|
void update_hue_image(TrackedObject* t, cv::Mat image){
|
||||||
|
|
||||||
// Store HSV Hue Image
|
// Store HSV Hue Image
|
||||||
cv::cvtColor(image, hsv, CV_BGR2HSV); // convert to HSV space
|
cv::cvtColor(image, t->hsv, CV_BGR2HSV); // convert to HSV space
|
||||||
//mask out-of-range values
|
//mask out-of-range values
|
||||||
int vmin = 65, vmax = 256, smin = 55;
|
int vmin = 65, vmax = 256, smin = 55;
|
||||||
cv::inRange(hsv, //source
|
cv::inRange(t->hsv, //source
|
||||||
cv::Scalar(0, smin, MIN(vmin, vmax), 0), //lower bound
|
cv::Scalar(0, smin, MIN(vmin, vmax), 0), //lower bound
|
||||||
cv::Scalar(180, 256, MAX(vmin, vmax) ,0), //upper bound
|
cv::Scalar(180, 256, MAX(vmin, vmax) ,0), //upper bound
|
||||||
mask); //destination
|
t->mask); //destination
|
||||||
|
|
||||||
//extract the hue channel, split: src, dest channels
|
//extract the hue channel, split: src, dest channels
|
||||||
int from_to[] = { 0,0, 1,-1, 2,-1, 3,-1};
|
vector<cv::Mat> hsvplanes;
|
||||||
cv::mixChannels(&hsv, 1, &hue, 1, from_to, 4);
|
cv::split(t->hsv, hsvplanes);
|
||||||
|
t->hue = hsvplanes[0];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackedObject::TrackedObject(cv::Mat image, cv::Rect rect){
|
||||||
|
|
||||||
|
update_hue_image(this, image);
|
||||||
|
|
||||||
// Calculate Histogram
|
// Calculate Histogram
|
||||||
int hbins = 30, sbins = 32;
|
int hbins = 30, sbins = 32;
|
||||||
int histSizes[] = {hbins, sbins};
|
int histSizes[] = {hbins, sbins};
|
||||||
float hranges[] = { 0, 180 };
|
//float hranges[] = { 0, 180 };
|
||||||
// saturation varies from 0 (black-gray-white) to
|
// saturation varies from 0 (black-gray-white) to
|
||||||
// 255 (pure spectrum color)
|
// 255 (pure spectrum color)
|
||||||
float sranges[] = { 0, 256 };
|
float sranges[] = { 0, 256 };
|
||||||
const float* ranges[] = { hranges, sranges };
|
const float* ranges[] = { sranges };
|
||||||
|
|
||||||
cv::calcHist(&hue, 1, 0, mask, hist, 2, histSizes, ranges, true, false);
|
cv::calcHist(&hue, 1, 0, mask, hist, 1, histSizes, ranges, true, false);
|
||||||
|
|
||||||
|
|
||||||
|
prev_rect = rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -75,10 +85,17 @@ TrackedObject::Track(const v8::Arguments& args){
|
|||||||
return Undefined();
|
return Undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix *im = ObjectWrap::Unwrap<Matrix>(args[0]->ToObject());
|
|
||||||
|
|
||||||
|
Matrix *im = ObjectWrap::Unwrap<Matrix>(args[0]->ToObject());
|
||||||
cv::RotatedRect r;
|
cv::RotatedRect r;
|
||||||
|
|
||||||
|
update_hue_image(self, im->mat);
|
||||||
|
|
||||||
|
float sranges[] = { 0, 256 };
|
||||||
|
const float* ranges[] = { sranges };
|
||||||
|
int channel = 0;
|
||||||
|
cv::calcBackProject(&self->hue, 1, &channel, self->hist, self->prob, ranges);
|
||||||
|
|
||||||
r = cv::CamShift(self->prob, self->prev_rect,
|
r = cv::CamShift(self->prob, self->prev_rect,
|
||||||
cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1));
|
cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1));
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
#include "CascadeClassifierWrap.h"
|
#include "CascadeClassifierWrap.h"
|
||||||
#include "VideoCaptureWrap.h"
|
#include "VideoCaptureWrap.h"
|
||||||
#include "Contours.h"
|
#include "Contours.h"
|
||||||
|
#include "CamShift.h"
|
||||||
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
@ -15,6 +16,7 @@ init(Handle<Object> target) {
|
|||||||
CascadeClassifierWrap::Init(target);
|
CascadeClassifierWrap::Init(target);
|
||||||
VideoCaptureWrap::Init(target);
|
VideoCaptureWrap::Init(target);
|
||||||
Contour::Init(target);
|
Contour::Init(target);
|
||||||
|
TrackedObject::Init(target);
|
||||||
};
|
};
|
||||||
|
|
||||||
NODE_MODULE(opencv, init)
|
NODE_MODULE(opencv, init)
|
||||||
|
|||||||
25
test/unit.js
25
test/unit.js
@ -258,21 +258,26 @@ vows.describe('Smoke Tests OpenCV').addBatch({
|
|||||||
}
|
}
|
||||||
|
|
||||||
, "CamShift" : {
|
, "CamShift" : {
|
||||||
topic : require('../lib/opencv')
|
|
||||||
|
|
||||||
, "create TrackedObject" : function(cv){
|
"Can Create and Track" : {
|
||||||
var im = fs.readFileSync('./examples/mona.png')
|
topic : function(){
|
||||||
, track = new cv.TrackedObject(im, [10,10, 50,50]);
|
var cv = require('../lib/opencv')
|
||||||
|
, self = this
|
||||||
|
|
||||||
assert.ok(track);
|
var im = cv.readImage('./examples/mona.png', function(e, im){
|
||||||
|
self.callback(im, cv)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
, "use TrackedObject.track" : function(cv){
|
, "create TrackedObject" : function(im, cv){
|
||||||
var im = fs.readFileSync('./examples/mona.png')
|
var tracked = new cv.TrackedObject(im, [0, 0, 50, 50]);
|
||||||
, im2 = fs.readFileSync('./examples/mona.png')
|
assert.ok(tracked);
|
||||||
, tracked = new cv.TrackedObject(im, [10,10, 50,50]);
|
}
|
||||||
|
|
||||||
assert.equal(tracked.track(im2), [10, 10, 50, 50]);
|
, "use TrackedObject.track" : function(im,cv){
|
||||||
|
var tracked = new cv.TrackedObject(im, [0, 0, 50, 50]);
|
||||||
|
assert.equal(tracked.track(im), [10, 10, 50, 50]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user