Вы можете группировать белые пиксели в соответствии с заданным предикатом, используя раздел . В этом случае ваш предикат может быть: группировать все белые пиксели, находящиеся в пределах заданного евклидова расстояния .
Затем вы можете вычислить ограничивающие поля для каждой группы, сохранить наибольшую ячейку (в 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;
}
Я не думаю, что возможно динамически расширять класс (однако, если я ошибаюсь, мне бы хотелось посмотреть, как это делается). Задумывались ли вы об использовании шаблона Composite ( http://en.wikipedia.org/wiki/Composite_pattern , http://devzone.zend.com/article/7 )? Вы можете динамически объединить другой класс (даже несколько классов - это часто используется как обходной путь для множественного наследования), чтобы «внедрить» методы / свойства вашего родительского класса в дочерний класс.
com / article / 7 )? Вы можете динамически объединить другой класс (даже несколько классов - это часто используется как обходной путь для множественного наследования), чтобы «внедрить» методы / свойства вашего родительского класса в дочерний класс. com / article / 7 )? Вы можете динамически объединить другой класс (даже несколько классов - это часто используется как обходной путь для множественного наследования), чтобы «внедрить» методы / свойства вашего родительского класса в дочерний класс.Да. Мне нравится ответ с 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 {}
Я решил свою проблему такого же типа. Первый параметр определяет исходное имя класса, а второй параметр определяет новое имя класса функции 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
У меня есть такая простая идея, вы можете попробовать
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 :)
}
}
Не могли бы вы просто использовать 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
. "}"
);
?>