private static MIL_INT HookHandler(MIL_INT HookType, MIL_ID EventId, IntPtr UserDataPtr) { // this is how to check if the user data is null, the IntPtr class // contains a member, Zero, which exists solely for this purpose if (!IntPtr.Zero.Equals(UserDataPtr)) { // get the handle to the DigHookUserData object back from the IntPtr GCHandle hUserData = GCHandle.FromIntPtr(UserDataPtr); // get a reference to the DigHookUserData object STestParameters DataStructure = hUserData.Target as STestParameters; // Check that the modified graphic is the rectangular region. MIL_INT ModifiedGraphicLabel = 0; MIL.MgraGetHookInfo(EventId, MIL.M_GRAPHIC_LABEL_VALUE, ref ModifiedGraphicLabel); if (ModifiedGraphicLabel == DataStructure.RegionLabel) { // Count objects and draw the corresponding annotations. CountObjects(DataStructure.MilDisplay, DataStructure.MilGraphicsList, DataStructure.MilGraphicsContext, DataStructure.MilBinImage, DataStructure.MilBlobFeatureList, DataStructure.MilBlobResult); } } return(MIL.M_NULL); }
private static void InteractivityExample(MIL_ID MilSystem, MIL_ID MilDisplay) { MIL_ID MilImage = MIL.M_NULL; // Image buffer identifier. MIL_ID MilGraphicsList = MIL.M_NULL; // Graphics list identifier. MIL_ID MilGraphicsContext = MIL.M_NULL; // Graphics context identifier. MIL_ID MilBinImage = MIL.M_NULL; // Binary image buffer identifier. MIL_ID MilBlobFeatureList = MIL.M_NULL; // Feature list identifier. MIL_ID MilBlobResult = MIL.M_NULL; // Blob result buffer identifier. MIL_INT SizeX = 0; // Size X of the source buffer. MIL_INT SizeY = 0; // Size Y of the source buffer. MIL_INT RegionLabel = 0; // Label value of the region. STestParameters DataStructure = new STestParameters(); // Hook function data structure. // Restore the source image. MIL.MbufRestore(IMAGE_FILE, MilSystem, ref MilImage); // Display the buffer. MIL.MdispSelect(MilDisplay, MilImage); // Allocate a graphics list to hold the subpixel annotations. MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref MilGraphicsList); // Associate the graphics list to the display for annotations. MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, MilGraphicsList); // Allocate a graphics context for the draw operations. MIL.MgraAlloc(MilSystem, ref MilGraphicsContext); // Enable the interactive mode. MIL.MdispControl(MilDisplay, MIL.M_GRAPHIC_LIST_INTERACTIVE, MIL.M_ENABLE); // Add a selectable rectangular region. MIL.MgraRectAngle(MilGraphicsContext, MilGraphicsList, RECTANGLE_POSITION_X, RECTANGLE_POSITION_Y, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, RECTANGLE_ANGLE, MIL.M_CENTER_AND_DIMENSION); // Retrieve the label of the rectangle graphic. MIL.MgraInquireList(MilGraphicsList, MIL.M_LIST, MIL.M_DEFAULT, MIL.M_LAST_LABEL, ref RegionLabel); // Disable the selectable mode for the next annotations to the graphics list. MIL.MgraControl(MilGraphicsContext, MIL.M_SELECTABLE, MIL.M_DISABLE); // Allocate a binary image buffer for fast processing. MIL.MbufInquire(MilImage, MIL.M_SIZE_X, ref SizeX); MIL.MbufInquire(MilImage, MIL.M_SIZE_Y, ref SizeY); MIL.MbufAlloc2d(MilSystem, SizeX, SizeY, 1 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, ref MilBinImage); // Binarize the source image. MIL.MimBinarize(MilImage, MilBinImage, MIL.M_FIXED + MIL.M_LESS, IMAGE_THRESHOLD_VALUE, MIL.M_NULL); // Allocate a blob feature list and a blob result. MIL.MblobAllocFeatureList(MilSystem, ref MilBlobFeatureList); MIL.MblobAllocResult(MilSystem, ref MilBlobResult); // Select the blob features to calculate (Center Of Gravity and Box). MIL.MblobSelectFeature(MilBlobFeatureList, MIL.M_CENTER_OF_GRAVITY); MIL.MblobSelectFeature(MilBlobFeatureList, MIL.M_BOX); // Programmatically initialize the selected state of the rectangle region. MIL.MgraControlList(MilGraphicsList, MIL.M_GRAPHIC_LABEL(RegionLabel), MIL.M_DEFAULT, MIL.M_GRAPHIC_SELECTED, MIL.M_TRUE); // Perform and display a first count of the number of objects // within the initial region. CountObjects(MilDisplay, MilGraphicsList, MilGraphicsContext, MilBinImage, MilBlobFeatureList, MilBlobResult); // Initialize the hook data structure, then associate the hook function to // the "MIL.M_GRAPHIC_MODIFIED" event. The hook function will be called // with any region interaction by the user. DataStructure.MilDisplay = MilDisplay; DataStructure.MilGraphicsList = MilGraphicsList; DataStructure.MilGraphicsContext = MilGraphicsContext; DataStructure.MilBinImage = MilBinImage; DataStructure.RegionLabel = RegionLabel; DataStructure.MilBlobFeatureList = MilBlobFeatureList; DataStructure.MilBlobResult = MilBlobResult; GCHandle DataStructureHandle = GCHandle.Alloc(DataStructure); MIL_GRA_HOOK_FUNCTION_PTR HookHandlerDelegate = new MIL_GRA_HOOK_FUNCTION_PTR(HookHandler); MIL.MgraHookFunction(MilGraphicsList, MIL.M_GRAPHIC_MODIFIED, HookHandlerDelegate, GCHandle.ToIntPtr(DataStructureHandle)); if (MIL.MdispInquire(MilDisplay, MIL.M_DISPLAY_TYPE, MIL.M_NULL) != MIL.M_AUXILIARY) { Console.WriteLine("You can try using your mouse to interactively modify the"); Console.WriteLine("displayed region, such as moving, resizing, or rotating the"); Console.WriteLine("region. If you do so, the results and annotations will be"); Console.WriteLine("immediately updated\n"); Console.WriteLine(); } else { Console.WriteLine("***NOTE: This example does not implement the interactivity"); Console.WriteLine(" with an auxiliary display."); Console.WriteLine(); } Console.WriteLine("Press <Enter> to exit."); Console.ReadKey(); MIL.MgraHookFunction(MilGraphicsList, MIL.M_GRAPHIC_MODIFIED + MIL.M_UNHOOK, HookHandlerDelegate, GCHandle.ToIntPtr(DataStructureHandle)); DataStructureHandle.Free(); // Free all allocations. MIL.MblobFree(MilBlobResult); MIL.MblobFree(MilBlobFeatureList); MIL.MbufFree(MilBinImage); MIL.MgraFree(MilGraphicsContext); MIL.MgraFree(MilGraphicsList); MIL.MbufFree(MilImage); }