1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

Added Dnn::Layer, more Ruby-ish code, etc.

This commit is contained in:
Francois Deschenes 2018-07-26 15:28:00 -07:00
parent 46c5a08025
commit 801d1e8694
9 changed files with 218 additions and 90 deletions

View file

@ -3,6 +3,7 @@
#include "opencv.hpp"
#include "mat.hpp"
#include "error.hpp"
#include "dnn_layer.hpp"
namespace rubyopencv {
namespace Dnn {
@ -36,7 +37,23 @@ namespace rubyopencv {
return TypedData_Wrap_Struct(klass, &opencv_net_type, ptr);
}
VALUE rb_initialize(VALUE self) {
VALUE rb_initialize(int argc, VALUE *argv, VALUE self) {
VALUE model, config, framework;
rb_scan_args(argc, argv, "03", &model, &config, &framework);
if (!NIL_P(model)) {
cv::dnn::Net* dataptr = NULL;
try {
cv::dnn::Net net = cv::dnn::readNet(StringValueCStr(model), CSTR_DEFAULT(config, ""), CSTR_DEFAULT(framework, ""));
cv::dnn::Net* dataptr = new cv::dnn::Net(net);
RTYPEDDATA_DATA(self) = dataptr;
} catch(cv::Exception& e) {
delete dataptr;
Error::raise(e);
}
}
return self;
}
@ -69,25 +86,16 @@ namespace rubyopencv {
rb_scan_args(argc, argv, "01", &output_name);
cv::dnn::Net* selfptr = obj2net(self);
cv::Mat* m = NULL;
try {
cv::Mat r;
if (NIL_P(output_name)) {
r = selfptr->forward();
} else {
r = selfptr->forward(StringValueCStr(output_name));
}
m = new cv::Mat(r);
m = new cv::Mat(selfptr->forward(CSTR_DEFAULT(output_name, "")));
} catch(cv::Exception& e) {
delete m;
Error::raise(e);
}
return Mat::mat2obj(m);
return Mat::rb_clone(Mat::mat2obj(m));
}
// bool empty() const
@ -96,34 +104,54 @@ namespace rubyopencv {
return selfptr->empty() ? Qtrue : Qfalse;
}
VALUE rb_get_layer_names(VALUE self) {
VALUE rb_get_layers(VALUE self) {
cv::dnn::Net* selfptr = obj2net(self);
std::vector<cv::String> v = selfptr->getLayerNames();
const long size = v.size();
VALUE layer_names = rb_ary_new_capa(size);
VALUE layers = rb_ary_new_capa(size);
for (long i = 0; i < size; i++) {
VALUE layer_name = rb_str_new_cstr(v[i].c_str());
rb_ary_store(layer_names, i, layer_name);
VALUE layer = Dnn::Layer::layer2obj(selfptr->getLayer(v[i]));
rb_ary_store(layers, i, layer);
}
return layer_names;
return layers;
}
VALUE rb_enable_fusion(VALUE self, VALUE fusion) {
cv::dnn::Net* selfptr = obj2net(self);
selfptr->enableFusion(RTEST(fusion) ? true : false);
return self;
}
VALUE rb_set_preferable_backend(VALUE self, VALUE backend_id) {
cv::dnn::Net* selfptr = obj2net(self);
selfptr->setPreferableBackend(NUM2INT(backend_id));
return self;
}
VALUE rb_set_preferable_target(VALUE self, VALUE target_id) {
cv::dnn::Net* selfptr = obj2net(self);
selfptr->setPreferableTarget(NUM2INT(target_id));
return self;
}
void init(VALUE rb_module) {
rb_klass = rb_define_class_under(rb_module, "Net", rb_cData);
rb_define_alloc_func(rb_klass, rb_allocate);
rb_define_private_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), 0);
rb_define_private_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
rb_define_method(rb_klass, "input=", RUBY_METHOD_FUNC(rb_set_input), -1);
rb_define_alias(rb_klass, "set_input", "input=");
rb_define_alias(rb_klass, "input", "input=");
rb_define_method(rb_klass, "fusion=", RUBY_METHOD_FUNC(rb_enable_fusion), 1);
rb_define_method(rb_klass, "preferable_backend=", RUBY_METHOD_FUNC(rb_set_preferable_backend), 1);
rb_define_method(rb_klass, "preferable_target=", RUBY_METHOD_FUNC(rb_set_preferable_target), 1);
rb_define_method(rb_klass, "forward", RUBY_METHOD_FUNC(rb_forward), -1);
rb_define_method(rb_klass, "empty?", RUBY_METHOD_FUNC(rb_empty), 0);
rb_define_method(rb_klass, "get_layer_names", RUBY_METHOD_FUNC(rb_get_layer_names), 0);
rb_define_method(rb_klass, "layers", RUBY_METHOD_FUNC(rb_get_layers), 0);
}
}
}