1 | initial version |
After another day on Google I managed to figure out how to use a form's member function as a callback in openCV. This involves declaring a delegate function and using System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate to generate a pointer. This is a sufficiently obscure procedure that I will detail exactly what I did below ( based on the information here).
First, I added the following members to my form class, called frmImaging:
//Delegate handling for track bar
public: delegate void ChangeThresholdDelegate(int Th, void *param);
public: ChangeThresholdDelegate^ ChangeThresholdDelegateInstance;
public: cv::TrackbarCallback ChangeThresholdCallbackPointer;
private: System::Void ChangeThreshold(int Threshold, void *param);//The callback function I want to use
I then added the following code to the form constructor:
ChangeThresholdDelegateInstance = gcnew ChangeThresholdDelegate(this, &frmImaging::ChangeThreshold);
IntPtr delegatePointer = System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(ChangeThresholdDelegateInstance);
ChangeThresholdCallbackPointer = reinterpret_cast<cv::TrackbarCallback>(delegatePointer.ToPointer());
and then I can create a trackbar with frmImaging->ChangeThreshold(int Th, void *param) as the callback function:
createTrackbar("Histogram threshold", "histogram", &Threshold, hbins, ChangeThresholdCallbackPointer,NULL);//
This procedure allows the trackbar callback to interact with members of a Visual C++ CLI form.
I would still be interested in knowing if there is a more straightforward method.
guy