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:
parent
46c5a08025
commit
801d1e8694
9 changed files with 218 additions and 90 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue