int AverageColour_c(unsigned char *generalArray, void **args, unsigned int argsCount, unsigned int *argSize) { // total number of pixels pass onto us unsigned int arraySize = *(unsigned int*)args[0]; int i = 0, red = 0, green = 0, blue = 0; if( generalArray == 0) return -1; // iterate through colour values for(i = 54; i < arraySize;) { red += generalArray[i++]; green += generalArray[i++]; blue += generalArray[i++]; } // extract how many pixels were there in total int total = (arraySize - 54) / 3; // compute average value for each colour red /= total; green /= total; blue /= total; // convert into final Color value total = (blue << 16) | (green << 8) | red; return total; }It assumes that the data passed into it is Gadgeteer.Picture.PictureData byte array. This byte array has colour data starting at the 54th byte location and stores colour data as BGRBGRBGR bytes.
The total running time of the aforementioned RLP call is 214ms. The exact same code, encapsulated in a NETMF function call runs for a total of 16335ms. In other words, approximately 76 times faster. For a very simple piece of code.
The NET side of the code is pretty simple in itself:
RLP.Procedure AverageColour; // This method is run when the mainboard is powered up or reset. void ProgramStarted() { // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging. Debug.Print( "Program Started" ); InitializeRLP(); // setup Gadgeteer modules button.ButtonReleased += new Button.ButtonEventHandler( button_ButtonReleased ); camera.PictureCaptured += new Camera.PictureCapturedEventHandler( camera_PictureCaptured ); camera.DebugPrintEnabled = false; camera.CurrentPictureResolution = Camera.PictureResolution.Resolution320x240; } void InitializeRLP() { // personal unlock code RLP.Unlock( "...", new byte[] { ... } ); // fetch, load and initialize our RLP byte[] elf_file = Resources.GetBytes( Resources.BinaryResources.RLP_test ); RLP.LoadELF( elf_file ); RLP.InitializeBSSRegion( elf_file ); // extract the procedures AverageColour = RLP.GetProcedure( elf_file, "AverageColour_c" ); // dispose of the loaded binary data we no longer need elf_file = null; Debug.GC( true ); } void camera_PictureCaptured( Camera sender, GT.Picture picture ) { const int pixels = 320 * 240; int colour = AverageColour.InvokeEx( picture.PictureData, 54 + pixels * 3 ); Color average = (Color)colour; Debug.Print( "Average colour: Red - " + ColorUtility.GetRValue( average ) + " Green - " + ColorUtility.GetGValue( average ) + " Blue - " + ColorUtility.GetBValue( average ) ); } void button_ButtonReleased( Button sender, Button.ButtonState state ) { camera.TakePicture(); }
No comments:
Post a Comment