Использование shared_ptr / cv :: Ptr в качестве пользовательских данных в обратных вызовах в OpenCV - PullRequest
0 голосов
/ 01 ноября 2018

Я отслеживаю щелчки мыши внутри окна отображения OpenCV с помощью:

void on_buttonClick(int event, int x, int y, int flags, void* userdata) 
{
    // Callback function received
}

void main() {
    cv::setMouseCallback(win_name, on_buttonClick, (void*) fun_ptr);
}

Последний параметр fun_ptr возвращается как часть user_data в обратном вызове. И это нормально, если я хочу использовать указатели функций для пользовательских данных.

Но теперь мне нужно вместо этого передать что-то, эквивалентное std::shared_ptr<CustomClass>, как часть user_data. Причина, по которой я хочу передать shared_ptr, заключается в том, что объект автоматически уничтожается всякий раз, когда обновляется контекст окна отображения.

Я пытался использовать два механизма:
- std :: shared_ptr
- cv :: Ptr (По функциональности похож на std :: shared_ptr)

Пример кода ниже:

class CustomClass {
    int x;
    int y;
}

int main() {
    cv::Ptr<CustomClass> x(new CustomClass());
    cv::setMouseCallback(win_name, on_buttonClick, (void*) x);
}

Но shared_ptr потеряет свою цель, как только я приведу его к (void *). Есть ли способ решить эту проблему в OpenCV (на самом деле, использование типичных new, delete не было бы хорошо, так как время для удаления не может быть установлено).

...