Действительно ли возможно расширить класс динамично?

Вы можете группировать белые пиксели в соответствии с заданным предикатом, используя раздел . В этом случае ваш предикат может быть: группировать все белые пиксели, находящиеся в пределах заданного евклидова расстояния .

Затем вы можете вычислить ограничивающие поля для каждой группы, сохранить наибольшую ячейку (в RED ниже) и в конечном итоге увеличить его (в ЗЕЛЕНОМ ниже):

Код:

#include 
#include 
#include 

using namespace std;
using namespace cv;

int main()
{
    // Load the image 
    Mat3b img = imread("path_to_image", IMREAD_COLOR);

    // Convert to grayscale
    Mat1b gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    // Get binary mask (remove jpeg artifacts)
    gray = gray > 200;

    // Get all non black points
    vector pts;
    findNonZero(gray, pts);

    // Define the radius tolerance
    int th_distance = 50; // radius tolerance

    // Apply partition 
    // All pixels within the radius tolerance distance will belong to the same class (same label)
    vector labels;

    // With lambda function (require C++11)
    int th2 = th_distance * th_distance;
    int n_labels = partition(pts, labels, [th2](const Point& lhs, const Point& rhs) {
        return ((lhs.x - rhs.x)*(lhs.x - rhs.x) + (lhs.y - rhs.y)*(lhs.y - rhs.y)) < th2;
    });

    // You can save all points in the same class in a vector (one for each class), just like findContours
    vector> contours(n_labels);
    for (int i = 0; i < pts.size(); ++i)
    {
        contours[labels[i]].push_back(pts[i]);
    }

    // Get bounding boxes
    vector boxes;
    for (int i = 0; i < contours.size(); ++i)
    {
        Rect box = boundingRect(contours[i]);
        boxes.push_back(box);
    }

    // Get largest bounding box
    Rect largest_box = *max_element(boxes.begin(), boxes.end(), [](const Rect& lhs, const Rect& rhs) {
        return lhs.area() < rhs.area();
    });

    // Draw largest bounding box in RED
    Mat3b res = img.clone();
    rectangle(res, largest_box, Scalar(0, 0, 255));

    // Draw enlarged BOX in GREEN
    Rect enlarged_box = largest_box + Size(20,20);
    enlarged_box -= Point(10,10);

    rectangle(res, enlarged_box, Scalar(0, 255, 0));


    imshow("Result", res);
    waitKey();

    return 0;
}

26
задан Spot 8 October 2009 в 18:05
поделиться

5 ответов

Я не думаю, что возможно динамически расширять класс (однако, если я ошибаюсь, мне бы хотелось посмотреть, как это делается). Задумывались ли вы об использовании шаблона Composite ( http://en.wikipedia.org/wiki/Composite_pattern , http://devzone.zend.com/article/7 )? Вы можете динамически объединить другой класс (даже несколько классов - это часто используется как обходной путь для множественного наследования), чтобы «внедрить» методы / свойства вашего родительского класса в дочерний класс.

com / article / 7 )? Вы можете динамически объединить другой класс (даже несколько классов - это часто используется как обходной путь для множественного наследования), чтобы «внедрить» методы / свойства вашего родительского класса в дочерний класс.

com / article / 7 )? Вы можете динамически объединить другой класс (даже несколько классов - это часто используется как обходной путь для множественного наследования), чтобы «внедрить» методы / свойства вашего родительского класса в дочерний класс.

7
ответ дан 28 November 2019 в 07:02
поделиться

Да. Мне нравится ответ с eval, но многие люди боятся любого eval в своем коде, поэтому вот один без eval:

<?php //MyClass.php 
namespace my\namespace;
function get_dynamic_parent() {
    return 'any\other\namespace\ExtendedClass';// return what you need
}
class_alias(get_dynamic_parent(), 'my\namespace\DynamicParent');

class MyClass extends DynamicParent {}
5
ответ дан Pavel Bariev 15 October 2019 в 07:58
поделиться

Я решил свою проблему такого же типа. Первый параметр определяет исходное имя класса, а второй параметр определяет новое имя класса функции class_alias. Тогда мы можем использовать эту функцию в условиях if и else.

if(1==1){
  class_alias('A', 'C');
}
else{
  class_alias('B', 'C');
}

class Apple extends C{
      ...
}

Класс Apple распространяется на виртуальный класс «C», который может быть определен как класс «A» или «B» в зависимости от условия if и else.

Для получения дополнительной информации вы можете проверить эту ссылку https://www.php.net/manual/en/function.class-alias.php

2
ответ дан Bhavin Thummar 15 October 2019 в 07:58
поделиться

У меня есть такая простая идея, вы можете попробовать

class A {} 
class B {}
$dynamicClassName = "A";
eval("class DynamicParent extends $dynamicClassName {}");

class C extends DynamicParent{
   // extends success
   // Testing
   function __construct(){
        echo get_parent_class('DynamicParent'); exit; //A :)
   }
}
-1
ответ дан user3575760 15 October 2019 в 07:58
поделиться

Не могли бы вы просто использовать eval?

<?php
function dynamic_class_name() {
    if(time() % 60)
        return "Class_A";
    if(time() % 60 == 0)
        return "Class_B";
}
eval(
    "class MyRealClass extends " . dynamic_class_name() . " {" . 
    # some code string here, possibly read from a file
    . "}"
);
?>
4
ответ дан 28 November 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: